最新版MacOS(10.13.2)编译Android 4.4.4
网上搜一下Mac编译Android源码,能搜到很多,但最新版的MacOS(10.13.2)编译Android4.4.4的却没有,本文记录我的编译过程。
Android4.4.4这个版本我已经编译过很多次了(参见历史文章),但是随着MacOS的升级,以前好使的编译环境变得不好使了,但是4.4.4这个版本因为是dalvik的最后一个版本,是学习Android源码的最佳样本,我又不想将自己的系统版本降级到官方支持的编译版本,那就只能摸索着去解决编译遇到的问题了。
在官方文档中,我们看到Mac系统和可编译的对应Android版本:
然而,在谷歌上搜索能发现,有人在更高版本的系统上编译成功:
那就说明在最新的MacOS上编译应该也是可行的。
废话不多说,直接源码下载开始:
1.
在Mac上建一个大小写敏感的文件系统,并挂载,见官方文档,鉴于我的硬盘不是很大,只分配了100G的空间。
2.
按照官网上的方法开始下载,我选择了android4.4.4_r1,tag为:KTU84P。
3.
趁下载的时候,准备相应的编译环境:
a. Java JDK 6
b. XCode 6.4
c. Command Line Tool for Xcode 6.4
注意:
这里要说明一下,在新版本上装Xcode6.4并不能通过快捷方式运行,所以最好是让多个XCode版本并存,比如我同时装了XCode(最新版)、XCode8、XCode6:
d. MacPorts
注意:
安装MacPorts时,需要用到高版本的XCode,这个时候就体现了多版本的好处了,使用如下命令切换到最新版:
sudo xcode-select -s /Applications/Xcode.app
e. 安装make、Git、GPG等
sudo port install gmake libsdl git-core gnupg
注意:
i. 在安装时,会提示有些依赖的组件已经存在,需要按照输出的命令行中的命令进行确认,否则会失败。
ii. gnupg被提示失效,使用gnupg2代替。
反正就是:认真看安装的输出提示,见招拆招。
iii. make必须是3.8.1版本,规避一个bug,见官网
f. 参考官网上面的别的一些准备,比如同时打开文件数等,就不复述了。
g. 代码下载完后,删除.repo文件夹,不需要git相关的信息了,删除前使用空间为75G,删除后纯代码9.5G,这样会省下不少空间。
4.
编译前,确认一下环境:
java -version //1.6
make -version //3.8.1
git version
gpg --version
xcodebuild -version //6.4,如果不是这个版本,记得切换一下
确认后,开始编译,接下来会遇到若干问题。
a. Can not find SDK 10.6 at /Developer/SDKs/MacOSX10.6.sdk
//进入源码根目录
//找到/build/core/combo/HOST_darwin-x86.mk ,用sublime或者XCode或者vim打开
//找到mac_sdk_versions_supported := 10.6 10.7 10.8
//将上面这行换成
//mac_sdk_versions_supported := 10.9
b. aidl_language_y.cpp Illegal instruction: 4
参考链接:https://stackoverflow.com/a/48006504,
因为我们之前删除了.repo,我们需要手动将patch的代码弄过来。
此时使用mm
编译并不能成功,因为依赖项还没有被编译过,改用make bison
即可。
c. stdarg.h: No such file or directory
在源码根目录下,找到/build/core/combo/HOST_darwin-x86.mk,打开后在第83行附近找到
ifeq ($(mac_sdk_version),10.8)
# Mac SDK 10.8 no longer has stdarg.h, etc
更改为
ifeq ($(mac_sdk_version),10.9)
# Mac SDK 10.8 or later no longer has stdarg.h, etc
d. Unable to find any JNI methods for org/chromium/ui/base/SelectFileDialog 或者:Unable to find any JNI methods for org/chromium/ui/Clipboard,都是一个问题
在源码根目录下找到/external/chromium_org/base/android/jni_generator/jni_generator.py,在github上有个解决方案照做即可。
e. libintl.h: No such file or directory
这个bug比较蛋疼,看样子是因为某个组件没装或者版本不对,网上有很多人在问这个问题,尝试了方法并不能解决,最后根据报错看了一下源码:
external/chromium_org/third_party/yasm/source/patched-yasm/util.h
很好,自带了可选方案,那么我就将line77 改成如下绕过对libintl.h的引用:
line 77: # ifdef ENABLE_NLS_XXXXXXX
到这里之后编译就顺利进行下去并成功了。
总结
在一个新的环境下编译源码是一个很考验耐心的事情,经常遇到奇奇怪怪的问题。解决这些问题最好的方法就是:
- 前期尽可能将环境要求配置好,后期编译就会少遇到很多问题,典型的问题就是xxx.h到不到了。
- 用关键错误信息进行搜索,重点看英文的搜索结果,质量高。
- 实在遇到特别的问题,尝试分析源码,看看是否有版本规避问题。
其实这些问题本该由Google来适配的,但是因为大家操作系统、版本、组件等并不完全统一,Google就只在特定的Mac版本上适配了。那我们遇到问题就只能自己动手解决了。
参考文档:
如何在mac中安装多个版本的Xcode
MacOS X 下载编译Android 4.4.4源码(上)
MacOS X 下载编译Android 4.4.4源码(下)