Android Plugin DSL Reference 参考文档 :
在 自定义 Gradle 插件 的 Extension 扩展 中 , 可以定义方法 , 定义的方法可以带参数 , 也可以不带参数 ;
代码示例如下 :
class MyPluginExtensions {
def name
def age
// 在扩展中定义方法
def extensionFun() {
println 'MyPluginExtensions extensionFun'
}
// 在扩展中定义 带参数的方法
def extensionFun(String str) {
println 'MyPluginExtensions extensionFun : ' + str
}
}
在自定义插件中 , 关联该扩展 :
// 创建一个扩展
// 类似于 Android Gradle 插件中的 android
// 引入了 MyPlugin 插件后
// 就可以使用 myplugin 配置块
def myplugin = project.extensions.create("myplugin", MyPluginExtensions)
在 build.gradle 中引入插件 , 并调用该扩展中的方法 :
apply plugin: MyPlugin
myplugin {
name 'Tom'
age 18
// 调用在扩展中定义的方法
// 打印 'MyPluginExtensions extensionFun'
extensionFun()
// 调用 扩展中 带参数的方法
extensionFun 'Hello'
mypluginextension {
name 'Jerry'
age 19
}
}
最终的执行结果如下 :
extensionFun
函数 , 打印 MyPluginExtensions extensionFun
;extensionFun 'Hello'
函数 , 传入 'Hello'
字符串作为参数 , 打印 MyPluginExtensions extensionFun : Hello
;在 Android Studio 的 Gradle 面板中的 Task 任务 , 都是在 Android Gradle 插件中定义的 , 在自定义插件中 , 也可以自定义 Gradle 任务 ;
首先 , 先自定义 Task 任务 , 继承 DefaultTask 类 , 实现一个任务执行方法 , 参考 【Android Gradle 插件】自定义 Gradle 任务 ⑩ ( 自定义任务类继承 DefaultTask 类 | TaskContainer#create 函数创建任务 | 生成自定义任务) 博客 ;
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
/**
* 自定义 Gradle 任务
*/
class MyTask extends org.gradle.api.DefaultTask {
@TaskAction
void run() {
println 'MyTask TaskAction'
}
}
然后 , 在自定义插件中 , 创建 Task 任务 , 并为其制定依赖 ;
import org.gradle.api.Plugin
import org.gradle.api.Project
class MyPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
println 'MyPlugin'
// 创建一个扩展
// 类似于 Android Gradle 插件中的 android
// 引入了 MyPlugin 插件后
// 就可以使用 myplugin 配置块
def myplugin = project.extensions.create("myplugin", MyPluginExtensions)
// 为 MyPlugin 自定义插件的 myplugin 扩展定义 扩展 mypluginextension
myplugin.extensions.create("mypluginextension", MyPluginExtensionsExtensions)
// 获取 自定义 Gradle 插件的扩展属性 , 必须在 Gradle 分析完成之后才能进行 , 否则获取不到
project.afterEvaluate {
println project.myplugin.name
println project.myplugin.age
println project.myplugin.mypluginextension.name
println project.myplugin.mypluginextension.age
// 创建自定义任务 , 并且设置该任务依赖于其它任务
MyTask myTask = project.tasks.create('HelloMyTask', MyTask)
// 设置自定义任务依赖于 preBuild 任务
// 执行 HelloMyTask 自定义任务之前 , 需要先执行 preBuild 任务
myTask.dependsOn project.tasks.getByName('preBuild')
// 设置某个任务 依赖于 自定义任务
// 执行 preDebugBuild 任务之前 , 必须先执行 HelloMyTask 任务
project.tasks.getByName('preDebugBuild').dependsOn myTask
// 按照上述配置 , HelloMyTask 任务的执行 需要在 preBuild 与 preDebugBuild 任务之间
}
}
}
最后 , 在 build.gradle 构建脚本中引入插件 ;
apply plugin: MyPlugin
编译应用 , 可以看到 HelloMyTask 任务在 preBuild 之后 , 在 preDebugBuild 之前执行 ;
import org.gradle.api.Plugin
import org.gradle.api.Project
class MyPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
println 'MyPlugin'
// 创建一个扩展
// 类似于 Android Gradle 插件中的 android
// 引入了 MyPlugin 插件后
// 就可以使用 myplugin 配置块
def myplugin = project.extensions.create("myplugin", MyPluginExtensions)
// 为 MyPlugin 自定义插件的 myplugin 扩展定义 扩展 mypluginextension
myplugin.extensions.create("mypluginextension", MyPluginExtensionsExtensions)
// 获取 自定义 Gradle 插件的扩展属性 , 必须在 Gradle 分析完成之后才能进行 , 否则获取不到
project.afterEvaluate {
println project.myplugin.name
println project.myplugin.age
println project.myplugin.mypluginextension.name
println project.myplugin.mypluginextension.age
// 创建自定义任务 , 并且设置该任务依赖于其它任务
MyTask myTask = project.tasks.create('HelloMyTask', MyTask)
// 设置自定义任务依赖于 preBuild 任务
// 执行 HelloMyTask 自定义任务之前 , 需要先执行 preBuild 任务
myTask.dependsOn project.tasks.getByName('preBuild')
// 设置 preDebugBuild 任务 依赖于 HelloMyTask 自定义任务
// 执行 preDebugBuild 任务之前 , 必须先执行 HelloMyTask 任务
project.tasks.getByName('preDebugBuild').dependsOn myTask
// 按照上述配置 , HelloMyTask 任务的执行 需要在 preBuild 与 preDebugBuild 任务之间
}
}
}
class MyPluginExtensions {
def name
def age
// 在扩展中定义方法
def extensionFun() {
println 'MyPluginExtensions extensionFun'
}
// 在扩展中定义 带参数的方法
def extensionFun(String str) {
println 'MyPluginExtensions extensionFun : ' + str
}
}
class MyPluginExtensionsExtensions {
def name
def age
}
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
/**
* 自定义 Gradle 任务
*/
class MyTask extends org.gradle.api.DefaultTask {
@TaskAction
void run() {
println 'MyTask TaskAction'
}
}
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
compileSdkVersion 31
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "kim.hsl.android_ui"
minSdkVersion 18
targetSdkVersion 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
// 定义扩展属性 , 其中的变量对所有子项目可见
/*ext {
hello3 = 'Hello World1!3'
}*/
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
apply plugin: MyPlugin
myplugin {
name 'Tom'
age 18
// 调用在扩展中定义的方法
// 打印 'MyPluginExtensions extensionFun'
extensionFun()
// 调用 扩展中 带参数的方法
extensionFun 'Hello'
mypluginextension {
name 'Jerry'
age 19
}
}
Executing tasks: [:app:assembleDebug] in project D:\002_Project\002_Android_Learn\Android_UI
> Task :buildSrc:compileJava NO-SOURCE
> Task :buildSrc:compileGroovy
> Task :buildSrc:processResources NO-SOURCE
> Task :buildSrc:classes
> Task :buildSrc:jar
> Task :buildSrc:assemble
> Task :buildSrc:compileTestJava NO-SOURCE
> Task :buildSrc:compileTestGroovy NO-SOURCE
> Task :buildSrc:processTestResources NO-SOURCE
> Task :buildSrc:testClasses UP-TO-DATE
> Task :buildSrc:test NO-SOURCE
> Task :buildSrc:check UP-TO-DATE
> Task :buildSrc:build
> Configure project :app
MyPlugin
MyPluginExtensions extensionFun
MyPluginExtensions extensionFun : Hello
Tom
18
Jerry
19
AGPBI: {"kind":"warning","text":"Please remove usages of `jcenter()` Maven repository from your build scripts and migrate your build to other Maven repositories.\nThis repository is deprecated and it will be shut down in the future.\nSee http://developer.android.com/r/tools/jcenter-end-of-service for more information.\nCurrently detected usages in: root project 'Android_UI', project ':app'","sources":[{}]}
> Task :app:preBuild UP-TO-DATE
> Task :app:HelloMyTask UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:compileDebugAidl NO-SOURCE
> Task :app:compileDebugRenderscript NO-SOURCE
> Task :app:generateDebugBuildConfig
> Task :app:generateDebugResValues
> Task :app:generateDebugResources
> Task :app:checkDebugAarMetadata
> Task :app:createDebugCompatibleScreenManifests
> Task :app:extractDeepLinksDebug
> Task :app:mergeDebugResources
> Task :app:processDebugMainManifest
> Task :app:processDebugManifest
> Task :app:mergeDebugNativeDebugMetadata NO-SOURCE
> Task :app:javaPreCompileDebug
> Task :app:mergeDebugShaders
> Task :app:compileDebugShaders NO-SOURCE
> Task :app:generateDebugAssets UP-TO-DATE
> Task :app:mergeDebugAssets
> Task :app:compressDebugAssets
> Task :app:processDebugJavaRes NO-SOURCE
> Task :app:checkDebugDuplicateClasses
> Task :app:desugarDebugFileDependencies
> Task :app:mergeDebugJniLibFolders
> Task :app:validateSigningDebug
> Task :app:writeDebugAppMetadata
> Task :app:writeDebugSigningConfigVersions
> Task :app:processDebugManifestForPackage
> Task :app:mergeDebugNativeLibs
> Task :app:mergeExtDexDebug
> Task :app:stripDebugDebugSymbols NO-SOURCE
> Task :app:processDebugResources
> Task :app:compileDebugKotlin
> Task :app:compileDebugJavaWithJavac
注: D:\002_Project\002_Android_Learn\Android_UI\app\src\main\java\kim\hsl\ScreenAdaptLayout.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
> Task :app:compileDebugSources
> Task :app:dexBuilderDebug
> Task :app:mergeDebugJavaResource
> Task :app:mergeDexDebug
> Task :app:packageDebug
> Task :app:assembleDebug
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.7.1/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 25s
28 actionable tasks: 28 executed
Build Analyzer results available