用AndroidStudio开发自定义 Gradle plugin
LisHemmant
8年前
<p>本文内容包括: </p> <ul> <li> <p>利用AndroidStudio,编写自定义Gradle plugin</p> </li> <li> <p>MavenDeployer 发布plugin</p> </li> <li> <p>使用Gradle plugin</p> </li> </ul> <h2>简介</h2> <p>项目中引入自定义Gradle plugin一般有三种方法: </p> <ol> <li> <p>直接写在 build.gradle中.</p> </li> <li> <p>plugin源码放到rootProjectDir/buildSrc/src/main/groovy目录下</p> </li> <li> <p>plugin打包成jar, 发布到maven仓库, 然后项目通过Build Script依赖jar的形式引入</p> </li> </ol> <p>下面介绍的是第3种自定义Gradle插件的方式.</p> <h2>一. 用AndroidStudio中写plugin</h2> <h3>1.新建一个Android工程</h3> <h3>2.在这个工程里面,新建一个Android Library</h3> <p>先起名叫cooker-plugin吧, 我们将会用这个library写Gradle plugin</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/76dde8895500710ab6a828f011d7115b.jpg"></p> <h3>3.建立plugin的目录结构</h3> <p>把这个cooker-plugin中默认产生的文件都删除, 然后按照下面结构新建文件</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/8ee08280a3aaca00f27cf9a6abcef478.jpg"></p> <p>解释</p> <p>1.因为我们用Groovy写的插件, 插件代码放在 src/main/groovy下</p> <p>2.在src/main/resources/META-INF/gradle-plugins 里声明plugin信息</p> <p>比如:新建 cooker-plugin.properties 文件,内容如下 </p> <pre> <code class="language-java">implementation-class=com.helen.plugin.CookerPlugin</code></pre> <p>这里:</p> <p>"cooker-plugin" 是插件名称;</p> <p>"com.helen.plugin.CookerPlugin" 是对应的插件实现类 </p> <p>3.build.gradle 声明用groovy开发</p> <pre> <code class="language-java">apply plugin: 'groovy' dependencies { compile gradleApi() compile localGroovy() } repositories { mavenCentral() }</code></pre> <h3>4.实现插件</h3> <p>实现plugin,其实就是需要继承实现Plugin 的接口 </p> <pre> <code class="language-java">package com.helen.plugin import org.gradle.api.Plugin import org.gradle.api.Project public class CookerPlugin implements Plugin<Project> { void apply(Project project) { //这里实现plugin的逻辑 //巴拉巴拉巴拉 println "hello, this is cooker plugin!" //cooker-plugin //比如这里加一个简单的task project.task('cooker-test-task') << { println "hello, this is cooker test task!" } } }</code></pre> <h3>5.一个简单的plugin就写好了</h3> <p>在cooker-plugin项目中, build一下.</p> <p>就能在build/libs下生成对应的plugin插件了</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/dd09eb835285763adbfec6d8b544a760.jpg"></p> <p>这个插件就能使用了. 可以发布在本地仓库或者Maven仓库.</p> <h2>二. mavenDeployer发布插件</h2> <p>下面介绍一下利用mavenDeployer发布在本地仓库.</p> <h3>1. 引入 mavenDeplayer插件</h3> <p>修改cooker-plugin的build.gradle, 修改后如下:</p> <pre> <code class="language-java">apply plugin: 'groovy' //添加maven plugin, 用于发布我们的jar apply plugin: 'maven' dependencies { compile gradleApi() compile localGroovy() } repositories { mavenCentral() } //设置maven deployer uploadArchives { repositories { mavenDeployer { //设置插件的GAV参数 pom.groupId = 'com.helen.plugin' pom.artifactId = 'cooker-plugin' pom.version = 1.0 //文件发布到下面目录 repository(url: uri('../release')) } } }</code></pre> <h3>2.用uploadArchices发布</h3> <p>运行uploadArchives. 就能在设置的仓库路径中生成 cooker-plugin了</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/fc231bd746cda97c30027798f9a2dff1.jpg"></p> <h2>三. 使用gradle plugin</h2> <h3>1.在build.gradle引入 cooker-plugin</h3> <pre> <code class="language-java">apply plugin: 'com.android.application' //使用cooker-plugin apply plugin: 'cooker-plugin' buildscript { repositories { maven { //cooker-plugin 所在的仓库 //这里是发布在本地文件夹了 url uri('../release') } } dependencies { //引入cooker-plugin classpath 'com.helen.plugin:cooker-plugin:1.0' } }</code></pre> <h3>2. 我们编译App的时候,cooker-plugin就会介入了</h3> <p>每次clean/build时, 在Gradle Console可以看到我们的log</p> <p>hello, this is cooker plugin!</p> <pre> <code class="language-java">Configuration on demand is an incubating feature. hello, this is cooker plugin! Incremental java compilation is an incubating feature. :app:preBuild UP-TO-DATE</code></pre> <h3>3.使用cooker-plugin中定义的task</h3> <p>前面demo中, 我们新建了一个task: cooker-test-task , 他简单输出一句log.下面测试运行一下这个task.</p> <p>在控制台输入 gradle cooker-test-task 运行结果如下 </p> <p style="text-align:center"><img src="https://simg.open-open.com/show/6eb7fc8e9f7f2195a2d365176bebe1bf.jpg"></p> <h2>四. 总结</h2> <p>Demo地址-Github : </p> <p>https://github.com/helen-x/gradle-plugin-demo</p> <p>到此为止, 自定义Gradle plugin就介绍完了.</p> <p>结合AndroidStudio, 自定义Gradle plugin可以完成很多功能. </p> <p>比如cooker的plugin完成了:</p> <p>1)添加编译依赖</p> <p>2)进行Aspecj编译</p> <p>3)自动生成混淆配置</p> <p> </p> <p> </p> <p>来自:http://mp.weixin.qq.com/s/HJyYMGmVIpblJXJNKK1JTw</p> <p> </p>