下载源码
你可以从 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
new disk image.png源码是 23G, 编译后是 60G, 所以建议新建磁盘至少 80G
这条命令会在用户主目录下面生成 android.dmg 镜像文件
双击 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 目录里面就行了
继续 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 android-jack-team@google.com)).
GC overhead limit exceeded.
Try increasing heap size with java option '-Xmx<size>'.
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 命令启动模拟器
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 层代码并编译测试了。
网友评论