正文:
本来我是打算借用公司服务器进行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