废话不多说,参考Goolgle官网如下:
要求
搭建编译环境
下载源代码
准备编译
个人建议:认认真真把这4个链接看完,该记录的地方记录,真真正正的学会整个过程,而不是简单的抄袭各种解决方案!!!
本次编译成功所以依赖的系统,工具及其版本如下:
- Macbook Pro:macOS High Sieera 即 10.13.6;
- Macbook Pro:2013年机器,8G+256SSD,剩余120G可用。
- Macbook Pro:Xcode 8.1
此处高危
强烈建议将Mac上的Xcode降级到8.1!
强烈建议将Mac上的Xcode降级到8.1!
强烈建议将Mac上的Xcode降级到8.1!
原因
本人Mac电脑,在此之前自动升级全打开,所以Xcode一直保持最新版。但是,后来的编译过程中有几个QuickTime所依赖的库,编译Android源码也需要,需要额外自己添加,并且苹果在2008年就停止维护。
进入正题:
设置 Mac OS 编译环境
在默认安装过程中,Mac OS 会在一个保留大小写但不区分大小写的文件系统中运行。但是,Git需要区分大小写,所以按照Google给出的解决方案:
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg
这将创建一个 .dmg(也可能是 .dmg.sparseimage)文件,该文件在装载后可用作具有 Android 开发所需格式的驱动盘。
如果您以后需要更大的存储卷,还可以使用以下命令来调整稀疏映像的大小:
hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
对于存储在主目录下的名为 android.dmg 的磁盘映像,您可以向 ~/.bash_profile 中添加辅助函数:
- 要在执行 mountAndroid 时装载磁盘映像,请运行以下命令:
# mount the android file image
mountAndroid() { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }
- 要在执行 umountAndroid 时卸载磁盘映像,请运行以下命令:
# unmount the android file image
umountAndroid() { hdiutil detach /Volumes/android; }
此处,我遇到了坑:
问题描述:编译了很多,都出现了 no free space,于是我把磁盘扩大到120G,但是还是出现了 no free space问题。
问题解决:外接一个移动硬盘(500G),然后将dmg文件扩大到200G,然后使用如下命令移动到移动硬盘:
mv ~/android.dmg /Volumes/移动硬盘名/
如果你按照我的执行,你会发现错误提示readonly,这是由于Mac对于Windows文件格式有抵触,建议安装Mounty,可以解决此问题。
Mounty下载
接着需要修改:
- 要在执行 mountAndroid 时装载磁盘映像,请运行以下命令(修改后):
mountAndroid() { hdiutil attach /Volumes/移动硬盘名/android.dmg -mountpoint /Volumes/android; }
在终端执行
mountAndroid
之前,必须保证移动硬盘是经过Mounty挂载好了。这个过程是自动完成的。
安装所需的软件包
1、使用以下命令安装 Xcode 命令行工具:
xcode-select --install
2、MacPorts下载,请确保 /opt/local/bin 在路径中显示在 /usr/bin 前面。否则,请将以下内容添加到 ~/.bash_profile 文件中:
export PATH=/opt/local/bin:$PATH
3、通过 MacPorts 获取 Make、Git 和 GPG 软件包:
POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
POSIXLY_CORRECT=1 sudo port install bison
设置文件描述符数量上限
在 Mac OS 中,可同时打开的文件描述符的默认数量上限太低,在高度并行的编译流程中,可能会超出此上限。要提高此上限,请将下列行添加到 ~/.bash_profile 中:
# set the number of open files to be 1024
ulimit -S -n 1024
在这里给出完整的~/.bash_profile:
#mysql enviroment path
export PATH=/usr/local/mysql/bin:$PATH
# Enable tab completion
source ~/.udacity-terminal-config/git-completion.bash
# Change command prompt
source ~/.udacity-terminal-config/git-prompt.sh
# colors!
red="\[\033[38;5;203m\]"
green="\[\033[38;05;38m\]"
blue="\[\033[0;34m\]"
reset="\[\033[0m\]"
export GIT_PS1_SHOWDIRTYSTATE=1
# '\u' adds the name of the current user to the prompt
# '\$(__git_ps1)' adds git-related stuff
# '\W' adds the name of the current directory
export PS1="$red\u$green\$(__git_ps1)$blue \W
$ $reset"
# Setting PATH for Python 3.6
# The original version is saved in .bash_profile.pysave
export PATH="/Library/Frameworks/Python.framework/Versions/3.6/bin:${PATH}"
#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:.
# mount the android file image
mountAndroid() { hdiutil attach /Volumes/luopan/android.dmg.sparseimage -mountpoint /Volumes/android; }
# unmount the android file image
umountAndroid() { hdiutil detach /Volumes/android; }
# set the number of open files to be 1024
ulimit -S -n 1024
##
# Your previous /Users/luopan/.bash_profile file was backed up as /Users/luopan/.bash_profile.macports-saved_2018-08-12_at_21:18:07
##
# MacPorts Installer addition on 2018-08-12_at_21:18:07: adding an appropriate PATH variable for use with MacPorts.
export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
# Finished adapting your PATH environment variable for use with MacPorts.
#build vlc enviroment needed
export ANDROID_SDK=/Users/luopan/Library/Android/sdk
export ANDROID_NDK=/Users/luopan/opt/android-ndk-r14b
export PATH=$ANDROID_SDK/platform-tools:$ANDROID_SDK/tools:$PATH
export NO_NEON=1
AUTOPOINT_PATH=/usr/local/Cellar/gettext/0.19.8.1/bin
export PATH=$PATH:$AUTOPOINT_PATH
#repo enviroment needed
export PATH=$PATH:~/bin
安装 Repo
Repo 是一款工具,可让您在 Android 环境中更轻松地使用 Git。
要安装 Repo,请执行以下操作:
1、确保主目录下有一个 bin/ 目录,并且该目录包含在路径中:
mkdir ~/bin
PATH=~/bin:$PATH
2、下载 Repo 工具,并确保它可执行:
//这个是Google官网的,由于国内有不可描述的原因,是下载不下来的。
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
// 这个是清华的,亲测可用
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
初始化 Repo 客户端
安装 Repo 后,设置您的客户端以访问 Android 源代码代码库:
1、创建一个空目录来存放您的工作文件。如果您使用的是 MacOS,必须在区分大小写的文件系统中创建该目录。为其指定一个您喜欢的任意名称:(建议名称根据下载版本命名)
mountAndroid
cd /Volumes/android
mkdir android-8.1.0_r15
cd android-8.1.0_r15
2、使用您的真实姓名和电子邮件地址配置 Git。
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
3、运行 repo init 以获取最新版本的 Repo 及其最近的所有错误更正内容。您必须为清单指定一个网址,该网址用于指定 Android 源代码中包含的各个代码库将位于工作目录中的什么位置。
// 改变下载源码的地址,否则下载失败
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
// 开始拉去8.1的源码清单文件
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r15
初始化成功后,系统将显示一条消息,告诉您 Repo 已在工作目录中完成初始化。客户端目录中现在应包含一个 .repo 目录,清单等文件将保存在该目录下。
下载 Android 源代码树
要将 Android 源代码树从默认清单中指定的代码库下载到工作目录,请运行以下命令:
repo sync
根据网速,一般3个小时可以下载完成。
准备编译
1、为了确保新安装的二进制文件在解压后会被适当考虑在内,请使用以下命令删除所有以前编译操作的已有输出:
make clobber
2、进入到源码根目录下,设置环境
source build/envsetup.sh
3、执行lunch,选择需要编译的版本
$ lunch
You're building on Darwin
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_mips-eng
4. aosp_mips64-eng
5. aosp_x86-eng
6. aosp_x86_64-eng
7. full_fugu-userdebug
8. aosp_fugu-userdebug
9. aosp_car_emu_arm-userdebug
10. aosp_car_emu_arm64-userdebug
11. aosp_car_emu_x86-userdebug
12. aosp_car_emu_x86_64-userdebug
13. mini_emulator_arm64-userdebug
14. m_e_arm-userdebug
15. m_e_mips-userdebug
16. m_e_mips64-eng
17. mini_emulator_x86-userdebug
18. mini_emulator_x86_64-userdebug
19. uml-userdebug
20. aosp_dragon-userdebug
21. aosp_dragon-eng
22. aosp_marlin-userdebug
23. aosp_marlin_svelte-userdebug
24. aosp_sailfish-userdebug
25. aosp_walleye-userdebug
26. aosp_walleye_test-userdebug
27. aosp_taimen-userdebug
28. aosp_angler-userdebug
29. aosp_bullhead-userdebug
30. aosp_bullhead_svelte-userdebug
31. hikey-userdebug
32. hikey960-userdebug
Which would you like? [aosp_arm-eng] 24
这是由于android-8.1.0_r15适用于pixel手机,pixel对应的代号是sailfish。
4、编译源码
make -j4
如果你可以正常的走到这里,你会发现还是会有很多坑,接下来会有专门解坑的:
坑一:bison问题
[ 0% 310/89583] //external/selinux/ch...eckpolicy yacc policy_parse.y [darwin FAILED: out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.c out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.h BISON_PKGDATADIR=external/bison/data prebuilts/misc/darwin-x86/bison/bison -d --defines=out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.h -o out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.c external/selinux/checkpolicy/policy_parse.y [ 0% 317/89583] //system/core/bootstat:bootstat clang++ bootstat.cpp ninja: build stopped: subcommand failed. 12:58:42 ninja failed with: exit status 1
如果在编译的过程中,你可能遇到的和这个问题不一样,但是只要结尾是:
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 24
然后再回到external/bison,完成mm命令,等待编译完成,回到根目录,croot命令可以快速回到根目录,执行如下命令:
cp ./out/host/darwin-x86/obj/EXECUTABLES/bison_intermediates/bison ./prebuilts/misc/darwin-x86/bison/bison
坑2:各种头文件找不到
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Headers/Carbon.h:34:10: fatal error: 'CarbonSound/CarbonSound.h' file not found
#include <CarbonSound/CarbonSound.h>
没有办法解决,直接将Xcode降级到8.1,可以解决所有。
坑3:文件描述符的问题,感觉
Created filesystem with 39/35200 inodes and 7290/140800 blocks stat: cannot read file system information for '%z': No such file or directory /bin/bash: File: "out/target/product/generic/userdata.img" ID: 100000a00000017 Namelen: ? Type: hfs Block size: 4096 Fundamental block size: 4096 Blocks: Total: 80212992 Free: 50854175 Available: 50854175 Inodes: Total: 4294967279 Free: 4294163940 + 0 : syntax error in expression (error token is ": "out/target/product/generic/userdata.img" ID: 100000a00000017 Namelen: ? Type: hfs Block size: 4096 Fundamental block size: 4096 Blocks: Total: 80212992 Free: 50854175 Available: 50854175 Inodes: Total: 4294967279 Free: 4294163940 + 0 ") [ 84% 27299/32477] target Package: Set...PS/Settings_intermediates/package.apk) nothing matches overlay file suw_navbar_ic_back.xml, for flavor anydpi-v21 nothing matches overlay file suw_navbar_ic_more.xml, for flavor anydpi-v21 nothing matches overlay file suw_navbar_ic_next.xml, for flavor anydpi-v21 nothing matches overlay file suw_progress_bar.xml, for flavor v21 ninja: build stopped: subcommand failed. make: *** [ninja_wrapper] Error 1
解决方案:
vim build/core/combo/HOST_darwin-x86.mk
在文件的结尾处添加:
# $(1): The file to check
define get-file-size
GSTAT=$(which gstat) ; \
if [ ! -z "$GSTAT" ]; then \
gstat -c "%s" $(1) ; \
else \
stat -f "%z" $(1) ; \
fi endef
坑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:
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:
Could not find a supported mac sdk: [“10.10” “10.11” “10.12” “10.13”]
解决方案:
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",
注意:坑6是网上的解决方案,但是这样做了以后坑2这辈子也别想简单解决了,因为每一次Xcode升级都会出现这样的问题,并且也不是中低级人员可以解决的,望深知。
至此,编译成功,中秋三天假日也完了。
本文只代表了本文所遇到的问题,并且由于没有真机,只能使用模拟器,采用adb命令进行简单的 system、so、apk的简单的替换,后期开发,后续再写文章吧。