Mac下Android源码下载与编译
正文:
作为一名程序猿,搞一台mac作为开发机器,也是相当不错的。虽说mac相较于其他性价比比较低,但是作为体验型产品,也是有着其无法替代的优势。第一:续航,出门在外mac的续航真心可以,撸着代码坚持个6个小时也是杠杠的。如果是windows机器,新的电池估计也就能坚持个3个小时最多,这一点还是mac比较方便。第二:屏幕,mac的retina屏幕比普通的windows机器要好得多,这也不是你加价钱就能买到更好的。当然了,如果这方面没需求的小伙伴自然也不用考虑mac了。第三,稳定性,mac系统的稳定性确实比windows要好,除了qq浏览器在mac上不知道为啥时不时就无响应,其他应用目前用得还是非常流畅的。不像windows机器,即使很贵很好的机器,时不时就资源管理器重启,搞程序的大多都这样吧,可以接受不是特别快,但是无法接受一卡一卡的,就是快的时候特别快,然后突然又卡那么一小会。第四,逼格,这个对于我来说一点用都没用,我还觉得mac的键盘面板做得好丑。不过对于部分人来说,逼格还是相当重要的。
闲话说够了,就开始说一下编译话题的。作为一名android平台开发者,编译android源码自己来鼓捣是成长路上必不可少的一环。本来我是打算借用公司服务器进行android原生源码的编译,不过由于没有root权限,软件方面不能自己想装啥就装啥,更配备不了VPN,所以还是自己先在自己机器上编一波,后面再拷贝过去。
经过参考了网上很多篇介绍说明,我整理了一下,主要是针对一台完全没有配置过的mac系统,因为坑爹的我发现网上很多文章介绍只介绍了一半,大多都是直接下载就开编了。我下载的是android6.0的编译源码,机器从零开始。mac系统本身就是基于unix系统,原来就配备有
步骤1:下载Xcode,在mac上编译Android源码需要依赖MacOSX10.xx.SDK,这个到APP STORE下载就好。
步骤2:配备javajdk。这个要看你编译的android源码需要的是哪一版本的,通常使用jdk1.7或者1.8就可以了。不过需要注意的是在mac10.10系统以后安装jdk1.7和1.8会有装不进去的情况,这里需要对安装包进行重新打包一下。具体操作方法可参考以下链接:http://blog.csdn.net/daiyelang/article/details/42779645
步骤3:创建磁盘环境。
Step 1. 创建一个大小写敏感的磁盘镜像
$ sudo hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 80g ~/android.dmg
当然,你可能觉得80g不够用,就自己给大点,只要不超过镜像文件所在磁盘的剩余空间就行,还有点就是镜像文件在磁盘上占的空间大小是你向镜像文件里放置的文件的实际大小,而不是上面定义的80g,这个最大空间的大小将来还能更改,所以不必担心弄太大占了空间,如果通过上面已经创建了,你可以通过下面重新设置镜像大小
$ sudo hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
Step 2. 加载分区
$ sudo hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android
步骤4:设置文件描述符限制
Mac 系统下默认只能同时打开 1024 个文件,而在进行Android源码编译时有可能会超出这个限制,因此需要解除这个限制。在~/.bash_profile中添加以下内容:
ulimit -S -n 1024
步骤5:下载repo文件并修改repo路径
下载repo文件之前,可以先创建一个bin文件夹,用于存放repo脚本。
$ mkdir ~/bin
$ PATH=~/bin:$PATH
然后在命令行中输入下面的命令,下载Repo,并且修改属性:
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
当然啦,通过上面的路径下载是需要VPN的,我们也可以使用清华tuna的镜像源进行下载,那就不用挂VPN啦。编辑repo文件,修改REPO_URL地址为
REPO_URL = 'https://gerrit-googlesource.lug.ustc.edu.cn/git-repo'
步骤6:下载源码
终于到了激动人心的下载源码的时刻了,双击第一步生成镜像文件,然后可以重命名为AOSP,然后进入镜像文件
cd /Volumes/AOSP/
创建源码目录:
mkdir android-6.0.1
cd android-6.0.1
根据你的Nexus设备,选择代码分支:Source Code Tags and Builds,我的是Nexus 6,支持Nexus 6的分支有android-6.0.1_r06。执行repo init
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r06
完成后,执行下面的命令,
repo sync
由于下载源码的时间太长,中途可能会出现中断情况,虽然repo同步是支持断点续传,但是不知道什么时候会断开,这一点很麻烦,所以可以写一个shell脚本来开启同步。
可以打开sublime text命名新建一个aospdown.sh,然后拷贝到android-6.0.1,运行./aospdown.sh,等待下载
#!/bin/bash
PATH=~/bin:$PATH
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r59
repo sync
while [ $? = 1 ]; do
echo "================sync failed, re-sync again ====="
sleep 3
repo sync
done
下载完成后可以,完成后可以删除.repo/文件
$ rm -rf .repo/
步骤7:下载驱动
把你对应的机型的驱动都下载下来,然后解压到android-6.0.1 根目录。以nexus 7的6.0.1为例,解压过来之后分别是三个sh文件extract-asus-flo.sh、extract-broadcom-flo.sh、extract-qcom-flo.sh。分别都执行以下,就会在根目录生成vendor目录,里面就是需要编译的驱动文件。
好啦好啦,至此android源码已经下载完毕,可以开始编译了。
编译部分
如果你和我一样,使用的是Mac OS 的EI Capitan系统,在编译之前,需要做一些兼容性处理。打开build/core/combo/mac_version.mk文件,在mac_sdk_versions_supported变量后添加版本号10.11:
mac_sdk_versions_supported := 10.6 10.7 10.8 10.9 10.11 10.12
接下来就可以开编啦,至于选择的机型,可以根据这个去找,
https://source.android.com/source/running.html#selecting-device-build
当然了,编译过程还会遇到一些问题,也是需要继续配置的。在这里我在网上整理了一下,大致有如下几个问题。
下载源码遇到的问题一:
这个error信息忘了详细记录了,就是某个./repo/projects/.............下面报错了,把报错的文件夹删掉,repo sync
error:
………………………………………………………………………...
Traceback (most recent call last):
File "/Volumes/aosp/android-6.0.1/.repo/repo/main.py", line 531, in
_Main(sys.argv[1:])
…………………………….
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd4 in position 578: ordinal not in range(128)
解决办法:根据error的提示,删除./repo/projects/...相应下的git就行了,然后再repo sync
编译源码遇到的问题二:
build/core/combo/mac_version.mk:39: * Can not find SDK 10.12 at /Developer/SDKs/MacOSX10.6.sdk
build/core/combo/mac_version.mk:40: *****************************************************
build/core/combo/mac_version.mk:41: *** Stop.. Stop.
配置mac_sdk_versions_supported里添加10.12
编译源码遇到的问题三:
system/core/libcutils/threads.c:38:10: error: 'syscall' is deprecated: first deprecated in OS X 10.12 - syscall(2) is unsupported; please switch to a supported interface. For SYS_kdebug_trace use kdebug_signpost(). [-Werror,-Wdeprecated-declarations]
return syscall(SYS_thread_selfid);
^
host C: libcutils <= system/core/libcutils/iosched_policy.c
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/unistd.h:733:6: note: 'syscall' has been explicitly marked deprecated here
int syscall(int, ...);
MacOSX-SDKs下载地址:https://github.com/phracker/MacOSX-SDKs
删除10.12,下载MacOSX10.11.sdk,解压拷贝到/Applications/XCode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
然后确保AOSP源码下build/core/combo/mac_version.mk文件中
mac_sdk_versions_supported := 10.9 10.10 10.11
后面不要写10.12。
编译源码遇到的问题四:
找不到com.sun.javadoc.ClassDoc
external/doclava/src/com/google/doclava/ClassInfo.java:20:
error: package com.sun.javadoc does not exist import com.sun.javadoc.ClassDoc;external/doclava/src/com/google/doclava/apicheck/XmlApiFile.java:80:
error: cannot find symbol ClassDoc classDoc = null; ^
symbol: class ClassDoc location: class XmlApiFile Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 163 errors
make: *** [out/host/common/obj/JAVA_LIBRARIES/doclava_intermediates/javalib.jar] Error 41
在bash_profile里添加
export ANDROID_JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home