Android Gradle Plugin 源码阅读与编译
前言
為了解一些Andorid的構建流程,有時候需要閱讀Android Gradle Plugin的相關源碼的。自己閱讀Android Gradle Plugin源碼主要經歷了三個時期:
- 1、AOSP上打包源碼壓縮包,然后下載下來看
- 2、通過依賴相關庫,結合IntelliJ IDEA的快捷鍵:Command+左鍵、Alt+Command+F7 跟蹤源碼調用來看
- 3、repo下載AOSP構建工具分支上的源碼,完整項目導入IntelliJ IDEA看
方式1:AOSP上打包源碼為壓縮包
AOSP上打了tag的版本,貌似只有整數的大版本,沒有小版本,即只有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 源碼
打開上面自己需要的一個版本的鏈接,點擊頁面上的tgz鏈接,然后就會下載下來一個壓縮包,解壓此壓縮包,然后導入Android Studio或者IntelliJ IDEA,即可查看。
但是有缺陷,導入項目后由于缺少了很大一部分依賴,導致項目大片爆紅,加上沒有相關的項目間依賴關系,絕大部分代碼無法進行跳轉,需要自己手動搜索代碼,找到代碼調用處,極其痛苦,所以,不建議使用此方法閱讀源碼,后期,自己也不再通過此方法查看源碼了,太蛋疼。
方式2:通過依賴相關庫查看源碼
這種方式比較輕量,建議初學者通過此方式學習,這種方式很簡單,只需要建立一個空的Gradle項目,在其依賴中加入兩行依賴,如我要查看gradle2.3.2的源碼只需要加入依賴
| 12 | compile gradleApi()compile 'com.android.tools.build:gradle:2.3.2' |
值得注意的是,可能并不是所有的android gradle plugin版本都附帶有源碼的jar,如果遇到了一些沒有源碼的,即打開后看到的內容是反編譯的class或者是沒有javadoc的內容,你最好換一個版本。
我建了一個簡單的示例項目https://github.com/lizhangqu/AndroidGradlePluginCodeViewer,使用IntelliJ IDEA導入即可,如圖
之后,結合Command+左鍵或者Alt+Command+F7就可以找到源碼對應的調用處,跟蹤查看了。
方式3:repo下載AOSP完整gradle源碼
如果你有編譯Android Gradle Plugin的需求,可以用此方法。當然缺點很明顯,項目十分巨大,需要占用大量的硬盤資源,如果硬盤資源不足,建議還是不要嘗試了,舉個例子: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 |
源碼同步時間較長,大概需要1-3小時,耐心等待。
國內墻可能太高,可以使用中國科學技術大學的AOSP源或者清華大學的AOSP源
- 清華大學的AOSP源
- 中國科學技術大學的AOSP源
如果repo init 提示無法連接到?gerrit.googlesource.com,查看對應的源解決方法頁面進行解決
- 清華大學 Git Repo 鏡像使用幫助
中國科學技術大學 附錄_brillo
同步完成后,進入gradle_2.3.0/tools目錄,用gradlew執行一些構建前的初始化工作
| 12 | cd tools ./gradlew init |
之后用IntelliJ IDEA打開tools/base目錄即可查看,該目錄下有一個.idea目錄,已經是IntelliJ IDEA項目了,直接打開即可
導入過程比較漫長,耐心等待。導入過程會提示是否導入成gradle項目,如圖,點擊Import Gradle Project即可
然后勾選use gradle wrapper
導入完成后,大概就長這樣子,gradle plugin的源碼在tools/base/build-system下
假設當前目錄為gradle_2.3.0/tools目錄,進行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 |
編譯產物位于gradle_2.3.0/out/build目錄下
假設當前目錄為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 |
部署產物位于gradle_2.3.0/out/repo目錄下
那么如何將我們項目中的gradle插件替換為使用構建好的插件呢
假設現有項目中的依賴是這樣的
| 12345678 | buildscript { repositories {mavenCentral()} dependencies { classpath 'com.android.tools.build:gradle:2.3.0'}} |
需要將其指定到本地的部署產物所在repo
| 12345678 | buildscript { repositories { maven {url 'path/to/gradle_2.3.0/out/repo' }}dependencies { classpath 'com.android.tools.build:gradle:2.3.0'}} |
對比總結
- 方式1,缺點明顯,大片爆紅,不能良好的進行代碼跳轉
- 方式2,優點是占用資源少,快速,方便,因此優先推薦此方式,缺點是只能閱讀,不能編譯、debug了解其整個詳細過程
- 方式3,優點是可以進行編譯、debug等操作,缺點很明顯,硬盤資源占用過大,沒有30G的空余空間,不適合嘗試,尤其是對Mac用戶來說,SSD可能過小,沒有這么大的空間。源碼同步時間較長,需要耗費1-3個小時。
因此,對于初學者來說,方式2為最優選擇。
題外話:instant run源碼編譯及部署
既然都講到了android gradle plugin的編譯,而instant run源碼剛好也在tools/base下,順帶就講講instant run的編譯
假設當前目錄為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
總結
以上是生活随笔為你收集整理的Android Gradle Plugin 源码阅读与编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CURL NDK 交叉编译
- 下一篇: 当 Android 开发者遇见 Tens