Macbook Pro下载编译Android8.1以及各种坑和排坑

废话不多说,参考Goolgle官网如下:
要求
搭建编译环境
下载源代码
准备编译

个人建议:认认真真把这4个链接看完,该记录的地方记录,真真正正的学会整个过程,而不是简单的抄袭各种解决方案!!!

本次编译成功所以依赖的系统,工具及其版本如下:

  1. Macbook Pro:macOS High Sieera 即 10.13.6;
  2. Macbook Pro:2013年机器,8G+256SSD,剩余120G可用。
  3. 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 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 "[email protected]"

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 

没有办法解决,直接将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的简单的替换,后期开发,后续再写文章吧。

你可能感兴趣的:(Android)