Win10下編譯Android Gradle Plugin + D8

背景

由於要支持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

下載好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中. 或者在 這裏 查看

  1. 修改tools/base/bazel/toplevel.WORKSPACE 刪除blaze相關內容

上傳成功 若是不刪除會提示
ERROR: error loading package '': Encountered error while reading extension file 'binds.bzl': no such package '@blaze//':

  1. 修改tools/base/bazel/sdk/dev-sdk-packages, 註釋掉docs那一行 上傳成功 若是不註釋會提示Warning: Failed to find package docs 而後中止下載

  2. prebuilts/studio/sdk下新建三個文件夾

    $ mkdir darwin
    $ mkdir linux
    $ mkdir windows
    複製代碼

    若是不註釋會提示錯誤: doesn't contain expected subdir: darwin

    • 補充:
      這三個文件夾裏分別放對應平臺的sdk預編譯文件.
      可是其實並無必要mac/linux/win三個平臺的sdk都下載, 只要下載當前OS的便可.
      雖然是win10的機器, 可是實際跑在WSL裏的Ubuntu, 因此只要新建'linux'文件便可,
      而後對tools/base/bazel/sdk/src/com/android/tools/utils/DevSdkUpdater.java作以下修改:
      downloadSdkPackages(sdkDest, packageLines, "linux");//platform => "linux"
      複製代碼
      以後再執行第4步驟:
  3. 下載預編譯文件:

    $ bazel run tools/base/bazel/sdk:dev-sdk-updater
    複製代碼
    • 補充

    應該也能夠經過bazel run來指定--platform linux, 避免改動java源碼, 可是我沒有找到怎麼傳參.

編譯AGP

預編譯下載完成後就能夠編譯了 詳細編譯命令:

$ cd tools
複製代碼
$ ./gradlew :publishAndroidGradleLocal
複製代碼

Android Gradle Plugin with the data binding runtime libraries:

$ ./gradlew :publishLocal
複製代碼

編譯成功:
編譯輸出在out\repo目錄下


----

R8 & D8

R8 & D8 雖然是兩個模塊, 可是都在同一個源碼裏.因此是一塊兒編譯的
R8 & D8 和GAP的源碼是分開的, 因此若是要改動R8或者D8, 須要先獨立編譯出R8&D8, 而後更新到GAP的prebuilts/r8/下, 再編譯GAP

下載R8源碼:

$ 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
複製代碼

下載depot_tools

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

查看須要下載的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

查看 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.pyEnsureDepFromGoogleCloudStorage()方法, 來確認須要下載哪些文件.
修改後, 執行命令

$ tools/gradle.py d8 r8
複製代碼

經過輸出確認須要下載的文件hash 和下載連接.

編譯

$ tools/gradle.py d8 r8
複製代碼

編譯成功

編譯輸出在build\libs目錄下

相關文章
相關標籤/搜索