Gradle基礎概念
-
projects
( 項目 ):每一個構建都是由一個或多個 projects 構成的,安卓工程每個module工程就是一個project退客,對應的是module里面的build.gradle
文件
-
tasks
( 任務 ):每一個 project 是由一個或多個 tasks 構成的. 一個 task 代表一些更加細化的構建
Gradle 擴展
如上圖project盘寡,project是實現(xiàn)了ExtensionAware的矮慕。ExtensionAware的getExtensions方法返回了一個ExtensionContainer恳啥,也就是一個可以擴展容器亏拉。通過ExtensionContainer我們可以去創(chuàng)建擴展。
org.gradle.api.tasks.TaskContainer接口:
//查找task
findByPath(path: String): Task
getByPath(path: String): Task
getByName(name: String): Task
withType(type: Class): TaskCollection
matching(condition: Closure): TaskCollection
//創(chuàng)建task
create(name: String): Task
create(name: String, configure: Closure): Task
create(name: String, type: Class): Task
create(options: Map<String, ?>): Task
create(options: Map<String, ?>, configure: Closure): Task
按照文檔坐桩,我們來試試
注釋掉配置里面的內容尺棋,我們再看看運行打印結果
從上圖可以看出,如果我們沒有配置撕攒,就會使用默認的陡鹃,這種配置的寫法是不是似曾相識,譬如我們經(jīng)常要改動的android{}里面的版本號之類的抖坪,android 它就是一個 Extension,看看源碼就知道android 實際就是 AppExtension 這個類萍鲸。所以 android 能配置什么屬性就可以在 AppExtension查找即可。
/**
* Gradle plugin class for 'application' projects.
*/
public class AppPlugin extends BasePlugin implements Plugin<Project> {
protected BaseExtension createExtension(
@NonNull Project project,
@NonNull Instantiator instantiator,
@NonNull AndroidBuilder androidBuilder,
@NonNull SdkHandler sdkHandler,
@NonNull NamedDomainObjectContainer<BuildType> buildTypeContainer,
@NonNull NamedDomainObjectContainer<ProductFlavor> productFlavorContainer,
@NonNull NamedDomainObjectContainer<SigningConfig> signingConfigContainer,
@NonNull ExtraModelInfo extraModelInfo) {
return project.getExtensions()
.create(
"android",//"android" 就是 Extension 的名字
AppExtension.class,
project,
instantiator,
androidBuilder,
sdkHandler,
buildTypeContainer,
productFlavorContainer,
signingConfigContainer,
extraModelInfo);
}
Gradle 本地腳本插件
有時候我們不希望很多把很多gradle腳本寫在build.gradle里面擦俐,通過apply就可以依賴本地其他gradle文件脊阴,就如同java里面import一樣
Gradle 遠程腳本插件
其實和本地插件一樣,只不過是依賴的遠程http的url地址蚯瞧。有時候有些腳本我們需要動態(tài)的改變的時候使用這種方法嘿期,譬如我們的依賴組件的版本號統(tǒng)一管理,所有同一個版本發(fā)布的組件引用同一個分支的遠程gradle文件埋合。
Gradle 二進制插件
Gradle插件主要是實現(xiàn)Plugin接口apply方法备徐,下面是之前我寫的一個檢測項目中圖片是否全部是webp的插件,因為webp體積小甚颂,用于體積優(yōu)化的任務插件
- 在項目工程的根目錄下創(chuàng)建buildSrc目錄蜜猾,這個名字不能錯,必須是buildSrc振诬。創(chuàng)建完之后蹭睡,rebuild一下工程,會在buildSrc下生成一些目錄
- 在buildSrc目錄下創(chuàng)建
build.gradle.kts
文件赶么,用kotlin寫插件
plugins {
`kotlin-dsl`
}
repositories {
jcenter()
}
- 在buildSrc目錄下創(chuàng)建
src/main/kotlin
目錄,目錄名字一定不要錯<缁怼!辫呻!清钥,然后編寫插件
- 在 main 目錄下新建 resources 目錄,然后在 resources 目錄里面再新建 META-INF 目錄放闺,再在 META-INF 里面新建 gradle-plugins 目錄循捺。最后在 gradle-plugins 目錄里面新建 properties 文件,注意這個文件的命名雄人,你可以隨意取名,但是后面使用這個插件的時候,會用到這個名字础钠。比如恰力,你取名為com.example.harry.properties,那么這個插件的id就是com.example.harry
- 在app中進行引用
- 我們還可以通過另一種方式來生成插件
gradlePlugin {
plugins {
create("HarryPlugin2") {
//插件id,用于引用插件,如:apply plugin: 'id'
id = "com.example.harry2"
//指定插件的實現(xiàn)類
implementationClass = "com.example.harry.HarryPlugin2"
}
}
}
- 我們還可以通過這個buildSrc包來進行依賴管理
獨立插件maven的發(fā)布
- 直接新建一個module旗吁,不需要以buildSrc命令踩萎。新建module默認的gradle里面內容刪除掉,添加maven依賴很钓,編寫插件后即可發(fā)布本地maven倉庫
發(fā)布完成后即可在項目中引用
上面是使用的本地倉庫香府,如果有maven服務器,將url替換成遠程maven即可码倦。maven服務搭建請點擊這里