為了解一些Andorid的構(gòu)建流程,有時(shí)候需要閱讀Android Gradle Plugin的相關(guān)源碼的。自己閱讀Android Gradle Plugin源碼主要經(jīng)歷了三個(gè)時(shí)期:
1、AOSP上打包源碼壓縮包,然后下載下來看
2、通過依賴相關(guān)庫,結(jié)合IntelliJ IDEA的快捷鍵:Command+左鍵、Alt+Command+F7 跟蹤源碼調(diào)用來看
3、repo下載AOSP構(gòu)建工具分支上的源碼,完整項(xiàng)目導(dǎo)入IntelliJ IDEA看
方式1:AOSP上打包源碼為壓縮包
AOSP上打了tag的版本,貌似只有整數(shù)的大版本,沒有小版本,即只有2.3.0、2.2.0、2.0.0、1.5.0等,沒有2.3.2等版本,需要注意。
gradle_2.3.0 源碼
gradle_2.2.0 源碼
gradle_2.0.0 源碼
gradle_1.5.0 源碼
gradle_1.2.0 源碼
gradle_1.1.0 源碼
gradle_1.0.0 源碼
打開上面自己需要的一個(gè)版本的鏈接,點(diǎn)擊頁面上的tgz鏈接,然后就會(huì)下載下來一個(gè)壓縮包,解壓此壓縮包,然后導(dǎo)入Android Studio或者IntelliJ IDEA,即可查看。
但是有缺陷,導(dǎo)入項(xiàng)目后由于缺少了很大一部分依賴,導(dǎo)致項(xiàng)目大片爆紅,加上沒有相關(guān)的項(xiàng)目間依賴關(guān)系,絕大部分代碼無法進(jìn)行跳轉(zhuǎn),需要自己手動(dòng)搜索代碼,找到代碼調(diào)用處,極其痛苦,所以,不建議使用此方法閱讀源碼,后期,自己也不再通過此方法查看源碼了,太蛋疼。
方式2:通過依賴相關(guān)庫查看源碼
這種方式比較輕量,建議初學(xué)者通過此方式學(xué)習(xí),這種方式很簡單,只需要建立一個(gè)空的Gradle項(xiàng)目,在其依賴中加入兩行依賴,如我要查看gradle2.3.2的源碼只需要加入依賴
compile gradleApi()
compile 'com.android.tools.build:gradle:2.3.2'
值得注意的是,可能并不是所有的android gradle plugin版本都附帶有源碼的jar,如果遇到了一些沒有源碼的,即打開后看到的內(nèi)容是反編譯的class或者是沒有javadoc的內(nèi)容,你最好換一個(gè)版本。
我建了一個(gè)簡單的示例項(xiàng)目https://github.com/lizhangqu/AndroidGradlePluginCodeViewer,使用IntelliJ IDEA導(dǎo)入即可,如圖
之后,結(jié)合Command+左鍵或者Alt+Command+F7就可以找到源碼對(duì)應(yīng)的調(diào)用處,跟蹤查看了。
方式3:repo下載AOSP完整gradle源碼
如果你有編譯Android Gradle Plugin的需求,可以用此方法。當(dāng)然缺點(diǎn)很明顯,項(xiàng)目十分巨大,需要占用大量的硬盤資源,如果硬盤資源不足,建議還是不要嘗試了,舉個(gè)例子:gradle_2.3.0分支上的代碼,大概釋放后有30G左右。
$ mkdir gradle_2.3.0
$ cd gradle_2.3.0
$ repo init -u https://android.googlesource.com/platform/manifest -b gradle_2.3.0
$ repo sync
源碼同步時(shí)間較長,大概需要1-3小時(shí),耐心等待。
國內(nèi)墻可能太高,可以使用中國科學(xué)技術(shù)大學(xué)的AOSP源或者清華大學(xué)的AOSP源
清華大學(xué)的AOSP源
中國科學(xué)技術(shù)大學(xué)的AOSP源
如果repo init 提示無法連接到 gerrit.googlesource.com,查看對(duì)應(yīng)的源解決方法頁面進(jìn)行解決
清華大學(xué) Git Repo 鏡像使用幫助
中國科學(xué)技術(shù)大學(xué) 附錄_brillo
同步完成后,進(jìn)入gradle_2.3.0/tools目錄,用gradlew執(zhí)行一些構(gòu)建前的初始化工作
$ cd tools
$ ./gradlew init
之后用IntelliJ IDEA打開tools/base目錄即可查看,該目錄下有一個(gè).idea目錄,已經(jīng)是IntelliJ IDEA項(xiàng)目了,直接打開即可
導(dǎo)入過程比較漫長,耐心等待。導(dǎo)入過程會(huì)提示是否導(dǎo)入成gradle項(xiàng)目,如圖,點(diǎn)擊Import Gradle Project即可
然后勾選use gradle wrapper
導(dǎo)入完成后,大概就長這樣子,gradle plugin的源碼在tools/base/build-system下
假設(shè)當(dāng)前目錄為gradle_2.3.0/tools目錄,進(jìn)行android gradle plugin的編譯
./gradlew :base:profile:assemble
./gradlew :base:builder-model:assemble
./gradlew :base:builder-test-api:assemble
./gradlew :base:builder:assemble
./gradlew :base:transform-api:assemble
./gradlew :base:gradle-api:assemble
./gradlew :base:gradle-core:assemble
./gradlew :base:instant-run-instrumentation:assemble
./gradlew :base:gradle:assemble
./gradlew :base:gradle-experimental:assemble
./gradlew :base:integration-test:assemble
./gradlew :base:project-test-lib:assemble
./gradlew :base:project-test:assemble
編譯產(chǎn)物位于gradle_2.3.0/out/build目錄下
假設(shè)當(dāng)前目錄為gradle_2.3.0/tools目錄,將android gradle plugin部署到本地
./gradlew :base:profile:publishLocal
./gradlew :base:builder-model:publishLocal
./gradlew :base:builder-test-api:publishLocal
./gradlew :base:builder:publishLocal
./gradlew :base:transform-api:publishLocal
./gradlew :base:gradle-api:publishLocal
./gradlew :base:gradle-core:publishLocal
./gradlew :base:instant-run-instrumentation:publishLocal
./gradlew :base:gradle:publishLocal
./gradlew :base:gradle-experimental:publishLocal
./gradlew :base:integration-test:publishLocal
./gradlew :base:project-test-lib:publishLocal
./gradlew :base:project-test:publishLocal
部署產(chǎn)物位于gradle_2.3.0/out/repo目錄下
那么如何將我們項(xiàng)目中的gradle插件替換為使用構(gòu)建好的插件呢
假設(shè)現(xiàn)有項(xiàng)目中的依賴是這樣的
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
}
}
需要將其指定到本地的部署產(chǎn)物所在repo
buildscript {
repositories {
maven {url 'path/to/gradle_2.3.0/out/repo' }
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
}
}