由于本人最近才开始接触 Android Framework,本文主要介绍在Mac 环境下源码的下载、编译、及一些自己遇到的坑,希望能帮助大家。
目录
1.环境准备
Mac 系统版本 10.14.4 (18E226)
XCode 版本 10.2.1 (10E1001)
因为mac电脑内存相对比较小点,源码的体积比较大,首先我们用一块移动硬盘专门存放源码,这里要对硬盘进行分区,分区类型选择 Mac OS 扩展(区分大小写,日志式)。大概要分出 250GB 大小。
2.源码下载
参见 github-android-open-source-project-analysis (下载准备工具、源码下载)
3.编译
下载完源码后,我们进入源码目录,输入指令开始编译
(1)首先要切换shell,要使用 bash 进行编译
chsh -s /bin/bash
(2)清空之前build文件
make clobber
(3)正式开始编译
source build/envsetup.sh
lunch
选择需要编译的版本的时候要注意:要选择你自己手机的系统版本号。
所有的构建目标由 BUILD-BUILDTYPE的形式组成:
BUILD对应 codename
这是官方提供的一份对照表:
|Device| Code name| Build configuration
|---|---|
|Pixel XL |marlin |aosp_marlin-userdebug|
|Pixel|sailfish |aosp_sailfish-userdebug|
|HiKey| hikey| hikey-userdebug|
|Nexus 6P| angler |aosp_angler-userdebug|
|Nexus 5X |bullhead |aosp_bullhead-userdebug|
|Nexus 6 |shamu |aosp_shamu-userdebug|
|Nexus Player |fugu| aosp_fugu-userdebug|
|Nexus 9 |volantis (flounder) |aosp_flounder-userdebug|
|Nexus 5 (GSM/LTE) |hammerhead |aosp_hammerhead-userdebug|
|Nexus 7 (Wi-Fi) |razor (flo) |aosp_flo-userdebug|
|Nexus 7 (Mobile) |razorg (deb) |aosp_deb-userdebug|
|Nexus 10 |mantaray (manta) |full_manta-userdebug|
|Nexus 4 |occam (mako) |full_mako-userdebug|
|Nexus 7 (Wi-Fi) |nakasi (grouper)| full_grouper-userdebug|
|Nexus 7 (Mobile)| nakasig (tilapia)| full_tilapia-userdebug|
|Galaxy Nexus (GSM/HSPA+)| yakju (maguro)| full_maguro-userdebug|
|Galaxy Nexus (Verizon) |mysid (toro) |aosp_toro-userdebug|
|Galaxy Nexus (Experimental) |mysidspr (toroplus) |aosp_toroplus-userdebug|
|Motorola Xoom (U.S. Wi-Fi) |wingray |full_wingray-userdebug|
|Nexus S| soju (crespo)| full_crespo-userdebug|
|Nexus S 4G |sojus (crespo4g) |full_crespo4g-userdebug|
BUILD_TYPE对照表:
构建类型 | 用途 |
---|---|
user | 有限的访问权限,主要用于发布正式产品,没有 root 跟调试权限 |
userdebug | 跟 user 类型差不多,但是多了 root 跟 debug 调试权限 |
eng | 拥有各种调试工具的开发版设置,拥有 root 跟 debug 权限 |
如果作为开发使用的话,那我们一般都是选 -eng,
这里我自己的真机对应的aosp_angler-userdebug,所以我选择了 28。
sysctl machdev.cpu
MacOS X 命令查看CPU信息
在 MAC 和 BSD 系统下,可以使用 sysctl 命令设置或查看内核状态,要查看 CPU 的信息可以使用如下命令:
可以看出我的 CPU 是双核、四线程,主频为1.8GHz的i7-2677M。
make -j8
为什么是-j8 呢,因为我的cpu是4线程的,所以要 线程数*2 就是8了。
输入这个命令后就开始编译了。
(4)遇到的各种坑
坑1:bison问题
如果在编译的过程中,你可能遇到的和这个问题不一样,但是只要结尾是:ninja failed with :status 1
就可以采用如下方法:
解决方案:
cd external/bison
touch patch-high-sierra.patch
vim patch-high-sierra.patch
写入如下内容:
With format string strictness, High Sierra also enforces that %n isn't used
in dynamic format strings, but we should just disable its use on darwin in
general.
--- lib/vasnprintf.c.orig 2017-06-22 15:19:15.000000000 -0700
+++ lib/vasnprintf.c 2017-06-22 15:20:20.000000000 -0700
@@ -4869,7 +4869,7 @@ VASNPRINTF (DCHAR_T *resultbuf, size_t *
#endif
*fbp = dp->conversion;
#if USE_SNPRINTF
-# if !(((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined __UCLIBC__) || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__))
+# if !defined(__APPLE__) && !(((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined __UCLIBC__) || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__))
fbp[1] = '%';
fbp[2] = 'n';
fbp[3] = '\0';
还在external/bison目录下
patch -p0 < patch-high-sierra.patch
mm
如果mm命令显示没有此命令的话,那是因为需要执行:(源码根目录)
source build/envsetup.sh
lunch 28
然后再回到external/bison,完成mm命令,等待编译完成,回到根目录,croot命令可以快速回到根目录,执行如下命令:
cp ./out/host/darwin-x86/obj/EXECUTABLES/bison_intermediates/bison ./prebuilts/misc/darwin-x86/bison/bison
坑2:xcode sdk版本
解决方案:
cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
ls
vim build/soong/cc/config/x86_darwin_host.go
修改内容如下:
darwinSupportedSdkVersions = []string{
"10.10",
"10.11",
"10.12",
"10.13",
坑3:各种头文件找不到
关于这个网上有的人建议的办法是把xcode版本 降级到 8.1,但是我自己mac版本比较高,8.1版本安装不了,只能重装mac低版本系统,这样的话我好多的开发工具都要重新安装,我不建议这样;
解决办法:我把 macOCX10.14sdk的版本去掉了,然后安装了10.11、10.12、10.13的sdk,重新编译一下就不会报错了。
坑4:JVM的OOM错误
解决方案:
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server
坑5:JVM的OOM错误
error: Error: could not find jdk tools.jar at /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/../lib/tools.jar, please check if your JDK was installed correctly.
解决方案:
usr/libexec/java_home -V //查看jdk目录
vim ~/.bash_profile
#修改内容如下:
#set jdk 1.8 path
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/
export JAVA_HOME=$JAVA_8_HOME
export PATH=$JAVA_HOME/bin:$PATH:.
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
坑6:xz的问题(都92%才报这个错,而且网上都没有对这个做细说)
网上的说法:
(1)下载:
http://tukaani.org/xz/
xz-5.2.3.tar.gz
(2)安装解压:
$ tar -zxf xz-5.2.3.tar.gz
(3)编译
$ cd xz-5.2.3
$ ./configure
$ make
$ make install
(4)验证
$ xz -V
结果:
结果找了各种方法,一开始以为是安装包有问题,更换了几个情况还是一样,最后在一个linx文章中提到 xz要配置环境变量,之前一直在查mac安装xz的文章一直没提到环境变量这个说法,就忽略了,后面配置一下。
4 编译成功
经过漫长的等待终于成功了,来来回来各种报错,踩了不少的坑,折腾了好几天。
到这里,编译成功,本文所遇到的问题,希望能给跟我同样问题烦恼的朋友给予帮助(毕竟坑我都踩过了),至于framework的修改编译,真机运行,我会在下篇文章介绍。