用AndroidStudio开发自定义 Gradle plugin

LisHemmant 5年前
   <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>