----《Android Gradle 權(quán)威指南》學(xué)習(xí)筆記
總目錄:Gradle 學(xué)習(xí)系列 -- 目錄
上一篇:Gradle 任務(wù) -- 任務(wù)規(guī)則
1 插件的作用
1.1 插件會擴(kuò)展項目的功能,幫助我們在項目的構(gòu)建中做很多事情:
(1) 可以在項目中添加任務(wù),比如測試、編譯、打包。
(2) 可以在項目中添加依賴配置,實現(xiàn)項目在構(gòu)建過程中的依賴。比如依賴的第三方庫。
(3) 可以向項目中現(xiàn)有的對象類型添加新的擴(kuò)展屬性、方法等??梢允褂盟鼈儙椭覀兣渲?、優(yōu)化構(gòu)建。比如 AndroidStudio 中 android{} 這個配置塊就是 Android Gradle 插件為 Project 對象添加的一個擴(kuò)展。
(4) 可以對項目進(jìn)行一些約定,比如應(yīng)用 Java 插件之后, 約定 src/main/java 目錄下是源代碼的位置,在編譯的時候也是編譯這個目錄下的 Java 源碼文件。
1.2 對于插件,只需要按照它約定的方式,使用它提供的任務(wù)、方法或者擴(kuò)展,就可以對項目進(jìn)行構(gòu)建。
2 應(yīng)用一個插件
在使用一個插件之前需要先應(yīng)用它,把它應(yīng)用到項目中,這樣就可以使用它了。
插件的應(yīng)用都是通過 Project.apply() 方法完成的,apply() 方法有好幾種用法,并且插件也分為二進(jìn)制插件和腳本插件。
2.1 應(yīng)用二進(jìn)制插件
2.1.1 二進(jìn)制插件就是實現(xiàn)了 org.gradle.api.Plugin 接口的插件,它們可以有 plugin.id。
2.1.2 舉個例子:
apply plugin:'java'
上面的語句把 Java 插件應(yīng)用到了項目中,其中 'java' 是 Java 插件的 plugin id,它是唯一的。對于 Gradle 自帶的核心插件都有一個容易記憶的名稱,稱為 plugin id,比如上面的 java。其實它對應(yīng)的類型是 org.gradle.api.plugins.JavaPlugin。所以也可以寫成:
apply plugin: org.gradle.api.plugins.JavaPlugin
又因為包 org.gradle.api.plugins 是默認(rèn)導(dǎo)入的,所以可以去掉包名直接寫為:
apply plugin:JavaPlugin
上面的3中寫法是等價的,因為第一種容易記憶,所以用的比較多。第二種寫法一般適用于在 build 文件中自定義的插件,也就是腳本插件。
2.1.3 二進(jìn)制插件一般都是被打包成 jar 文件獨立發(fā)布的,比如自定義的插件,在發(fā)布的時候可以為其指定 plugin id。 這個 plugin id 最好是一個全限定名稱,就像包名一樣,這樣發(fā)布的插件 plugin id 就不會重發(fā)。
2.2 應(yīng)用腳本插件
2.2.1 比如在項目根目錄下有以下兩個 gradle 文件:
build.gradle:
apply from:'version.gradle'
task testVersion{
doLast{
println "APP 版本是: ${versionName}, 版本號是:${versionCode}"
}
}
version.gradle:
ext{
versionName = "APP1.0.1"
versionCode = 1.0
}
在命令行中執(zhí)行命令:gradle testVersion
打印結(jié)果:
> Task :testVersion
APP 版本是: APP1.0.1, 版本號是:1.0
2.2.2 其實上面的 version.gradle 算不上一個插件,它只是一個腳本。應(yīng)用插件腳本,就是把這個腳本加載進(jìn)來。和二進(jìn)制插件不同的是它使用的是 from 關(guān)鍵字,后面緊跟一個腳本文件。這個腳本文件可以是本地的,也可以是網(wǎng)絡(luò)的,如果是網(wǎng)絡(luò)上的則要使用 HTT PURL。
2.2.3 雖然它不是一個真正的插件,但是也有很大的作用。它是腳本文件模塊化的基礎(chǔ),可以把內(nèi)容很多的腳本文件進(jìn)行分塊、分段整理,拆分成一個個共用、職責(zé)分明的文件,然后通過 apply from 來使用它們。比如可以把常用的函數(shù)放在一個 util.gradle 文件中。
2.3 apply() -- 閉包的方式
2.3.1 Project.apply() 方法有3中用法,它們接受不同的參數(shù):
// apply 方法
void apply(Map<String, ?> options);
void apply(Closure closure);
void apply(Action<? super ObjectConfigurationAction> action);
閉包的方式如下:
apply{
plugin 'java'
}
該閉包被用來配置一個 ObjectConfigurationAction 對象,所以可以在閉包里面使用 ObjectConfigurationAction 對象的方法、屬性等進(jìn)行配置。
2.3.2 舉個栗子:
apply(new Action<ObjectConfigurationAction>() {
@Override
void execute(ObjectConfigurationAction objectConfigurationAction) {
objectConfigurationAction.plugin('java')
}
})
2.4 應(yīng)用第三方發(fā)布的插件
2.4.1 第三方發(fā)布的一般都是 jar 包的二進(jìn)制插件,在應(yīng)用的時候,必須先在 buildscript{} 里配置其 classpath 才能使用,不像 Gradle 內(nèi)置的插件。比如在 AndroidStudio 中:
2.4.2 buildscript{} 塊是一個在構(gòu)建項目之前,為項目進(jìn)行前期準(zhǔn)備和初始化相關(guān)配置依賴的代碼塊。配置好需要的依賴,就可以在項目中應(yīng)用插件了:
plugins {
id 'com.android.application'
}
如果沒有提前在 buildscript{} 里配置依賴的 classpath,會提示找不到這個插件。
2.4.3 根據(jù)上面的內(nèi)容:
(1) 如果在 AndroidStudio 的根目錄的 build.gradle 文件中的 buildscript{} 塊中注釋掉
classpath "com.android.tools.build:gradle:7.0.4" 這一行,則構(gòu)建時,則在 app 目錄下的 build.gradle 文件中 id 'com.android.application' 這一行會報錯
(2) 如果在 app 目錄下的 build.gradle 文件中注釋掉 id 'com.android.application' 這一行,則代碼塊 android{}會報錯
2.5 通過 plugin DSL 應(yīng)用插件
plugin DSL 是一種比較新的插件應(yīng)用方式,具體的格式為:
plugins {
id 'java'
}
這樣就應(yīng)用了 java 插件,看著更簡潔一些,更符合 DSL 規(guī)范。現(xiàn)在 IDE 中都是這種方式了。