由於要支持Android4.4, 而且要求開啓D8編譯.html
因爲D8與dx不一樣, d8生成dex時, 不會過濾註解方法,java
因此maindex的方法數會超. 致使當 minSdkVersion<21 時編譯失敗.linux
因此爲了同時支持Android4.4 和D8. 就須要改動d8的源碼,android
編譯生成能夠過濾註解方法的d8編譯工具.git
Win10下安裝 WSL. WSL裏安裝Ubutuwindows
AOSP的AGP編譯說明: The Android Gradle Pluginapi
本篇只是編譯Android Gradle Plugin (AGP). 和 D8 & R8markdown
下載好AGP源碼後.工具
$ cd path/of/gradle_src
複製代碼
連接bazel到bin下, 方便使用oop
$ ln -s path/of/gradle_src/tools/base/bazel/bazel ~/bin/bazel
複製代碼
AGP的源碼須要依賴系統下載android sdk. 避免沒必要要的編譯.
相關的編譯方法在gradle_root/tools/base/bazel/sdk/README.md
中. 或者在 這裏 查看
tools/base/bazel/toplevel.WORKSPACE
刪除blaze相關內容 若是不刪除會提示
ERROR: error loading package '': Encountered error while reading extension file 'binds.bzl': no such package '@blaze//':
修改tools/base/bazel/sdk/dev-sdk-packages, 註釋掉docs那一行 若是不註釋會提示
Warning: Failed to find package docs
而後中止下載
在prebuilts/studio/sdk
下新建三個文件夾
$ mkdir darwin
$ mkdir linux
$ mkdir windows
複製代碼
若是不註釋會提示錯誤: doesn't contain expected subdir: darwin
tools/base/bazel/sdk/src/com/android/tools/utils/DevSdkUpdater.java
作以下修改: downloadSdkPackages(sdkDest, packageLines, "linux");//platform => "linux"
複製代碼
以後再執行第4步驟:下載預編譯文件:
$ bazel run tools/base/bazel/sdk:dev-sdk-updater
複製代碼
應該也能夠經過bazel run
來指定--platform linux
, 避免改動java源碼, 可是我沒有找到怎麼傳參.
預編譯下載完成後就能夠編譯了 詳細編譯命令:
$ cd tools
複製代碼
$ ./gradlew :publishAndroidGradleLocal
複製代碼
或 Android Gradle Plugin with the data binding runtime libraries
:
$ ./gradlew :publishLocal
複製代碼
編譯成功:
編譯輸出在
out\repo
目錄下
R8 & D8 雖然是兩個模塊, 可是都在同一個源碼裏.因此是一塊兒編譯的
R8 & D8 和GAP的源碼是分開的, 因此若是要改動R8或者D8, 須要先獨立編譯出R8&D8, 而後更新到GAP的prebuilts/r8/下, 再編譯GAP
$ cd /your/workspace/
複製代碼
$ git clone https://r8.googlesource.com/r8
複製代碼
或者
$ git clone https://android.googlesource.com/platform/external/r8
複製代碼
或者清華的鏡像(可是後來發現, 清華的源很舊了, 一兩年不更新那種)
$ git clone https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/external/r8
複製代碼
r8 使用 depot_tools編譯.須要代理, 沒找到國內鏡像
$ cd /your/workspace/
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
複製代碼
添加環境變量:
export PATH=path/of/depot_tools:$PATH
複製代碼
$ cd path/of/r8/
複製代碼
查看須要下載的gradle 的 hash值
$ cat third_party/gradle/gradle.tar.gz.sha1
複製代碼
下載
$ wget -O third_party/gradle/gradle.tar.gz https://storage.googleapis.com/r8-deps/<剛纔cat出的內容>
複製代碼
解壓gradle.tar.gz, 檢查文件樹應當以下
gradle
└─gradle.tar.gz <--下載的壓縮包
└─gradle.tar.gz.sha1 <--存放hash的原始文件
└─gradle <--被解壓出來的目錄
├─bin
├─init.d
├─lib
└─media
└─getting-started.html
└─LICENSE
└─NOTICE
複製代碼
更新gradle.tar.gz文件的修改時間
$ touch third_party/gradle/gradle.tar.gz
複製代碼
查看 jdk 的 hash值
$ cat third_party/openjdk/openjdk-9.0.4/linux.tar.gz.sha1
複製代碼
下載
$ wget -O third_party/openjdk/openjdk-9.0.4/linux.tar.gz https://storage.googleapis.com/r8-deps/<剛纔cat出的內容>
複製代碼
解壓linux.tar.gz, 檢查文件樹應當以下
openjdk-9.0.4
└─linux.tar.gz.sha1
└─linux.tar.gz
└─linux
├─bin
├─conf
...
複製代碼
更新gradle.tar.gz文件的修改時間
$ touch third_party/openjdk/openjdk-9.0.4/linux.tar.gz
複製代碼
補充: 若是有其餘文件下載, 能夠經過修改tools/utils.py
的EnsureDepFromGoogleCloudStorage()
方法, 來確認須要下載哪些文件.
修改後, 執行命令
$ tools/gradle.py d8 r8
複製代碼
經過輸出確認須要下載的文件hash 和下載連接.
$ tools/gradle.py d8 r8
複製代碼
編譯成功
編譯輸出在build\libs
目錄下