我的博客原文地址
Gradle 的插件可以有三种形式来提供:
本文只对后面两种方式来进行简单介绍。
最终的目录结构为:
因为我们要用到 groovy,以及要用到gradle和groovy的sdk,因此将 buildSrc 下面的 build.gradle 修改为:
apply plugin: 'groovy'
dependencies {
//gradle sdk
compile gradleApi()
//groovy sdk
compile localGroovy()
}
repositories {
jcenter()
}
实现 TestPlugin
类,在脚本中通过实现gradle的Plugin接口,实现apply方法即可:
package com.android.hq.testplugin
import org.gradle.api.Plugin
import org.gradle.api.Project;
public class TestPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
// 实现一个名称为testPlugin的task
project.task('testPlugin') << {
println "## This is my first gradle plugin in testPlugin task"
}
println "** This is my first gradle plugin"
}
}
这里在简单实现了一个名称为testPlugin的task,当执行该task时,会打印 ## This is my first gradle plugin in testPlugin task
,而** This is my first gradle plugin
在执行所有的task时都会打印。
使用方式比较简单,在 app 的 build.gradle 中添加
apply plugin: com.android.hq.testplugin.TestPlugin
即可。
输入 ./gradlew tasks
,我们可以看到 testPlugin 已经在task列表中。
:tasks
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
Android tasks
-------------
androidDependencies - Displays the Android dependencies of the project.
signingReport - Displays the signing info for each variant.
sourceSets - Prints out all the source sets defined in this project.
Build tasks
-----------
assemble - Assembles all variants of all applications and secondary packages.
assembleAndroidTest - Assembles all the Test applications.
assembleDebug - Assembles all Debug builds.
assembleRelease - Assembles all Release builds.
build - Assembles and tests this project.
......
Other tasks
-----------
jarDebugClasses
jarReleaseClasses
lintVitalRelease - Runs lint on just the fatal issues in the Release build.
testPlugin
执行 testPlugin task,输出:
$ ./gradlew testPlugin
:buildSrc:compileJava UP-TO-DATE
:buildSrc:compileGroovy UP-TO-DATE
:buildSrc:processResources UP-TO-DATE
:buildSrc:classes UP-TO-DATE
:buildSrc:jar UP-TO-DATE
:buildSrc:assemble UP-TO-DATE
:buildSrc:compileTestJava UP-TO-DATE
:buildSrc:compileTestGroovy UP-TO-DATE
:buildSrc:processTestResources UP-TO-DATE
:buildSrc:testClasses UP-TO-DATE
:buildSrc:test UP-TO-DATE
:buildSrc:check UP-TO-DATE
:buildSrc:build UP-TO-DATE
** This is my first gradle plugin
** build versionName=2.1.0
:app:testPlugin
## This is my first gradle plugin in testPlugin task
BUILD SUCCESSFUL
Total time: 5.358 secs
可以看到,** This is my first gradle plugin
和## This is my first gradle plugin in testPlugin task
都会打印出来。
执行 assembleDebug task,输出:
$ ./gradlew assembleDebug
:buildSrc:compileJava UP-TO-DATE
:buildSrc:compileGroovy UP-TO-DATE
:buildSrc:processResources UP-TO-DATE
:buildSrc:classes UP-TO-DATE
:buildSrc:jar UP-TO-DATE
:buildSrc:assemble UP-TO-DATE
:buildSrc:compileTestJava UP-TO-DATE
:buildSrc:compileTestGroovy UP-TO-DATE
:buildSrc:processTestResources UP-TO-DATE
:buildSrc:testClasses UP-TO-DATE
:buildSrc:test UP-TO-DATE
:buildSrc:check UP-TO-DATE
:buildSrc:build UP-TO-DATE
** This is my first gradle plugin
** build versionName=2.1.0
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
......
:app:assembleDebug UP-TO-DATE
BUILD SUCCESSFUL
Total time: 4.925 secs
可以看到,只有 ** This is my first gradle plugin
输出。
这种类型的插件可以上传到远端 maven 库等,其他工程通过添加依赖,引用这个插件。
创建步骤和前面的在当前项目中创建插件的步骤有些是类似的。
这里的步骤除了3,4,5和前的一样,其他的都是不一样的。
apply plugin: 'com.android.hq.testplugin'
implementation-class=com.android.hq.testplugin.TestPlugin
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
//gradle sdk
compile gradleApi()
//groovy sdk
compile localGroovy()
}
repositories {
mavenCentral()
}
实现 TestPlugin
类,这一步和前面的一样:
package com.android.hq.testplugin
import org.gradle.api.Plugin
import org.gradle.api.Project;
public class TestPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
// 实现一个名称为testPlugin的task
project.task('testPlugin') << {
println "## This is my first gradle plugin in testPlugin task"
}
println "** This is my first gradle plugin"
}
}
前面我们已经自定义好了插件,接下来就是要打包到Maven库里面去了,你可以选择打包到本地,或者是远程服务器中。在我们自定义Module目录下的build.gradle添加如下代码:
//group和version在后面使用自定义插件的时候会用到
group='com.android.hq.testplugin'
version='1.0.0'
uploadArchives {
repositories {
mavenDeployer {
//提交到远程服务器:
//repository(url: "http://www.xxx.com/repos") {
// authentication(userName: "admin", password: "admin")
//}
//本地的Maven地址设置为/mnt/TestRepos/
repository(url: uri('/mnt/TestRepos/'))
}
}
}
现在我们定义好了打包地址以及打包相关配置,还需要我们让这个打包 task 执行。点击 AndroidStudio 右侧的 gradle 工具,如下图所示:
可以看到有 uploadArchives 这个 Task,双击 uploadArchives 就会执行打包上传。执行完成后,去我们的 Maven 本地仓库查看一下:
hq@EF-hq:/mnt/TestRepos/com/android/hq/testplugin/testplugin/1.0.0$ ls
testplugin-1.0.0.jar testplugin-1.0.0.jar.md5 testplugin-1.0.0.jar.sha1 testplugin-1.0.0.pom testplugin-1.0.0.pom.md5 testplugin-1.0.0.pom.sha1
其中,/com/android/hq/testplugin/ 这几层目录是由我们的 group 指定,testplugin 是模块的名称,1.0.0是版本号(version指定)。
首先我们需要在使用的 Module 的build.gradle文件中里面指定Maven地址、自定义插件的名称以及依赖包名。代码如下:
//com.android.hq.testplugin.TestPlugin为resources/META-INF/gradle-plugins 下的properties文件名称
apply plugin: 'com.android.hq.testplugin'
buildscript {
repositories {
maven {
//本地Maven仓库地址
url uri('/mnt/TestRepos/')
}
}
dependencies {
//格式为-->group:module:version
classpath 'com.android.hq.testplugin:testplugin:1.0.0'
}
}
然后就可以测试使用情况了。
和前面的方法一样,不再详述。
http://www.jianshu.com/p/d53399cd507b