title: Android Gradle插件入门
abbrlink: base/skill/gradle/doc
date: 2018/2/26 10:10:10
updated: 2018/2/26 11:10:10
comments: true
tags:

  • Android
  • 基础
    categories:
  • Android

文章目录

    • 自定义gradle插件
      • 配置目录
      • 编写插件并运行
      • 打包插件
    • Demo下载

自定义gradle插件

配置目录

项目根目录下新建buildSrc目录。跟app module平级。然后新建如下的文件和目录。

├── buildSrc│   ├── build.gradle│   └── src│       └── main│           ├── groovy│               └── com│                   └── jady│                       └── gradle│           └── resources│               └─── META-INF│                   └─── gradle-plugins│                        ├── com.jady.plugin.properties

这个目录树层结构可以用 tree 命令打印出来,在 Mac OSX 环境下需要使用 brew install tree 安装这个包,然后在指定目录下执行tree命令就会看到目录树结构输出了。

com.jady.plugin.properties这个文件名可以自定义,在应用插件的时候需要用到,如下所示:

apply plugin: 'com.jady.plugin'

groovy目录下的包名也可以自定义,这里面主要存放groovy代码文件。

目录建好之后,在项目根目录的settings.gradle中添加':buildSrc',将buildSrc设置为项目的一个module。

编辑 buildSrc 中的 build.gradle 文件。

buildSrc/build.gradle

apply plugin: 'groovy'apply plugin: 'maven'dependencies {    compile gradleApi()    compile localGroovy()}repositories {    mavenCentral()}

编写插件并运行

groovy目录的com.jady.gradle包下新建一个HelloWorld.groovy文件:

package com.jady.gradleimport org.gradle.api.Pluginimport org.gradle.api.Projectclass HelloWorld implements Plugin {    void apply(Project project) {        project.task('hello') {            doLast {                println 'Hello World'            }        }    }}

编辑com.jady.plugin.properties文件

implementation-class=com.jady.gradle.HelloWorld

如果不熟悉 groovy 语法,可以参考文末参考文献中的精通 Groovy,这个教程虽然老,但是真的好,一步一步带领读者入门 groovy 。

然后在 app module 的 build.gradle 文件中应用插件:

apply plugin: 'com.jady.plugin'

sync 工程后,可以在:app->Tasks->other中看到我们刚刚定义的 task hello

双击hello,可以看到控制台打印了Hello World

接下来我们开始编写 ExtensionTaskExtension 用于定义属性,与build.gradle配置的属性对应。

CustomExtension.groovy

package com.jady.gradleclass CustomExtension {    String message    int version    @Override    public String toString() {        return "CustomExtension{" +                "message='" + message + '\'' +                ", version=" + version +                '}';    }}

CustomTask.groovy

package com.jady.gradleimport org.gradle.api.DefaultTaskimport org.gradle.api.tasks.TaskActionclass CustomTask extends DefaultTask {    @TaskAction    void test() {        println(project.custom.toString());    }}

HelloWorld.groovy

package com.jady.gradleimport org.gradle.api.Pluginimport org.gradle.api.Projectclass HelloWorld implements Plugin {    void apply(Project project) {        project.extensions.create("custom", CustomExtension)        project.tasks.create("hello", CustomTask)    }}

HelloWorld.groovy中,“custom”对应build.gradle文件中配置的自定义信息名字,“hello”对应task列表中的hellotask。

build.gradle

apply plugin: 'com.jady.plugin'...custom{    message = 'hello gradle plugin'    version = 1}

sync 一下,重新执行 hello ,可以发现控制台输出的变化了,如果有问题,请仔细检查下是不是哪一步做错了。

打包插件

我们先发布插件到本地仓库。

首先,编辑buildSrc/build.gradle文件。

buildSrc/build.gradle

apply plugin: 'groovy'apply plugin: 'maven'dependencies {    compile gradleApi()    compile localGroovy()}repositories {    mavenCentral()}group='com.jady.gradle'version='0.1.0'archivesBaseName = 'customPlugin'uploadArchives {    repositories {        mavenDeployer {            repository(url: uri('../repo'))        }    }}

sync 一下工程,应该可以发现 gradle 任务列表中的:buildSrc下多了一个 upload 任务,运行里面的 uploadArchives 任务,可以发现在项目根目录下生成了 repo 文件夹,这个就是本地的仓库。

然后,修改项目根目录的 build.gradle 文件。

buildscript {        repositories {        google()        jcenter()        maven {            url uri('./repo')        }    }    dependencies {        classpath 'com.android.tools.build:gradle:3.0.1'        classpath 'com.jady.gradle:customPlugin:0.1.0'    }}

再次 sync 一下工程,然后运行 gradle 任务列表中的 hello 任务。

此时groovy文件的类名会提示错误,已存在同名文件,那是因为生成了库文件,删掉 buildSrc 下的 build 文件夹就好了,也可以不删,不影响开发。

可以通过注释项目根目录build.gradleclasspath 'com.jady.gradle:customPlugin:0.1.0'buildSrc 目录的 build.gradle 文件中的以下代码切换到开发模式。

group='com.jady.gradle'version='0.1.0'archivesBaseName = 'customPlugin'uploadArchives {    repositories {        mavenDeployer {            repository(url: uri('../repo'))        }    }}

学到这里,Gradle插件开发就算是入门了,如果你想了解更多,请参阅文末参考文献中的Writing Custom Plugins。

Demo下载

GradlePluginDemo

参考文献和相关资料

[1] eclipse_xu. Gradle自定义插件[OL]. http://blog.csdn.net/eclipsexys/article/details/50973205. 2016-04-22.

[2] Andrew Glover. 精通 Groovy[OL]. https://www.ibm.com/developerworks/cn/education/java/j-groovy/j-groovy.html. 2008-4-21.

[3] Google. Android gradle配置构建. https://developer.android.com/studio/build/index.html.

[4] Google. Android gradle插件指南. http://google.github.io/android-gradle-dsl/current/.

[5] Gradle. Writing Custom Plugins. https://docs.gradle.org/current/userguide/custom_plugins.html.

[6] huachao1001. 通过自定义Gradle插件修改编译后的class文件. http://blog.csdn.net/huachao1001/article/details/51819972.

[7] w3cschool. Groovy 基本语法. https://www.w3cschool.cn/groovy/groovy_basic_syntax.html.

更多相关文章

  1. Android(安卓)Studio NDK及so文件开发 以及常见错误
  2. Android上传图片到服务器,android-async-http上传图片到服务器
  3. Intent(open file) android
  4. Android(安卓)源代码编后的目录分析
  5. Android系统权限和root权限
  6. Android(安卓)Studio主要目录及文件简介
  7. Android(安卓)如何判断CPU是32位还是64位
  8. android判断是否禁用了录音权限
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android APN设置之切换网络
  2. Android 8 蓝牙打开过程
  3. Android ImageView的scaleType & setScal
  4. android 启动时自动设置default Launcher
  5. android adb 读写模式 挂载文件系统
  6. android 应用 安装 删除
  7. android_常用UI控件_02_EditText_01添加
  8. Android屏幕属性应用
  9. MTK Android 编译命令
  10. Android 倒影实现算法