由于要支持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
目录下