最新版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上有个解决方案照做即可。

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

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

总结

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张戈的专栏

WordPress前端html代码压缩优化,附对应知更鸟主题压缩报错的解决方案

今天,逛松果博客的时候,看到了他分享的《wordpress 通过代码压缩网页》一文,让我想起了其实张戈博客之前也用过这个功能,当时是在 WP 迷博客看到的纯代码...

39160
来自专栏包子铺里聊IT

刷题外传之如何优雅的杀掉进程

进程(Process)是 Unix/Linux 系统下编程的核心知识。无论是小 Script 还是大 Daemon,启动后都是以进程的形势在 OS 中存在和执行...

39360
来自专栏哈雷彗星撞地球

Xcode 创建.a和framework静态库

最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录。

23520
来自专栏醉梦轩

Ubuntu安装Proxychains

1.2K30
来自专栏跟着阿笨一起玩NET

asp.net中为什么修改了配置文件后我们不需要重启IIS

本文转载:http://blog.itpub.net/12639172/viewspace-659819/

36710
来自专栏openshift持续集成

jenkins邮件插件中的内容参数设置

众所周知,Jenkins默认提供了一个邮件通知,能在构建失败、构建不稳定等状态后发送邮件。但是它本身有很多局限性,比如它的邮件通知无法提供详细的邮件内容、无法定...

98580
来自专栏派森公园

docker的reap问题

在使用docker容器的时候,应该了解“PID1僵尸进程reap”问题。如果使用的时候不加注意,可能会导致出现一些意想不到的问题。

14530
来自专栏calvin

jira webhook 事件触发并程序代码调用jenkins接口触发构建操作

开发管理工具触发站点构建事件,事件处理中需要调用Jenkins接口开始构建动作。 我的应用场景: 使用jira作为管理工具,在jira中创建自定义的工作流来...

86130
来自专栏魏艾斯博客www.vpsss.net

解决 WordPress 插件更新“需要访问您网页服务器权限”的问题

35960
来自专栏信安之路

Window 提权基础

再加上个人的理解写出的关于 Windows 提权基础的文章,其中有些地方因为不太实用所以做了适当修改,感谢 @hl0rey 的帮助和建议。

27900

扫码关注云+社区

领取腾讯云代金券