美文网首页我爱编程
最新版MacOS(10.13.2)编译Android 4.4.4

最新版MacOS(10.13.2)编译Android 4.4.4

作者: difcareer | 来源:发表于2018-04-14 18:36 被阅读237次

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

    参考文档:
    如何在mac中安装多个版本的Xcode
    MacOS X 下载编译Android 4.4.4源码(上)
    MacOS X 下载编译Android 4.4.4源码(下)

    相关文章

      网友评论

        本文标题:最新版MacOS(10.13.2)编译Android 4.4.4

        本文链接:https://www.haomeiwen.com/subject/scdlkftx.html