1 准备工作
- 最好准备一套Ubuntu的系统. 但是本教程只针对MAC OS
- 预留200G+的磁盘
- 新建磁盘映像
Android编译源码需要在区分大小写的磁盘中, 而MACOS默认的磁盘是不区分大小写的, 所以需要在MAC的磁盘工具中新建一块磁盘映像, 这一点很重要.
2 下载
2.1 安装repo工具
Repo是一款Google原来管理Android源码的工具. 我们第一步是要下载repo
下载并修改执行权限, 下载的到目录自选:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
然后添加到环境变量中
vim .bash_profile
然后添加 export PATH=${PATH}:/Volumes/Data/05.android_source/bin;
保存后执行 souce ~/.bash_profile
2.2 从Google官方进行初始化操作
如果你可以翻墙, 我还是建议你直接从Google中下载 命令如下:
repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
-b 之后的部分是要下载的Android版本, 可以从下面链接中找到你要下载的版本
https://source.android.com/source/build-numbers.html#source-code-tags-and-builds
当然, 你直接执行上面很可能不成功, 没有关系, 可以看2.3章节
2.3 从科大镜像上初始化
修改repo文件
我们找到
命令如下
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-4.0.1_r1
## 如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:
## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
2.4 下载
初始化成功后, 执行下面命令就可以下载了
repo sync -c -j8
上面命令中-c可以忽略部分tag信息, -j8是指开8个子线程来下载, 你也可以-j4等等
2.5 做一点黑科技提高下载效率
2.4那一步是很可能会因为网络问题等等原因失败, 所以我们可以做一点黑科技去提高下载速度;
我们repo init命令执行成功后, 会在执行的根目录生成一个.repo的隐藏目录, 我们到这个目录下打开manifest.xml文件, 可以看到类似下面的代码:
<project path="external/bouncycastle" name="platform/external/bouncycastle" groups="pdk" />
上面一行代码是代表一个仓, 一个完整的AOSP源码是由约600个仓代码组成的. 例如我们的蓝牙模块源码是在下面这个仓中:
<project path="packages/apps/Bluetooth" name="platform/packages/apps/Bluetooth" groups="pdk-cw-fs,pdk-fs" />
我们写一个脚本来格式化出path字段的值, 输出到一个文件中:
格式化后的文件示例:
compatibility/cdd
cts
dalvik
developers/build
developers/demos
developers/samples/android
development
device/asus/fugu
device/asus/fugu-kernel
device/common
device/generic/arm64
device/generic/armv7-a-neon
device/generic/car
然后我们起很多个脚本分仓下载, 脚本如下:
# -*- coding: utf-8 -*-
import os
lines = []
for line in open("/Volumes/Data/02.projects/07.demo/autonrun/auto/out_1.xml"):
if line.startswith("packages"):
lines.append(line)
lines.reverse()
for line in lines:
print line
os.system("repo sync -c %s" % line)
你当然也可以把这个脚本改一下, 一个仓重复下载是没有问题的.
笔者大概共用了10个脚本左右. 成功的把下载时间从48个小时缩短到10个小时左右.
3 编译
3.1 根目录下调用source build/envsetup.sh来初始化编译环境
3.2 使用choosecombo命令来选择编译版本
- Build type choices are这一项我们通常选择release
- Which product would you like 这个需要看你把版本烧录在什么手机上了, 对于nexus 5x来说, 输入aosp_bullhead, 其他产品可以在这个网址上查到: https://source.android.com/source/running.html#selecting-device-build
- Variant choices are 选择userdug就好
3.3 全量版本编译
笔者建议首次编译的时候采用全量版本编译一次, 根目录执行命令:
make -j8
3.4 image文件编译
如果你要编译一个img镜像文件, 直接采用以下就好:
make systemimage -j8
3.5 单仓编译 ----该条请忽略, 我们暂时不会用到
如果你要编一个jar包或者so, apk包的话, 直接采用下面命令:
make Bluetooth -j8 //编译Bluetooth.apk
make framework -j8 //编译framework.jar
如果你修改了一个文件, 不知道要编译什么的话. 你就从你修改的文件目录依次向上找, 找到第一个Android.mk文件, 看下下面这个字段是什么:
LOCAL_MODULE := framework
编译这个一般来说就没有错了. 但是如果有多个LOCAL_MODULE字段, 那恭喜你中奖了, 自己阅读下Android.mk吧. 这里不赘述.
4 烧录
- 执行adb reboot bootloader模式
- 烧录out/target/product/bullhead目录下的img包
我们全编译版本后, 会看到这样几个包:
system.img recovery.img ramdisk.img ramdisk-recovery.img boot.img
我们可以先烧录下system.img(通常情况下,我们只会修改system.img下的文件)
fastboot flash system system.img
如果此时版本启动不成功, 我们再烧录其他文件
5 那些年,我们踩过的坑
- 大小写敏感
- 错误: Could not find a supported mac sdk: [“10.10” “10.11” “10.12”]
参看链接: https://stackoverflow.com/questions/39960751/build-aosp-on-mac-10-12 - 编译版本记住是: aosp_bullhead
- Android8.1版本上有一个bug导致我们编译不过,请参看这个链接手动修改下源码: https://android.googlesource.com/platform/external/bison/+/c0c852bd6fe462b148475476d9124fd740eba160^!/#F0
- 这里面罗列了一些常见的坑: https://blog.youkuaiyun.com/qq_25333681/article/details/79838325
- 内存不够
错误如下:
GC overhead limit exceeded.
Try increasing heap size with java option '-Xmx<size>'.:
建议你每次编译前都执行下面代码: 4g可以改成6g
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server
- webview zipException
在打包system.img的时候, 需要将webview.apk重签名. 而webview.apk比较特殊, 他不是以源代码的方式给过来的, 他是直接给的一个apk包. 然后打包时对apk包进行重签名.
而部分分支的webview.apk可能给错了, 导致重签名的时候爆出zipException. 要修复这个bug, 可以拉一下2.3章节中其他branch的源码, 只拉external/chromium-webview单仓就可以了. 将这个仓中所有东西覆盖原来的编译分支. 重新编译即可.
备注
本教程主要参考以下文档
- Android 下载源代码 https://source.android.com/source/downloading.html
- MAC OS x 编译Android源码 https://juejin.im/post/5b690cb46fb9a04fd044885d
- 科大镜像 https://lug.ustc.edu.cn/wiki/mirrors/help/aosp