mac10.12 编译 android-7.0 源码

下载源码

你可以从 google 或 清华的镜像进行同步,android 源码非常大(20 - 50 G)通常都要同步好几天,而且中间还不断出错断开。

当然你也可以下载或拷贝别人下载好的源码,这样不好的地方是不能同步最新的代码了。如果你下载的源码中有 .repo 文件夹应该也是可以同步最新代码的。

我从百度网盘 https://pan.baidu.com/s/1ngsZs 下载了 android-7.0.0_r1 源码, 7zip 压缩后 6.73G。

推荐用 https://github.com/iikira/BaiduPCS-Go 工具下载,我下载时能达到 7M/s , 20 分钟就下载完了。

编译环境准备

主要参考官网 https://source.android.google.cn/setup/build/initializing

mac 文件系统是大小写不敏感的,可能导致编译出错,所以第一步新建一个大写小敏感的磁盘。
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 100g ~/android.dmg

源码是 23G, 编译后是 60G, 所以建议新建磁盘至少 80G
这条命令会在用户主目录下面生成 android.dmg 镜像文件

mac10.12 编译 android-7.0 源码_第1张图片
new disk image.png

双击 android.dmg.sparseimage 挂载这个磁盘,把原代码拷贝到新建的磁盘中

安装依赖
  • JDK1.8 (android7.0 ~ android8.0 需要 JDK1.8)
  • Xcode
  • Xcode command line tools (通过 xcode-select --install 命令安装)
  • 安装 MacPorts, 从这里下载相应版本 https://www.macports.org/install.php
  • 用 MacPort 安装其它依赖库
POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
设置最大打开文件数
ulimit -S -n 1024

编译

source build/envsetup.sh
报错
WARNING: Only bash is supported, use of other shell would lead to erroneous results

直接切换到 bash, 输入 bash 命令

执行 lunch 
make -j8   # 开启 8 线程编译
报错找不到 SDK
2018-03-28 21:46:59.877 xcodebuild[31923:2630108] Failed to load plugin at: /Users/lesliefang/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Unity4XC.xcplugin, skipping.  Reason for failure: *** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]
build/core/combo/mac_version.mk:26: none of the installed SDKs (ac_sdk_versions_installed) match supported versions (10.8 10.9 10.10 10.11), trying 10.8
build/core/combo/mac_version.mk:36: no SDK 10.8 at /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk, trying legacy dir
build/core/combo/mac_version.mk:40: *****************************************************
build/core/combo/mac_version.mk:41: * Can not find SDK 10.8 at /Developer/SDKs/MacOSX10.8.sdk
build/core/combo/mac_version.mk:42: *****************************************************
build/core/combo/mac_version.mk:43: *** Stop..  Stop.

build/core/combo/mac_version.mk 中配置的 SDK 是

mac_sdk_versions_supported :=  10.8 10.9 10.10 10.11

而我系统中只有 10.12
Xcode SDK 路径是

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs

从这里 https://github.com/phracker/MacOSX-SDKs/releases 下载 10.11 扔到 SDK 目录里面就行了

mac10.12 编译 android-7.0 源码_第2张图片
sdk.png

继续 make ,编译到 45%报错,内存不足,坑爹啊。所以这里大家务必提前设置

[ 45% 14861/32771] Building with Jack: out/target/common/ob...VA_LIBRARIES/framework_intermediates/with-local/classes.dex
FAILED: /bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rsp
Out of memory error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by [email protected])).
GC overhead limit exceeded.
Try increasing heap size with java option '-Xmx'.
Warning: This may have produced partial or corrupted output.
[ 45% 14861/32771] Building with Jack: out/target/common/obj/JAVA_LIBRARIES/colorpicker_intermediates/classes.jack
ninja: build stopped: subcommand failed.
make: *** [ninja_wrapper] Error 1

我们对prebuilts/sdk/tools/jack-admin文件进行如下修改:
1.找到如下语句:

JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"

2.将上述语句修改为:

JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"

主要是添加了-Xmx4096m参数,接下来在源码目录下执行如下命令重启jack-admin服务:

./prebuilts/sdk/tools/jack-admin stop-server
./prebuilts/sdk/tools/jack-admin start-server

重启完jack-admin服务后,此时再重新执行编译命令就能编译通过ninja了

compile.png

编译了1小时18分 编译成功

执行 emulator 命令启动模拟器
mac10.12 编译 android-7.0 源码_第3张图片
emualtor.png

模拟器特别卡,要有耐心

怎么没有编译 Linux 内核??? prebuilts/qemu-kernel 下面有编译好的内核镜像, 我编译的 target 是 aosp_arm_eng, 不带任何参数启动模拟器使用的内核镜像就是 prebuilts/qemu-kernel/arm/kernel-qemu

如果你有 Nexus 或 Pixel 手机就可以把 ROM 刷到手机里面了

android源码编译后在 out/target/product/generic 下生成
system.img, ramdisk.img,userdata.img 镜像文件。

  • ramdisk.img 是emulator的文件系统
  • system.img 包括了主要的包, 库等文件
  • userdata.img 包括了一些用户数据

emulator加载这3个镜像文件后, 会把 system 和 userdata 分别加载到 ramdisk 文件系统中的 system 和 userdata 目录下

接下来我们就可以学习修改 framework 层代码并编译测试了。

你可能感兴趣的:(mac10.12 编译 android-7.0 源码)