Android Gradle Plugin
Android Gradle Plugin 有兩種形式
- 直接在build.gradle/創(chuàng)建x.gradle中開發(fā)
- 實(shí)現(xiàn)
Plugin
重寫build 過程
這里講解怎么開發(fā)自定義插件
首先創(chuàng)建Gradle Plugin 工程
- 為了方便測(cè)試先創(chuàng)建一個(gè)Android 工程送火,然后創(chuàng)建一個(gè)Android library Module工程
![創(chuàng)建module](https://raw.githubusercontent.com/goodbranch/AndroidNote/master/note/gradle/module-1.png)
- 刪除如圖中箭頭所指目錄和文件
![刪除無效目錄](https://raw.githubusercontent.com/goodbranch/AndroidNote/master/note/gradle/module-2.png)
-
build.gradle
中改成groovy方式
apply plugin: 'groovy'
dependencies {
compile gradleApi()
compile localGroovy()
}
自定義Gradle Plugin,在main目錄下創(chuàng)建groovy目錄先匪,這個(gè)目錄下創(chuàng)建創(chuàng)建自己的代碼
以刪除log日志為例
![Groovy 項(xiàng)目結(jié)構(gòu)](https://raw.githubusercontent.com/goodbranch/AndroidNote/master/note/gradle/groovy-project.png)
1.繼承 gradlePlugin
,類的后綴不再是.java而是.groovy
class DelLogPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.extensions.create('dellogExtension', DelLogExtension);
project.afterEvaluate {
//在gradle 構(gòu)建完之后執(zhí)行
project.logger.error("dellogExtension : " + project.dellogExtension.sourceDir);
def rootDir = project.projectDir.toString().plus(project.dellogExtension.sourceDir);
project.logger.error(rootDir);
DelLogUtil.delLog(new File(rootDir));
}
project.task('dellog', {
project.logger.error("dellogExtension : " + project.dellogExtension.sourceDir);
def rootDir = project.projectDir.toString().plus(project.dellogExtension.sourceDir);
project.logger.error(rootDir);
DelLogUtil.delLog(new File(rootDir));
})
}
}
afterEvaluate
是在gradle構(gòu)建完后自動(dòng)執(zhí)行的弃衍,但task需要手動(dòng)執(zhí)行
一個(gè)插件中可以創(chuàng)建多個(gè)Task,如代碼中的dellog
呀非,可以在控制臺(tái)執(zhí)行gradle -q dellog
,也可以在gradle圖形界面執(zhí)行
![圖形界面執(zhí)行task](https://raw.githubusercontent.com/goodbranch/AndroidNote/master/note/gradle/gradle-task-ui.png)
2. 創(chuàng)建可以輸入的Gradle 插件
很多時(shí)候我們需要輸入?yún)?shù)镜盯,然后根據(jù)參數(shù)來做處理,處理如下:
project.extensions.create(...,...); 前面是Name岸裙,后面是Model,model中在gralde script 中鍵對(duì)上就可以。
class DelLogExtension {
String sourceDir;
}
class DelLogPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.extensions.create('dellogExtension', DelLogExtension);
......
然后在app 下的build.gradle中
dellogExtension.sourceDir = '/src'
或
dellogExtension {
sourceDir = '/src'
}
![使用輸入](https://raw.githubusercontent.com/goodbranch/AndroidNote/master/note/gradle/use-extension.png)
3. 在main下創(chuàng)建resources
目錄
src/main/resources/META-INF/gradle-plugins/com.branch.plugin.dellog.properties
xxx.properties
將來作為apply plugin: xxx 插件名稱速缆,這里的目錄結(jié)構(gòu)不能錯(cuò)降允,先有META-INF
再有gradle-plugins
內(nèi)容:
`implementation-class=com.branch.dellog.DelLogPlugin(繼承Plugin的類,插件的入口類)`
4. 發(fā)布到本地倉庫
在當(dāng)前l(fā)ib項(xiàng)目build.gradle中增加maven支持
apply plugin: 'maven'
repositories {
mavenCentral()
}
然后增加對(duì)應(yīng)的maven deployer
//設(shè)置maven deployer
uploadArchives {
repositories {
mavenDeployer {
//設(shè)置插件的GAV參數(shù)
pom.groupId = 'com.branch.plugin'
pom.artifactId = 'dellog'
pom.version = '1.0.0'
//文件發(fā)布到下面目錄
repository(url: uri('../repo'))
}
}
}
這里設(shè)置發(fā)布到上一個(gè)目錄的repo
中,同時(shí)可以查看gradle task中有一個(gè)名為uploadArchives的task
![發(fā)布到本地task](https://raw.githubusercontent.com/goodbranch/AndroidNote/master/note/gradle/maven-local-task.png)
執(zhí)行就能在repo
中查看到相應(yīng)jar包
![查看本地倉庫](https://raw.githubusercontent.com/goodbranch/AndroidNote/master/note/gradle/maven-local-resuslt.png)
5. 使用本地倉庫
在project 的build.gradle 中buildscript
中增加本地倉庫地址
buildscript {
repositories {
jcenter()
maven {
url uri("/repo")
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.2'
classpath 'com.branch.plugin:dellog:1.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
然后在app 的build.gradle中增加plugin
apply plugin: 'com.branch.plugin.dellog'