Mac 10.10 编译android 4.4.4 for nexus

想起来都是泪啊。整整折腾了两天才搞定。

android源码编译网上很多教程,其实,都不如官方教程最实在。这里推荐大家按照官方教程来搞。官方教程包含了ubuntu和mac环境的编译环境搭建。下面给传送门:

http://source.android.com/source/initializing.html

在这里,我要提醒一下大家。官方给出的40G的分区空间把我给坑了,4.4.4的源码sync下来就30G了。编译进行到40分钟的时候40G就满了。害我重新有搞了个60G的分区重头来过。最终编译完了也非常惊险,只剩下500M空间了。所以建议大家分区的时候最好60G以上。

问题一

当你开始编译的时候,第一个遇到的问题不是java版本的问题,网上所有帖子都说只能用jdk1.6,而官方教程是说jdk1.7。我就是用的1.7,完全没问题。

问题二

第二个问题会马上遇到,那就是Xcode版本的问题。你会收到如下错误提示:

Can not find SDK 10.6 at /Developer/SDKs/MacOSX10.6.sdk

这是因为macos 10.10的Xcode已经更新到6.x了,同样sdk也更新到10.9和10.10了。4.4.4的源码编译是基于Xcode 5.x的版本,你可以前往查看你得sdk版本,具体路径在:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs

如果你跟我一样的系统版本,你会发现该目录下只有MacOSX10.10.sdk MacOSX10.9.sdk两个版本。没有10.6了,所以解决方案是要么装一个低版本的Xcode,要么改一下配置文件。我选择了后者,修改方法为:

//前提是你在WORKING_DIRECTORY目录下
$ vi build/core/combo/HOST_darwin-x86.mk
//找到mac_sdk_versions_supported
mac_sdk_versions_supported :=  10.6 10.7 10.8
//将上面这行换成
mac_sdk_versions_supported :=  10.9 10.10
//就是换一下支持的sdk版本号。

问题三

接着可以开始编译了,但是没过多久又开始报错了。你会发现它提示:

SyntaxError: Unable to find any JNI methods for org/chromium/ui/Clipboard.

这个也是Xcode版本是高版本的问题。在github有个错误的解决方案:传送门

提醒一下,路径为:external/chromium_org/base/android/jni_generator/jni_generator.py

问题四

然后非常欢快的编译了很久很久,你很激动的认为会这么顺利的一直到结束。谁知道他在你不经意间又蹦出来一个错误:

system/core/include/log/log.h:38:20: error: stdarg.h: No such file or directory

这其实也是Xcode版本惹的祸!卧槽,Xcode咋这么多屁事呢,早知道装个低版本好了。解决方案怎么也没找到,最后不经意见让我发现了。原来还是在build/core/combo/HOST_darwin-x86.mk里面

ifeq ($(mac_sdk_version),10.8)
# Mac SDK 10.8 no longer has stdarg.h, etc
host_toolchain_header := $(HOST_TOOLCHAIN_ROOT)/lib/gcc/i686-apple-darwin$(gcc_darwin_version)/4.2.1/include
HOST_GLOBAL_CFLAGS += -isystem $(host_toolchain_header)
endif
else

看到了吧,他这里只判断了10.8。在10.8里面就已经没有stdarg.h了,那么在我们的10.9和10.10里面肯定也没有了。但是却没有走进这个判断。所以更改很简单,就是把10.8改成10.9

问题五

这次是真的欢快的编译下去了。

谁他妈的在博客里面写他一个小时就编译完了的?还有更甚者说自己28分钟就搞定了,卧槽!为毛我花了6个多小时!

这期间我经历了文章一开始提到的注意事项里面的悲惨遭遇。40GB是严重不够的!。然后。。。。

make: *** [out/target/product/generic/obj/SHARED_LIBRARIES/libwebcore_intermediates/LINKED/libwebcore.so] Error 1

这是个啥情况?我不相信,再来make -j16。结果还是一样,就卡在这一个动态链接库的编译好久然后就莫名其妙的报错了。不管你来多少次一样。谷歌了一下发现

卧槽!原来是内存不够!

打开资源监视器,再make -j16。发现编译这个动态链接库的时候,内存猛涨!一路涨到可用内存才15M,4GB的内存全吃光了了!然后,然后肯定是又报错了。

麻痹的,这可咋整?难不成让我大半夜的去京东订购一块内存条然后傻傻等明天到了自己装上么?不行!我不能这么妥协!继续谷歌,发现也有不少人碰到这个问题,甚至还有8GB内存的也碰到该问题了。突然,眼前一亮,发现一个英文帖子有人说,make的时候,不要指定进程数了,让它慢慢的编译就能过了。

卧槽!居然还能这样解决!简直屌炸天啊!

于是,我编译成功了,这次真的成功了!

都是泪~~~~~~~~

nexus 固件编译

如果你要编译为刷入nexus的固件。那么你需要在编译前添加各种驱动。传送门

把你对应的机型的驱动都下载下来,然后解压到WORKING_DIRECTORY根目录。以nexus 4的4.4.4为例,解压过来之后分别是三个sh文件。extract-broadcom-mako.shextract-lge-mako.shextract-qcom-mako.sh。分别都执行以下,就会在根目录生成vendor目录,里面就是需要编译的驱动文件。

还有,就是在lunch的时候: 选择13. aosp_mako-userdebug

liball:WORKING_DIRECTORY liurenqiu$ lunch

You're building on Darwin

Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_x86-eng
     3. aosp_mips-eng
     4. vbox_x86-eng
     5. aosp_deb-userdebug
     6. aosp_flo-userdebug
     7. aosp_grouper-userdebug
     8. aosp_tilapia-userdebug
     9. mini_armv7a_neon-userdebug
     10. mini_mips-userdebug
     11. mini_x86-userdebug
     12. aosp_hammerhead-userdebug
     13. aosp_mako-userdebug
     14. aosp_manta-userdebug

最后编译完毕,以nexus4 为例。img在WORKING_DIRECTORY/out/target/product/mako目录。连上手机,进入bootloader模式,在该目录下执行

fastboot flashall -w

华丽丽的刷机过程开始了。

下面附上我成功刷入的几张图,嘚瑟一下我的战果。(^__^) 嘻嘻……

A bowl of bananas A bowl of bananas A bowl of bananas

结束语

希望大家都快快乐乐的编译成功。记住,一定要有耐心!就一定会成功的!

小球球

继续阅读此作者的更多文章

深圳