前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >最新版MacOS(10.13.2)编译Android 4.4.4源码

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

作者头像
用户2930595
发布2018-08-23 09:40:58
1.1K0
发布2018-08-23 09:40:58
举报
文章被收录于专栏:difcareer的技术笔记

网上搜一下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版本上适配了。那我们遇到问题就只能自己动手解决了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.04.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.
  • 2.
  • 3.
  • 4.
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档