gradle 插件开发

栏目: Java · 发布时间: 6年前

内容简介:gradle 插件开发

在使用Android Studio进行开发的时候,我们创建一个Android工程,会默认生成一个build.gradle脚本,打开脚本你会看到以下代码:

apply plugin: 'com.android.application'

如果我们创建一个Library的话,就会变成:

apply plugin: 'com.android.library'

其实这就是在gradle脚本引用android为我们提供的插件,plugin表示插件,’com.android.application’表示我们引用的插件名,通常是以包名来命名。

这个插件是怎么被引用进来的?我们可以在根目录找到另外一个build.gradle文件,打开可以看到以下代码:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}
  • buildscript方法是定义了全局的相关属性
  • repositories定义了jcenter作为仓库。一个仓库代表着你的依赖包的来源,例如maven仓库。
  • dependencies用来定义构建过程。
  • classpath ‘com.android.tools.build:gradle:2.0.0’,就是将远程的插件下载到本地并将其构建到我们工程当中。

Gradle 插件开发

apply plugin: 'com.android.library'
apply plugin: 'com.android.application'

这些都是插件 ,我们可以自己定义一些插件方便构建项目

官网介绍

插件打包方式

Gradle 的插件有三种打包方式,主要是按照复杂程度和可见性来划分:

Build script

把插件写在 build.gradle 文件中,一般用于简单的逻辑,只在该 build.gradle 文件中可见

buildSrc 项目

将插件源代码放在 rootProjectDir/buildSrc/src/main/groovy 中,只对该项目中可见,适用于逻辑较为复杂,但又不需要外部可见的插件

独立项目

一个独立的 Groovy 和 Java 项目,可以把这个项目打包成 Jar 文件包,一个 Jar 文件包还可以包含多个插件入口,将文件包发布到托管平台上,供其他人使用。本文将着重介绍此类。

Build script 插件

在 build.gradle 直接加入

class ApkDistPlugin implements Plugin<Project> {
//创建一个Plugin就需要实现Plugin接口,并且重写它的apply方法,这个类当中就是用来实现插件的逻辑的,比如创建task,获取外部的参数都需要在这里面完成。
    @Override
    void apply(Project project) {
        project.task('apkdist') << {
            println 'hello, world!'
        }
    }
}

apply plugin: ApkDistPlugin

命令行运行

$ ./gradlew -p app/ apkdist
:app:apkdist
hello, world!

插件是一个类,继承自 org.gradle.api.Plugin 接口,重写 void apply(Project project) 方法,这个方法将会传入使用这个插件的 project 的实例,这是一个重要的 context

接受外部参数

这个参数的结构 收到 ApkDistExtension的约束

apkdistconf {
    nameMap { name ->
        println 'hello,' + name
        return name
    }
    destDir 'your-distribution-dir'
}

接受一个插件 name ,和目标路径

参数的内容后面继续完善。那这两个参数怎么传到插件内呢?

org.gradle.api.Project 有一个 ExtensionContainer getExtensions() 方法,可以用来实现这个传递。

声明参数类

声明一个 Groovy 类,有两个默认值为 null 的成员变量:

class ApkDistExtension {
Closure nameMap = null;
String destDir = null;
}

接受参数

project.extensions.create('apkdistconf', ApkDistExtension);
```	
	
要注意,create 方法的第一个参数就是你在 build.gradle 文件中的进行**参数配置的 dsl 的名字**,必须一致;第二个参数,就是参数类的名字。

###  获取和使用参数
在 create 了 extension 之后,如果传入了参数,则会携带在 project 实例中,

```java
def closure = project['apkdistconf'].nameMap;
closure('wow!');

println project['apkdistconf'].destDir

独立项目插件

创建项目

在 Android Studio 中新建 Java Library module “plugin”。

修改 build.gradle 文件

添加 Groovy 插件和对应的两个依赖。

//removed java plugin 
apply plugin: 'groovy'

