内容简介: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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Gradle插件开发系列之开发第一个gradle插件
- (是时候开发属于自己的插件了)数据校验插件开发指南
- IDEA 插件:多线程文件下载插件开发
- 从头开发一个Flutter插件(二)高德地图定位插件
- Gradle插件开发系列之gradle插件调试方法
- WordPress插件开发 -- 在插件使用数据库存储数据
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Persuasive Technology
B.J. Fogg / Morgan Kaufmann / 2002-12 / USD 39.95
Can computers change what you think and do? Can they motivate you to stop smoking, persuade you to buy insurance, or convince you to join the Army? "Yes, they can," says Dr. B.J. Fogg, directo......一起来看看 《Persuasive Technology》 这本书的介绍吧!