----《Android Gradle 權(quán)威指南》學(xué)習(xí)筆記
總目錄:Gradle 學(xué)習(xí)系列 -- 目錄
上一篇:Gradle 任務(wù) -- 任務(wù)規(guī)則
1 插件的作用
1.1 插件會擴展項目的功能拴袭,幫助我們在項目的構(gòu)建中做很多事情:
(1) 可以在項目中添加任務(wù)麻献,比如測試、編譯世落、打包。
(2) 可以在項目中添加依賴配置糟需,實現(xiàn)項目在構(gòu)建過程中的依賴屉佳。比如依賴的第三方庫。
(3) 可以向項目中現(xiàn)有的對象類型添加新的擴展屬性洲押、方法等武花。可以使用它們幫助我們配置杈帐、優(yōu)化構(gòu)建体箕。比如 AndroidStudio 中 android{} 這個配置塊就是 Android Gradle 插件為 Project 對象添加的一個擴展专钉。
(4) 可以對項目進行一些約定,比如應(yīng)用 Java 插件之后累铅, 約定 src/main/java 目錄下是源代碼的位置跃须,在編譯的時候也是編譯這個目錄下的 Java 源碼文件。
1.2 對于插件娃兽,只需要按照它約定的方式菇民,使用它提供的任務(wù)、方法或者擴展投储,就可以對項目進行構(gòu)建第练。
2 應(yīng)用一個插件
在使用一個插件之前需要先應(yīng)用它,把它應(yīng)用到項目中玛荞,這樣就可以使用它了复旬。
插件的應(yīng)用都是通過 Project.apply() 方法完成的,apply() 方法有好幾種用法冲泥,并且插件也分為二進制插件和腳本插件驹碍。
2.1 應(yīng)用二進制插件
2.1.1 二進制插件就是實現(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 是默認導(dǎo)入的,所以可以去掉包名直接寫為:
apply plugin:JavaPlugin
上面的3中寫法是等價的涎跨,因為第一種容易記憶洼冻,所以用的比較多。第二種寫法一般適用于在 build 文件中自定義的插件隅很,也就是腳本插件撞牢。
2.1.3 二進制插件一般都是被打包成 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)用插件腳本蟹但,就是把這個腳本加載進來躯泰。和二進制插件不同的是它使用的是 from 關(guān)鍵字,后面緊跟一個腳本文件矮湘。這個腳本文件可以是本地的斟冕,也可以是網(wǎng)絡(luò)的口糕,如果是網(wǎng)絡(luò)上的則要使用 HTT PURL缅阳。
2.2.3 雖然它不是一個真正的插件,但是也有很大的作用景描。它是腳本文件模塊化的基礎(chǔ)十办,可以把內(nèi)容很多的腳本文件進行分塊、分段整理超棺,拆分成一個個共用向族、職責(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 對象的方法夜矗、屬性等進行配置。
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 包的二進制插件让虐,在應(yīng)用的時候紊撕,必須先在 buildscript{} 里配置其 classpath 才能使用,不像 Gradle 內(nèi)置的插件赡突。比如在 AndroidStudio 中:2.4.2 buildscript{} 塊是一個在構(gòu)建項目之前对扶,為項目進行前期準備和初始化相關(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 中都是這種方式了到千。