Gradle基礎(chǔ)概念
-
projects( 項(xiàng)目 ):每一個(gè)構(gòu)建都是由一個(gè)或多個(gè) projects 構(gòu)成的,安卓工程每個(gè)module工程就是一個(gè)project,對(duì)應(yīng)的是module里面的build.gradle文件
-
tasks( 任務(wù) ):每一個(gè) project 是由一個(gè)或多個(gè) tasks 構(gòu)成的. 一個(gè) task 代表一些更加細(xì)化的構(gòu)建
Gradle 擴(kuò)展
如上圖project,project是實(shí)現(xiàn)了ExtensionAware的。ExtensionAware的getExtensions方法返回了一個(gè)ExtensionContainer,也就是一個(gè)可以擴(kuò)展容器。通過ExtensionContainer我們可以去創(chuàng)建擴(kuò)展。
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
按照文檔,我們來試試
注釋掉配置里面的內(nèi)容,我們?cè)倏纯催\(yùn)行打印結(jié)果
從上圖可以看出,如果我們沒有配置,就會(huì)使用默認(rèn)的,這種配置的寫法是不是似曾相識(shí),譬如我們經(jīng)常要改動(dòng)的android{}里面的版本號(hào)之類的,android 它就是一個(gè) Extension,看看源碼就知道android 實(shí)際就是 AppExtension 這個(gè)類。所以 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 本地腳本插件
有時(shí)候我們不希望很多把很多gradle腳本寫在build.gradle里面,通過apply就可以依賴本地其他gradle文件,就如同java里面import一樣
Gradle 遠(yuǎn)程腳本插件
其實(shí)和本地插件一樣,只不過是依賴的遠(yuǎn)程http的url地址。有時(shí)候有些腳本我們需要?jiǎng)討B(tài)的改變的時(shí)候使用這種方法,譬如我們的依賴組件的版本號(hào)統(tǒng)一管理,所有同一個(gè)版本發(fā)布的組件引用同一個(gè)分支的遠(yuǎn)程gradle文件。
Gradle 二進(jìn)制插件
Gradle插件主要是實(shí)現(xiàn)Plugin接口apply方法,下面是之前我寫的一個(gè)檢測(cè)項(xiàng)目中圖片是否全部是webp的插件,因?yàn)閣ebp體積小,用于體積優(yōu)化的任務(wù)插件
- 在項(xiàng)目工程的根目錄下創(chuàng)建buildSrc目錄,這個(gè)名字不能錯(cuò),必須是buildSrc。創(chuàng)建完之后,rebuild一下工程,會(huì)在buildSrc下生成一些目錄
- 在buildSrc目錄下創(chuàng)建
build.gradle.kts文件,用kotlin寫插件
plugins {
`kotlin-dsl`
}
repositories {
jcenter()
}
- 在buildSrc目錄下創(chuàng)建
src/main/kotlin目錄,目錄名字一定不要錯(cuò)?。?!,然后編寫插件
- 在 main 目錄下新建 resources 目錄,然后在 resources 目錄里面再新建 META-INF 目錄,再在 META-INF 里面新建 gradle-plugins 目錄。最后在 gradle-plugins 目錄里面新建 properties 文件,注意這個(gè)文件的命名,你可以隨意取名,但是后面使用這個(gè)插件的時(shí)候,會(huì)用到這個(gè)名字。比如,你取名為com.example.harry.properties,那么這個(gè)插件的id就是com.example.harry
- 在app中進(jìn)行引用
- 我們還可以通過另一種方式來生成插件
gradlePlugin {
plugins {
create("HarryPlugin2") {
//插件id,用于引用插件,如:apply plugin: 'id'
id = "com.example.harry2"
//指定插件的實(shí)現(xiàn)類
implementationClass = "com.example.harry.HarryPlugin2"
}
}
}
- 我們還可以通過這個(gè)buildSrc包來進(jìn)行依賴管理
獨(dú)立插件maven的發(fā)布
- 直接新建一個(gè)module,不需要以buildSrc命令。新建module默認(rèn)的gradle里面內(nèi)容刪除掉,添加maven依賴,編寫插件后即可發(fā)布本地maven倉庫
發(fā)布完成后即可在項(xiàng)目中引用
上面是使用的本地倉庫,如果有maven服務(wù)器,將url替換成遠(yuǎn)程maven即可。maven服務(wù)搭建請(qǐng)點(diǎn)擊這里