最新版MacOS(10.13.2)编译Android 4.4.4源码

2018-08-23 09:40:58 浏览数 (1)

网上搜一下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,这个时候就体现了多版本的好处了,使用如下命令切换到最新版:

代码语言:javascript复制
sudo xcode-select -s /Applications/Xcode.app

e. 安装make、Git、GPG等

代码语言:javascript复制
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.

编译前,确认一下环境:

代码语言:javascript复制
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

代码语言:javascript复制
    //进入源码根目录
    //找到/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

代码语言:javascript复制
在源码根目录下,找到/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,都是一个问题

代码语言:javascript复制
在源码根目录下找到/external/chromium_org/base/android/jni_generator/jni_generator.py,在github上有个解决方案照做即可。

github修复方案

e. libintl.h: No such file or directory 这个bug比较蛋疼,看样子是因为某个组件没装或者版本不对,网上有很多人在问这个问题,尝试了方法并不能解决,最后根据报错看了一下源码:

代码语言:javascript复制
external/chromium_org/third_party/yasm/source/patched-yasm/util.h

很好,自带了可选方案,那么我就将line77 改成如下绕过对libintl.h的引用:

代码语言:javascript复制
line 77: # ifdef ENABLE_NLS_XXXXXXX

到这里之后编译就顺利进行下去并成功了。

总结

在一个新的环境下编译源码是一个很考验耐心的事情,经常遇到奇奇怪怪的问题。解决这些问题最好的方法就是:

  1. 前期尽可能将环境要求配置好,后期编译就会少遇到很多问题,典型的问题就是xxx.h到不到了。
  2. 用关键错误信息进行搜索,重点看英文的搜索结果,质量高。
  3. 实在遇到特别的问题,尝试分析源码,看看是否有版本规避问题。

其实这些问题本该由Google来适配的,但是因为大家操作系统、版本、组件等并不完全统一,Google就只在特定的Mac版本上适配了。那我们遇到问题就只能自己动手解决了。

0 人点赞