本文最后更新于 超过 8 年前,文中所描述的信息可能已发生改变。
背景
前几天心血来潮想编译Android源码,总共花了大概三天的时间,碰到一些问题,记录一下防止以后忘掉。
本地环境
系统版本: OS X 10.11.2 git : 2.6.4 port :2.3.4 make : 3.81 curl : 7.46.0
环境配置
首先需要一个区分大小写的硬盘,至少要100G,我是在一个移动硬盘上编译,所以直接磁盘工具->选择硬盘->抹掉,格式选择第二个"OS X扩展(区分大小写,日志式)"就可以了。
如果不想新建一个分区,也可以通过官网提供的方式,执行
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 100g ~/android.dmg
hdiutil attach ~/android.dmg -mountpoint /Volumes/android;
来创建并挂载一个dmg文件来使用。
然后需要装一下java7环境,去下载一下就好了jdk-7u71-macosx-x64.dmg,一般做Android开发的都已经装过了。
接下来需要安装macports,它会替你装好编译过程中需要的各种工具。 直接到官网下载最新版本的,装好后,再将路径 /opt/local/bin
添加到环境变量,并且要在 /usr/bin
的前面。 接着执行POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
开始下载。
然后执行 make -v
查看当前make的版本,如果是3.82的话,还需要回退到3.81。因为3.82有个bug所以不能用来编译。不过我装完一直都是3.81,所以无所谓了,回退的具体方法可以去看官方文档。
下载镜像
我用的是清华的AOSP镜像,根据提示
由于首次同步需要下载 36GB 数据,过程中任何网络故障都可能造成同步失败,因此你可以选择使用每月更新的初始化包。
所以我选择先下载这个初始包。然后再进行同步。 执行命令
wget http://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
tar xf aosp-latest.tar
cd AOSP # 解压得到的 AOSP 工程目录
repo sync # 正常同步
如果提示repo命令没找到,可以通过命令 brew install repo
来直接安装。 如果没有brew,可以执行ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
来安装。 然后开始同步,同步过程中碰到一个错误 提示result=56, HTTP code = 200
, 后来发现是git的一个bug,原本的git版本是2.4.9,将git升级到最新版2.6.4就解决了。
编译
首先执行source build/envsetup.sh
设置环境变量,然后使用lunch命令选择构建目标。 接着在AOSP目录下执行make -j4
就可以开始编译了。 过程中碰到一堆错误。
提示
build/core/config.mk:596: *** Error: could not find jdk tools.jar
,其实第一次make没有这个错误,但是中间手贱装了个java8,然后就找不到这个文件了。网上找了一些方法都不能解决,最后根据错误提示,在config.mk的596行附近看了下,发现它是调用了一个叫find-jdk-tools-jar.sh
的脚本,然后又看了下这个脚本的代码,主要逻辑就是先寻找ANDROID_JAVA_HOME
是否被定义,如果有,就返回$ANDROID_JAVA_HOME/lib/tools.jar
,于是我自己定义了一下,export ANDROID_JAVA_HOME="$(/usr/libexec/java_home -v 1.7)"
,成功解决。提示
Unsupported curl, please use a curl not based on SecureTransport
,搜了了下发现只有stackover上有人问了同样的问题,但没有人解答。刚开始以为是版本问题,于是换了一个最新版本的curl,但是没解决,不清楚这个不基于SecureTransport的curl是怎么样的。后来在元旦节这天,有人给出了解决方法,原来是要用openssl重新编译一个curl。 首先下载curl源码,然后执行
./configure --prefix=/usr/local/curl --with-ssl=/usr/local/Cellar/openssl/1.0.2d_1
make
make install
这个1.0.2d_1需要根据自己本地实际版本进行更改,我这里是1.0.2e,最后将 /usr/local/curl/bin
添加到环境变量。可以使用 curl --version
,查看一下,如果没有出现SecureTransport,而是出现OpenSSL,则表明替换成功。
- 提示
No Jack server running. Try 'jack-admin start-server'
jack服务器开启失败。原因是之前手动创建了一个 .jack-server文件夹,删了之后重新make一下就可以了。
make 完之后,就可以尝试刷进手机了。但是我并没有nexus手机,所以只能在模拟器上玩了。
在Android Studio上阅读源码
在AOSP根目录执行 make idegen && development/tools/idegen/idegen.sh
,然后直接用Android Studio打开生成的android.ipr 文件就可以了。