Android Gradle Plugin 源码阅读与编译
前言
為了解一些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鏈接,然后就會下載下來一個(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),需要自己手動搜索代碼,找到代碼調(diào)用處,極其痛苦,所以,不建議使用此方法閱讀源碼,后期,自己也不再通過此方法查看源碼了,太蛋疼。
方式2:通過依賴相關(guān)庫查看源碼
這種方式比較輕量,建議初學(xué)者通過此方式學(xué)習(xí),這種方式很簡單,只需要建立一個(gè)空的Gradle項(xiàng)目,在其依賴中加入兩行依賴,如我要查看gradle2.3.2的源碼只需要加入依賴
| 12 | 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就可以找到源碼對應(yīng)的調(diào)用處,跟蹤查看了。
方式3:repo下載AOSP完整gradle源碼
如果你有編譯Android Gradle Plugin的需求,可以用此方法。當(dāng)然缺點(diǎn)很明顯,項(xiàng)目十分巨大,需要占用大量的硬盤資源,如果硬盤資源不足,建議還是不要嘗試了,舉個(gè)例子:gradle_2.3.0分支上的代碼,大概釋放后有30G左右。
| 1234 | 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,查看對應(yīng)的源解決方法頁面進(jìn)行解決
- 清華大學(xué) Git Repo 鏡像使用幫助
中國科學(xué)技術(shù)大學(xué) 附錄_brillo
同步完成后,進(jìn)入gradle_2.3.0/tools目錄,用gradlew執(zhí)行一些構(gòu)建前的初始化工作
| 12 | cd tools ./gradlew init |
之后用IntelliJ IDEA打開tools/base目錄即可查看,該目錄下有一個(gè).idea目錄,已經(jīng)是IntelliJ IDEA項(xiàng)目了,直接打開即可
導(dǎo)入過程比較漫長,耐心等待。導(dǎo)入過程會提示是否導(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的編譯
| 12345678910111213 | ./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部署到本地
| 12345678910111213 | ./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)目中的依賴是這樣的
| 12345678 | buildscript { repositories {mavenCentral()} dependencies { classpath 'com.android.tools.build:gradle:2.3.0'}} |
需要將其指定到本地的部署產(chǎn)物所在repo
| 12345678 | buildscript { repositories { maven {url 'path/to/gradle_2.3.0/out/repo' }}dependencies { classpath 'com.android.tools.build:gradle:2.3.0'}} |
對比總結(jié)
- 方式1,缺點(diǎn)明顯,大片爆紅,不能良好的進(jìn)行代碼跳轉(zhuǎn)
- 方式2,優(yōu)點(diǎn)是占用資源少,快速,方便,因此優(yōu)先推薦此方式,缺點(diǎn)是只能閱讀,不能編譯、debug了解其整個(gè)詳細(xì)過程
- 方式3,優(yōu)點(diǎn)是可以進(jìn)行編譯、debug等操作,缺點(diǎn)很明顯,硬盤資源占用過大,沒有30G的空余空間,不適合嘗試,尤其是對Mac用戶來說,SSD可能過小,沒有這么大的空間。源碼同步時(shí)間較長,需要耗費(fèi)1-3個(gè)小時(shí)。
因此,對于初學(xué)者來說,方式2為最優(yōu)選擇。
題外話:instant run源碼編譯及部署
既然都講到了android gradle plugin的編譯,而instant run源碼剛好也在tools/base下,順帶就講講instant run的編譯
假設(shè)當(dāng)前目錄為gradle_2.3.0/tools目錄
編譯
| 12345 | ./gradlew :base:instant-run:instant-run-annotations:assemble./gradlew :base:instant-run:instant-run-common:assemble./gradlew :base:instant-run:instant-run-client:assemble./gradlew :base:instant-run:instant-run-runtime:assemble./gradlew :base:instant-run:instant-run-server:assemble |
部署
| 12345 | ./gradlew :base:instant-run:instant-run-annotations:publishLocal./gradlew :base:instant-run:instant-run-common:publishLocal./gradlew :base:instant-run:instant-run-client:publishLocal./gradlew :base:instant-run:instant-run-runtime:publishLocal./gradlew :base:instant-run:instant-run-server:publishLocal |
參考鏈接
- http://tools.android.com/build/gradleplugin
- http://tools.android.com/build
- http://source.android.com/source/downloading.html
- https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
- https://lug.ustc.edu.cn/wiki/mirrors/help/aosp
總結(jié)
以上是生活随笔為你收集整理的Android Gradle Plugin 源码阅读与编译的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CURL NDK 交叉编译
- 下一篇: 当 Android 开发者遇见 Tens