dependencies {
    compile gradleApi()//gradle sdk
    compile localGroovy()//groovy sdk
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

修改项目文件夹

src/main 项目文件下:

  • 移除 java 文件夹,因为在这个项目中用不到 java 代码
  • 添加 groovy 文件夹,主要的代码文件放在这里
  • 添加 resources 文件夹,存放用于标识 gradle 插件的 meta-data

建立对应文件

注意:

groovy 文件夹中的类,一定要修改成 .groovy 后缀,IDE 才会正常识别。

resources/META-INF/gradle-plugins 这个文件夹结构是强制要求的,否则不能识别成插件。

io.github.xuyushi.properties 文件

如果写过 Java 的同学会知道,这是一个 Java 的 properties 文件,是 key=value 的格式。这个文件内容如下:

implementation-class=io.github.xuyushi.ApkDistPlugin

按其语义推断,是指定这个插件的入口类。

  • 英文敏感的同学可能会问了,为什么这个文件的承载文件夹是叫做 gradle-plugins,使用复数?没错,这里可以指定多个 properties 文件,定义多个插件,扩展性一流,可以参考 linkedin 的插件的组织方式。
  • 使用这个插件的时候,将会是这样:
apply plugin:'io.github.xuyushi.apkdist'

因此, com.asgradle.apkdist 这个字符串在这里,又称为这个插件的 id,不允许跟别的插件重复,取你拥有的域名的反向就不会错。

id 为properties 的名称

现在项目结构为

├── build.gradle
├── libs
├── plugin.iml
└── src
    └── main
        ├── groovy
        │   └── io
        │       └── github
        │           └── xuyushi
        │               ├── ApkDistExtension.groovy
        │               └── ApkDistPlugin.groovy
        └── resources
            └── META-INF
                └── gradle-plugins
                    └── io.github.xuyushi.properties

将 plugin module 传到本地 maven 仓库

添加 gradle.properties

PROJ_NAME=gradleplugin
PROJ_ARTIFACTID=gradleplugin
PROJ_POM_NAME=Local Repository

LOCAL_REPO_URL=file:///Users/xuyushi/Documents/Android/repo/

PROJ_GROUP=io.github.xuyushi.gradleplugin_test

PROJ_VERSION=1.0.0
PROJ_VERSION_CODE=1

PROJ_WEBSITEURL=http://xuyushi.github.io
PROJ_ISSUETRACKERURL=http://xuyushi.github.io
PROJ_VCSURL=http://xuyushi.github.io
PROJ_DESCRIPTION=demo apps for embracing android studio

PROJ_LICENCE_NAME=The Apache Software License, Version 2.0
PROJ_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
PROJ_LICENCE_DEST=repo

DEVELOPER_ID=xuyushi
DEVELOPER_NAME=xuyushi
DEVELOPER_EMAIL=xmuy166@gmail.com

在 build.gradle 添加上传功能

apply plugin: 'maven'

uploadArchives {
    repositories.mavenDeployer {
        repository(url: LOCAL_REPO_URL)
        pom.groupId = PROJ_GROUP
        pom.artifactId = PROJ_ARTIFACTID
        pom.version = PROJ_VERSION
    }
}

在 app module 中使用插件

在项目的 buildscript 添加插件作为 classpath

buildscript {
    repositories {
        maven{
            url 'file:///Users/your-user-name/Documents/Android/repo/'
        }
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0-alpha3'        
        classpath 'com.as-gradle.demo:gradleplugin:1.0.0'
    }
}

在 app module 中使用插件

apply plugin: 'com.asgradle.apkdist'

加 app gradle 文件中加上项目需要的参数结构

apkdistconf {
    nameMap { name ->
        println 'hello,' + name
        return name
    }
    destDir 'your-distribution-dir'
}

命令行运行

$ ./gradlew -p app apkdist
:app:apkdist
hello, world!
hello, wow!
your-distribution-directory

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

谷歌和亚马逊如何做产品

谷歌和亚马逊如何做产品

梅 (Chris Vander Mey) / 刘亦舟 / 人民邮电出版社 / 2014-6-1 / CNY 49.00

软件在交付之前,面临产品、方案、项目和工程管理等诸多挑战,如何做到游刃有余并打造出极致产品?本书作者曾任谷歌和亚马逊高级产品经理、现任Facebook产品经理,他将自己在达特茅斯学院钻研的理论知识和在领先的互联网公司十年的工作经验尽数总结在此,从定义产品开始,一步步指导你完成管理项目、迭代、发布、市场推广等交付流程,让你身临其境地体验到极致产品如何取得成功。 本书主要内容: 如何清晰定......一起来看看 《谷歌和亚马逊如何做产品》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具