Android Gradle 插件自定义 Gradle 插件模块 ⑤ ( 完整总结 ) ★★★
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Gradle 插件自定义 Gradle 插件模块 ⑤ ( 完整总结 ) ★★★相关的知识,希望对你有一定的参考价值。
文章目录
- 一、创建自定义插件类型模块 ( Java or Kotlin Library )
- 二、手动导入相关依赖 ( Java | Groovy | Gradle )
- 三、在 Java or Kotlin Library 模块中定义插件
- 四、配置自定义 Gradle 插件发布选项
- 五、配置 Group 分组、插件名称、插件版本号
- 六、自定义 Gradle 插件发布配置
- 七、META-INF 中声明自定义插件的核心类
- 八、将插件上传到本地 Maven 仓库
- 九、在应用中依赖本地 Maven 仓库中的自定义 Gradle 插件
- 十、完整代码示例
Android Plugin DSL Reference 参考文档 :
-
Android Studio 构建配置官方文档 : https://developer.android.google.cn/studio/build
-
添加构建依赖项 参考文档 : https://developer.android.google.cn/studio/build/dependencies
-
Android Gradle 插件配置与 Gradle 配置关联 : 【Android Gradle 插件】Gradle 依赖管理 ① ( org.gradle.api.Project 配置 | Android Gradle 插件配置与 Gradle 配置关联 ) ★
-
Android Gradle 插件文档主页 : https://google.github.io/android-gradle-dsl/2.3/
-
BaseExtension 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.BaseExtension.html
-
AppExtension ( build.gradle#android 配置 ) 文档位置 : android-gradle-dsl-gh-pages/2.3/com.android.build.gradle.AppExtension.html
-
build.gradle#android 模块配置文档 : android-gradle-dsl/2.3/com.android.build.gradle.AppExtension.html
-
ProductFlavor ( build.gradle#android#defaultConfig 配置 ) 文档 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.ProductFlavor.html
-
ProductFlavor#externalNativeBuild 配置 ( build.gradle#android#defaultConfig#externalNativeBuild 配置 ) : com.android.build.gradle.internal.dsl.ProductFlavor:externalNativeBuild
-
ExternalNativeBuildOptions ( build.gradle#android#defaultConfig#externalNativeBuild 配置 ) 文档位置 : android-gradle-dsl-gh-pages/2.3/com.android.build.gradle.internal.dsl.ExternalNativeBuildOptions.html
-
NdkBuildOptions ( build.gradle#android#defaultConfig#externalNativeBuild#ndkBuild 配置 ) 文档位置 : android-gradle-dsl-gh-pages/2.3/com.android.build.gradle.internal.dsl.NdkBuildOptions.html
-
CmakeOptions ( build.gradle#android#defaultConfig#externalNativeBuild#cmake 配置 ) 文档位置 : android-gradle-dsl-gh-pages/2.3/com.android.build.gradle.internal.dsl.CmakeOptions.html
-
JackOptions ( build.gradle#android#defaultConfig#jackOptions 配置 ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.JackOptions.html
-
AnnotationProcessorOptions ( 注解处理器配置 ) ( build.gradle#android#defaultConfig#javaCompileOptions配置 ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.AnnotationProcessorOptions.html
-
NdkOptions ( build.gradle#android#defaultConfig#ndk 配置 ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.NdkOptions.html
-
NDK 参考文档 : Add C and C++ Code to Your Project.
-
VectorDrawablesOptions ( build.gradle#android#defaultConfig#vectorDrawables 配置 ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.VectorDrawablesOptions.html
-
BuildType ( build.gradle#android#buildTypes 配置 ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.BuildType.html
-
SigningConfig ( build.gradle#android#signingConfigs 配置 ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.SigningConfig.html
-
AaptOptions ( build.gradle#android#aaptOptions 配置 ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.AaptOptions.html
-
AndroidSourceSets ( build.gradle#android#sourceSets 配置 ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.api.AndroidSourceSet.html
-
AndroidSourceDirectorySet ( build.gradle#android#sourceSets#aidl/assets/java/jni/jniLibs 配置 ) 文档位置 :android-gradle-dsl/2.3/com.android.build.gradle.api.AndroidSourceDirectorySet.html
-
AndroidSourceFile ( build.gradle#android#sourceSets#manifest 配置 ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.api.AndroidSourceFile.html
-
DataBindingOptions ( build.gradle#android#dataBinding ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.DataBindingOptions.html
-
DexOptions ( build.gradle#android#dexOptions ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.DexOptions.html
-
LintOptions ( build.gradle#android#lintOptions ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.LintOptions.html
-
PackagingOptions ( build.gradle#android#packagingOptions ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.PackagingOptions.html
-
Splits ( build.gradle#android#splits ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.Splits.html
-
AbiSplitOptions ( build.gradle#android#splits#abi ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.AbiSplitOptions.html
-
LanguageSplitOptions ( build.gradle#android#splits#language ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.LanguageSplitOptions.html
-
DensitySplitOptions ( build.gradle#android#splits#density ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.DensitySplitOptions.html
-
TestOptions ( build.gradle#android#testOptions ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.TestOptions.html
-
Android 测试相关文档 : https://developer.android.google.cn/training/testing
-
UnitTestOptions ( build.gradle#android#testOptions#unitTests ) 文档位置 : android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.TestOptions.UnitTestOptions.html
-
org.gradle.api.tasks.testing.Test 单元测试配置类 : https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/testing/Test.html
-
LibraryExtension ( Library 依赖库的 build.gradle#android 配置 ) 文档 : android-gradle-dsl/2.3/com.android.build.gradle.LibraryExtension.html
-
org.gradle.api.Project 配置 ( build.gradle 根配置 ) 文档 : https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html
-
org.gradle.api.initialization.Settings 配置 文档 : https://docs.gradle.org/current/javadoc/org/gradle/api/initialization/Settings.html
-
org.gradle.api.artifacts.dsl.DependencyHandler 配置 ( build.gradle#dependencies#implementation 配置 ) : https://docs.gradle.org/current/javadoc/org/gradle/api/artifacts/dsl/DependencyHandler.html
-
添加构建依赖项 参考文档 : https://developer.android.google.cn/studio/build/dependencies
-
org.gradle.api.Task 配置 ( Gradle 任务类型 ) 文档 : https://docs.gradle.org/current/javadoc/org/gradle/api/Task.html
-
org.gradle.api.tasks.TaskContainer配置 ( Gradle 任务容器类型 ) 文档 : https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/TaskContainer.html
-
org.gradle.api.DefaultTask 配置 ( Gradle 自定义任务类父类 ) 文档 : https://docs.gradle.org/current/javadoc/org/gradle/api/DefaultTask.html
-
org.gradle.api.tasks.Delete 自带任务 ( clean 任务类型 ) 文档 : https://docs.gradle.org/current/dsl/org.gradle.api.tasks.Delete.html
-
org.gradle.api.tasks.bundling.Zip 自带任务 ( 任务类型 ) 文档 :https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Zip.html
-
Gradle 自带任务查询界面 ( 搜索 Task Types ) : https://docs.gradle.org/current/dsl/#N1045C
-
org.gradle.api.invocation.Gradle 文档 ( 可设置 Gradle 构建声明周期监听器 ) : https://docs.gradle.org/current/javadoc/org/gradle/api/invocation/Gradle.html
-
org.gradle.BuildListener 构建监听器 文档 : https://docs.gradle.org/current/javadoc/org/gradle/BuildListener.html
-
org.gradle.execution.TaskExecutionGraphListener 构建监听器 文档 : https://docs.gradle.org/current/javadoc/org/gradle/api/execution/TaskExecutionGraphListener.html
-
自定义 Gradle 插件 - GitHub 地址 : https://github.com/han1202012/Android_UI
一、创建自定义插件类型模块 ( Java or Kotlin Library )
选择 " 菜单栏 / New / New Module… " 选项 ,
在 " Create New Module " 对话框中 , 选择 创建 " Java or Kotlin Library " 类型的依赖库 ;
二、手动导入相关依赖 ( Java | Groovy | Gradle )
在 buildSrc 目录 下 , 会自动引入 Java / Groovy / Gradle 的依赖 , 但是在自己创建的 Java Library 类型的依赖库 中 , 需要将其 手动引入 , 在 该 Module 模块的 build.gradle 构建脚本中引入上述依赖 ;
plugins
id 'java-library'
id 'kotlin'
id 'groovy'
java
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
dependencies
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation gradleApi()
implementation localGroovy()
implementation fileTree(dir: 'libs', includes: ['*.jar'])
三、在 Java or Kotlin Library 模块中定义插件
在插件模块中的 src/main 目录 下创建 groovy 目录 , 用于存放 Groovy 代码 , 在其中定义包名以及包名下的源码 :
代码示例如下 :
package kim.hsl.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
class Plugin4 implements Plugin<Project>
@Override
void apply(Project project)
println 'Plugin4'
注意 : 此时的 自定义 Gradle 插件是无法在其它 Module 中引入的 ;
四、配置自定义 Gradle 插件发布选项
如果想要将 插件上传到 远程仓库 或者 本地仓库 中 , 需要引入一个 maven-publish 插件 ;
// 用于将 插件上传到 远程仓库 或者 本地仓库 中
apply plugin: 'maven-publish'
然后 , 创建 publishing 扩展 , 在该扩展中 , 可以在其中的 publications 脚本块 中为插件传入参数 ;
注意 : publications 中的 plugin 函数是任意命名的 ;
// 发布到 远程/本地仓库 相关配置
publishing
publications
// plugin 函数是随意命名的函数
plugin(MavenPublication)
// 配置上传内容
// components.java 是打包的 jar 包
from components.java
在 android Studio 工程根目录中的 build.gradle 构建脚本中 , 引入插件代码如下 :
buildscript
dependencies
classpath "com.android.tools.build:gradle:4.2.1"
五、配置 Group 分组、插件名称、插件版本号
引入自定义 Gradle 插件的 “com.android.tools.build:gradle:4.2.1” 代码中
- " com.android.tools.build " 是 Group 分组
- " gradle " 是 插件名称
- " 4.2.1 " 是 插件的版本号
上述 3 3 3 个元素使用 " : " 英文冒号 隔开 ;
因此 , 在自定义 Gradle 插件模块中 , 也可以指定
- Group 分组
- 插件名称
- 插件版本号
这 3 3 3 个信息 ;
通过 Project#setGroup 方法 , 指定 Gradle 插件分组 ;
// 指定自定义 Gradle 插件的分组
group 'kim.hsl.plugin'
通过 Project#setVersion 方法 , 指定 Gradle 插件的版本号
// 指定自定义 Gradle 插件的版本号
version '0.1'
自定义 Gradle 插件的名称 , 默认为工程名 , 也可以在 publishing / publications / xxx / artifactId 配置中 自己指定 插件名称 ;
// 用于将 插件上传到 远程仓库 或者 本地仓库 中
apply plugin: 'maven-publish'
// 发布到 远程/本地仓库 相关配置
publishing
publications
// plugin 函数是随意命名的函数
plugin(MavenPublication)
// 配置上传内容
// components.java 是打包的 jar 包
from components.java
// 指定自定义 Gradle 插件名称
artifactId 'plugin'
相关代码如下 :
// 指定自定义 Gradle 插件的分组
group 'kim.hsl.plugin'
// 指定自定义 Gradle 插件的版本号
version '0.1'
// 自定义 Gradle 插件的名称 , 默认为工程名
// 也可以在 publishing / publications 脚本块中 自己指定
// 用于将 插件上传到 远程仓库 或者 本地仓库 中
apply plugin: 'maven-publish'
// 发布到 远程/本地仓库 相关配置
publishing
publications
// plugin 函数是随意命名的函数
plugin(MavenPublication)
// 配置上传内容
// components.java 是打包的 jar 包
from components.java
// 指定自定义 Gradle 插件名称
artifactId 'plugin'
六、自定义 Gradle 插件发布配置
在上一篇博客 【Android Gradle 插件】自定义 Gradle 插件模块 ② ( 在模块中定义插件 | 引入自定义 Gradle 插件模块 | 配置 Gradle 插件上传选项 | 配置分组名称版本号 ) 中 , 定义完插件后 , 在 自定义 Gradle 插件模块 的 build.gradle 构建脚本中 , 添加了 插件上传仓库的 配置 , 为插件指定了 分组 , 版本号 , 名称 配置 ;
// 指定自定义 Gradle 插件的分组
group 'kim.hsl.plugin'
// 指定自定义 Gradle 插件的版本号
version '0.1'
// 自定义 Gradle 插件的名称 , 默认为工程名
// 也可以在 publishing / publications 脚本块中 自己指定
// 用于将 插件上传到 远程仓库 或者 本地仓库 中
apply plugin: 'maven-publish'
// 发布到 远程/本地仓库 相关配置
publishing
publications
// plugin 函数是随意命名的函数
plugin(MavenPublication)
// 配置上传内容
// components.java 是打包的 jar 包
from components.java
// 指定自定义 Gradle 插件名称
artifactId 'plugin'
首次编译执行 , 可以在 自定义 Gradle 插件的 Module 模块 下 , 看到 publishing 分组的 Gradle 任务 , 如下图红色矩形框中的内容 ;
-
generatePomFileForPluginPublication 任务的作用是 生成 Pom 文件 , 该文件是 Maven 仓库的描述文件 ;
-
publishPluginPublicationToMavenLocal 任务的作用是将 Gradle 插件 上传到本地 Maven 仓库中 ;
七、META-INF 中声明自定义插件的核心类
参考 Android Gradle 插件内容 , 将 Android Studio 的 Project 面板中的 External Libraries 展开 ,
在 Android Gradle 插件中 , 需要在 META-INF/gradle-plugins/插件组名.插件名.properties 文件中 ,
声明该 自定义插件的
implementation-class=org.gradle.api.plugins.antlr.AntlrPlugin
在自己的自定义插件中 , 也需要进行上述配置 ;
在 " src/main " 目录下 , 创建 " resources\\META-INF\\gradle-plugins " 目录 , 在该目录下创建 " kim.hsl.plugin.properties " 配置文件 , 内容为 :
implementation-class=kim.hsl.plugin.Plugin4
上述配置完毕后 , 重新执行 publishPluginPublicationToMavenLocal 任务 ;
八、将插件上传到本地 Maven 仓库
执行 Gradle 面板中的 publishPluginPublicationToMavenLocal 任务 , 即可将该 Module 生成的 jar 包上传到本地 Maven 仓库中 ;
然后再查看本地 Maven 仓库中的内容 , 发现 " C:\\Users\\octop.m2\\repository " 目录中 多了一个 kim 目录 :
进入到 " C:\\Users\\octop.m2\\repository\\kim\\hsl\\plugin\\plugin " 目录中 , 内容如下 :
进入到 " C:\\Users\\octop.m2\\repository\\kim\\hsl\\plugin\\plugin\\0.1 " 目录中 , 内容如下 :
九、在应用中依赖本地 Maven 仓库中的自定义 Gradle 插件
依赖本地 Maven 仓库 , 并导入 自定义 Gradle 插件 依赖 ;
buildscript
repositories
mavenLocal() // 依赖本地 Maven 仓库
dependencies
classpath "kim.hsl.plugin:plugin:0.1" // 依赖本地 Maven 仓库下的自定义 Gradle 插件
引入 自定义 Gradle 插件 ;
apply plugin: 'kim.hsl.plugin'
十、完整代码示例
自定义 Gradle 插件 - GitHub 地址 : https://github.com/han1202012/Android_UI
自定义插件代码
package kim.hsl.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
class Plugin4 implements Plugin<Project>
@Override
void apply(Project project)
println 'Plugin4'
自定义插件 Gradle 构建脚本
plugins
id 'java-library'
id 'kotlin'
id 'groovy'
java
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
dependencies
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation gradleApi()
implementation localGroovy()
implementation fileTree(dir: 'libs', includes: ['*.jar'])
// 指定自定义 Gradle 插件的分组
group 'kim.hsl.plugin'
// 指定自定义 Gradle 插件的版本号
version '0.1'
// 自定义 Gradle 插件的名称 , 默认为工程名
// 也可以在 publishing / publications 脚本块中 自己指定
// 用于将 插件上传到 远程仓库 或者 本地仓库 中
apply plugin: 'maven-publish'
// 发布到 远程/本地仓库 相关配置
publishing
publications
// plugin 函数是随意命名的函数
plugin(MavenPublication)
// 配置上传内容
// components.java 是打包的 jar 包
from components.java
// 指定自定义 Gradle 插件名称
artifactId 'plugin'
自定义插件插件类配置
implementation-class=kim.hsl.plugin.Plugin4
根目录 build.gradle 构建脚本
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript
ext.kotlin_version = "1.5.0"
repositories
google()
mavenCentral()
dependencies
classpath "com.android.tools.build:gradle:4.2.1"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
allprojects
repositories
google()
mavenCentral()
jcenter() // Warning: this repository is going to shut down soon
task clean(type: Delete)
delete rootProject.buildDir
// 定义扩展属性 , 其中的变量对所有子项目可见
ext
hello1 = 'Hello World1!'
hello2 = 'Hello World2!'
gradle.addBuildListener(new BuildListener()
@Override
void buildStarted(Gradle gradle)
// 构建开始时回调该函数
@Override
void settingsEvaluated(Settings settings)
// 分析 settings.gradle 函数完成后回调该函数
@Override
void projectsLoaded(Gradle gradle)
@Override
void projectsEvaluated(Gradle gradle)
@Override
void buildFinished(BuildResult buildResult)
// 构建完成时回调的函数
)
app 模块目录下 build.gradle 构建脚本
核心代码 :
buildscript
repositories
mavenLocal() // 依赖本地 Maven 仓库
dependencies
classpath "kim.hsl.plugin:plugin:0.1" // 依赖本地 Maven 仓库下的插件
apply plugin: 'kim.hsl.plugin'
完整代码 :
buildscript
repositories
mavenLocal() // 依赖本地 Maven 仓库
dependencies
classpath "kim.hsl.plugin:plugin:0.1" // 依赖本地 Maven 仓库下的插件
plugins
id 'com.android.application'
id 'kotlin-android'
apply plugin: 'kim.hsl.plugin'
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
// 在 build.gradle 中定义 Gradle 插件
class MyPlugin2 implements Plugin<Project>
@Override
void apply(Project project)
println 'MyPlugin2'
// 引入在本文件中定义的 Gradle 插件
apply plugin: MyPlugin2
// 该操作相当于将 plugin.gradle 文件拷贝到此处
apply from: 'plugin.gradle'
以上是关于Android Gradle 插件自定义 Gradle 插件模块 ⑤ ( 完整总结 ) ★★★的主要内容,如果未能解决你的问题,请参考以下文章
Android Gradle 插件Gradle 自定义 Plugin 插件 ⑤ ( 自定义插件中获定义方法 | 在插件中创建 Gradle 任务 | 代码示例 )
Android Gradle 插件Gradle 自定义 Plugin 插件 ⑦ ( 自定义 Gradle 插件导入方式 | buildSrc 插件导入 | 构建脚本中自定义插件 | 独立文件 )
Android Gradle 插件Gradle 自定义 Plugin 插件 ⑦ ( 自定义 Gradle 插件导入方式 | buildSrc 插件导入 | 构建脚本中自定义插件 | 独立文件 )
Android Gradle 插件自定义 Gradle 插件模块 ② ( 在模块中定义插件 | 引入自定义 Gradle 插件模块 | 配置 Gradle 插件上传选项 | 配置分组名称版本号 )
Android Gradle 插件Gradle 自定义 Plugin 插件 ④ ( 为自定义 Gradle 插件的扩展配置扩展 | 在自定义插件中获取扩展属性 )