Mac下编译Android Framework源码的搭建及排坑

由于本人最近才开始接触 Android Framework,本文主要介绍在Mac 环境下源码的下载、编译、及一些自己遇到的坑,希望能帮助大家。

目录

1.环境准备

Mac 系统版本 10.14.4 (18E226)

XCode 版本  10.2.1 (10E1001)

因为mac电脑内存相对比较小点,源码的体积比较大,首先我们用一块移动硬盘专门存放源码,这里要对硬盘进行分区,分区类型选择 Mac OS 扩展(区分大小写,日志式)。大概要分出 250GB 大小。

Mac下编译Android Framework源码的搭建及排坑_第1张图片

Mac下编译Android Framework源码的搭建及排坑_第2张图片

2.源码下载


参见 github-android-open-source-project-analysis (下载准备工具、源码下载)

3.编译


下载完源码后,我们进入源码目录,输入指令开始编译

(1)首先要切换shell,要使用 bash 进行编译

chsh -s /bin/bash

(2)清空之前build文件

make clobber

(3)正式开始编译

source build/envsetup.sh

Mac下编译Android Framework源码的搭建及排坑_第3张图片

lunch

选择需要编译的版本的时候要注意:要选择你自己手机的系统版本号。

Mac下编译Android Framework源码的搭建及排坑_第4张图片

所有的构建目标由 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 的信息可以使用如下命令:

Mac下编译Android Framework源码的搭建及排坑_第5张图片

Mac下编译Android Framework源码的搭建及排坑_第6张图片

可以看出我的 CPU 是双核、四线程,主频为1.8GHz的i7-2677M。

make -j8

为什么是-j8 呢,因为我的cpu是4线程的,所以要 线程数*2 就是8了。

输入这个命令后就开始编译了。

(4)遇到的各种坑

坑1:bison问题

Mac下编译Android Framework源码的搭建及排坑_第7张图片

如果在编译的过程中,你可能遇到的和这个问题不一样,但是只要结尾是:
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 

Mac下编译Android Framework源码的搭建及排坑_第8张图片

坑2:xcode sdk版本

Mac下编译Android Framework源码的搭建及排坑_第9张图片

解决方案:

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:各种头文件找不到

Mac下编译Android Framework源码的搭建及排坑_第10张图片

关于这个网上有的人建议的办法是把xcode版本 降级到 8.1,但是我自己mac版本比较高,8.1版本安装不了,只能重装mac低版本系统,这样的话我好多的开发工具都要重新安装,我不建议这样;

解决办法:我把 macOCX10.14sdk的版本去掉了,然后安装了10.11、10.12、10.13的sdk,重新编译一下就不会报错了。

坑4:JVM的OOM错误

Mac下编译Android Framework源码的搭建及排坑_第11张图片

解决方案:

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%才报这个错,而且网上都没有对这个做细说)

Mac下编译Android Framework源码的搭建及排坑_第12张图片

网上的说法:

(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

结果:

Mac下编译Android Framework源码的搭建及排坑_第13张图片

结果找了各种方法,一开始以为是安装包有问题,更换了几个情况还是一样,最后在一个linx文章中提到 xz要配置环境变量,之前一直在查mac安装xz的文章一直没提到环境变量这个说法,就忽略了,后面配置一下。

Mac下编译Android Framework源码的搭建及排坑_第14张图片

4 编译成功


Mac下编译Android Framework源码的搭建及排坑_第15张图片

经过漫长的等待终于成功了,来来回来各种报错,踩了不少的坑,折腾了好几天。

到这里,编译成功,本文所遇到的问题,希望能给跟我同样问题烦恼的朋友给予帮助(毕竟坑我都踩过了),至于framework的修改编译,真机运行,我会在下篇文章介绍。

你可能感兴趣的:(framework)