Android-如何自定义gradle插件
自定义gradle插件可以实现定制自己的构建流程,以达到复用目的;
##1. 自定义插件方式
自定义插件有三种方式
-
添加脚步
在你的app项目的build.gradle中直接使用groovy脚步语言编写插件
这样方式好处是插件能自动变异且被包含到构建脚步中,你无需做任何处理;缺点是插件到逻辑都放到都build.gradle中去了,增加了脚步的复杂度且无法复用 -
添加buildSrc工程
在根目录添加buildSrc子Module,这种方式比前一种好些,将插件的代码统一放到buildSrc工程中去了,但还是做不到别的工程能够使用它
-
单独新建一个工程
这种方式最优,将插件集中在一个单独的工程中,且发布到gradle后,别的工程能够轻松复用它
##2. 自定义插件实现
###2.1 第一种------添加脚步
在你的主工程app module的build.gradle中直接添加脚步
Example:
class HelloConfigExtension {
String msg = 'Hello gradle plugin'
}
class HelloPlugin implements Plugin<Project> {
void apply(Project project) {
// Add the 'hello' extension object
def extension = project.extensions.create('hello', HelloConfigExtension)
project.task('hello') {
doLast {
println extension.msg
}
}
}
}
// Apply the plugin
apply plugin: HelloPlugin
//Config the extension
hello{
msg = 'hello from gradle'
}
在控制台输入 ./gradlew -q hello
> gradle -q hello
hello from gradle
上述命令表明需要执行一个hello任务 -q表示除去打印日志(错误日志除外);因为我们在插件中定义了一个hello任务,这个任务就是打印从gradle传入的msg参数;
这样一个简单的插件就实现了,当然完全可以根据自己的业务需求实现自己的插件
##2.2 第二种------添加buildSrc Module
在根工程中添加手工添加一个buildSrc 目录结构如下
-
新建自己插件类
图片中的二个类都是groovy类(路径必须是在src/main/groovy下),其实就是对应第一种在gradle脚步中写的HelloPlugin和HelloConfigExtension类;
-
新建配置文件
在groovy同一层级新建resouces/META-INF/gradle-plugins目录
新建一个名为youPluginId.properties 在里面添加注意:这里面的文件的名称就是你自定义插件的id,当你在主工程引用是需要使用此插件id号进行引用
#这里面要替换成你自己的全路径插件名 implementation-class=com.fzm.plugin.PostBuildPlugin
-
新建build.gradle
在buildSrc目录下新建,并添加如下脚步即可
apply plugin: 'groovy' dependencies { compile gradleApi() compile localGroovy() } repositories { mavenCentral() }
这样第二中自定义插件写法步骤就介绍完毕类,如何引用呢?很简单
,你可以在你的主工程app moudle的build.gradle 添加如下脚步
```
apply plugin: 'you plugin id'
//example
//apply plugin: 'com.fzm.post.build.plugin'
```
2.3 第三种------单独工程
-
插件的编写
新建一个Android工程,再新建一个专门编写插件的module
复制第二种方法中buildSrc中的src和build.gradle文件到plugin moudle中
因为第三种可以将自己插件发布到gradle上去,所以这里的build.gradle需要修改
格式如下,参考示例Demoplugins { id "com.gradle.plugin-publish" version "0.9.10" } // Apply other plugins here, e.g. java plugin for a plugin written in java or // the groovy plugin for a plugin written in groovy apply plugin:'groovy' repositories { jcenter() } dependencies { compile gradleApi() compile localGroovy() //not needed for Java plugins // other dependencies that your plugin requires } // Unless overridden in the pluginBundle config DSL, the project version will // be used as your plugin version when publishing version = "plugin version" group = "plugin group name" // The configuration example below shows the minimum required properties // configured to publish your plugin to the plugin portal pluginBundle { website = 'project website' vcsUrl = 'project repository address' description = 'plugin description' tags = ['xxx', 'xxx','xxx'] plugins { postBuildPlugin { id = 'your plugin id' displayName = 'your plugin name' } } } sourceCompatibility = "1.8" targetCompatibility = "1.8"
-
插件的发布
先去gradle官网注册账号,有的话直接登录
展开AS中右侧工具栏,找到你插件的module->plugin portal 右击 login 执行即可
顺利的话登录会成功,点击控制台链接即可,接下来准备发布操作,右击publishPlugins执行run即可,顺利话,发布成功的话你会看到这样
注意:每次发布的版本都不能是之前存在过的,否则会发布失败
如果想直接通过控制台操作,可以使用如下命令
./gradlew yourPluginModuleName:publishPlugins
-
引用
当你发布插件成功后,你可以去官网搜索你发布的插件(通过插件id),已了解你发布插件的信息,里面有如何使用自自定义插件的说明别的工程只要在根工程build.gradle添加类似如下代码即可
//较高gradle版本写法:Build script snippet for plugins DSL for Gradle 2.1 and later: plugins { id "com.fzm.post.build.plugin" version "1.0.21" } //低版本写法或者动态配置时需要 //Build script snippet for use in older Gradle versions or where dynamic configuration is required: buildscript { repositories { maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "gradle.plugin.com.fzm.post.build:post-build-plugin:1.0.21" } } apply plugin: "com.fzm.post.build.plugin"
本人发现高版本写法也可以放到主工程的build.gradle前提要放在apply plugin:xxxxx前面;而第二中写法比较灵活,因为apply plugin:"your plugin id"可以放到 别的插件之后,这样你可以做很多的事情;
2.4 差异(也许对你灰常有用哦)
-
插件引用方式
不知道大家又没注意这三种引用插件的方式其实是有差别的
第一种apply plugin: yourPluginName
第二种:
app plugin: yourPluginId
第三种:
//way 1 //add in app project's build.gradle plugins { id 'pluginId' version "plugiVersion" } //way 2 //add in root project's build.gradle buildscript { repositories { maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "gradle.plugin.com.fzm.post.build:post-build-plugin:1.0.21" } } //add in app project's build.gradle apply plugin: "com.fzm.post.build.plugin"
前二中都是直接在主工程build.gradle 直接使用且可以放到apply plugin: ‘com.android.application’ 后面哦,
第三种第一种引用方式只能放到apply plugin: xxx前面这种差异意味着第三种第一个方式不能拦截assemleDebug/Release之类的任务,而前二种则是可以的,如果要hook的话就使用灵活的第三种第二个方式,就能实现hook相关动作
-
插件的构成:打包后的插件其实就是一个jar它包含java,groovy这些类编译成的字节码,像python脚本文件会自动丢弃,所以你如果想在插件中调用python之类需要指定路径,python文件不可以放到插件中去
2.5 插件的调试
1. 调试
方法一:开发插件时建议先使用第二种方式,这样便于调试错误;等插件功能开发完毕后,再使用第三种方式发布集成引用;
方法二:使用本地仓库调试
在你的插件模块的build.gradle文件加入如下代码
repositories {
mavenLocal() //add
mavenCentral()
}
// 指定本地上传的路径
def localMavenRepo = 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath //add
uploadArchives {
repositories {
mavenDeployer {
repository(url: localMavenRepo) //add
snapshotRepository(url: localMavenRepo) //add
}
}
}
./gradlew clean install
再执行上传操作即可(uploadArchives)
2. 其他工程引用
buildscript {
repositories {
mavenLocal() //add
mavenCentral()
...
}
dependencies {
classpath 'yougroup:name:1.0.0' //add
}
}
allprojects {
repositories {
mavenLocal() //add
mavenCentral()
...
}
}