记一次Android源码编译过程
实验环境
- MacOS Mojave 10.14; RAM 16G
- SSD硬盘 960G
- 能访问google的网络环境
第一步:准备环境
可参考官网说明:https://source.android.com/setup/build/initializing
- 准备磁盘
- 磁盘镜像方式(官方推荐25G,建议60G+)
# 创建一个 .dmg(也可能是 .dmg.sparseimage)文件
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 60g ~/android.dmg
# 调整大小
hdiutil resize -size 100g ~/android.dmg.sparseimage
# 在 .bash_profile 中添加挂载辅助函数
mountAndroid() { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }
umountAndroid() { hdiutil detach /Volumes/android; }
- 外置硬盘方式:直接格式外外置硬盘(MAC OS拓展 (区分大小写,日志式))
- 安装Xcode命令行工具:这一步一般会需要最新的MacOS大版本(目前需要MoJave)
# 安装Xcode命令行工具 ,直接使用最新版本会有一些问题,可以在下面的链接下载旧版本的命令行工具即可(9.4.1)
# 建议从这里下:https://developer.apple.com/download/more/
xcode-select --install
- 安装MacPorts:https://www.macports.org/install.php
# 从上面的链接选择合适版本安装后,编辑 ~/.bash_profile,确保 /opt/local/bin 必须显示在 /usr/bin 前面:
export PATH=/opt/local/bin:$PATH
- 用MacPorts准备相关编译工具
# 分别是gmake,libsdl,gnupg(gnupg1过时了,这里选择gnupg2),git
POSIXLY_CORRECT=1 sudo port install gmake libsdl gnupg2 git
- 设置文件符数量上限
# ~/.bash_profile: set the number of open files to be 1024
ulimit -S -n 1024
- 配置Repo与下载源码
mkdir ~/bin
PATH=~/bin:$PATH
# 下载Repo
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
# 挂载磁盘并创建源码存放路径
mountAndroid
mkdir /Volumes/android/aosp
cd /Volumes/android/aosp
# 检出分支 默认master 加 -b android-8.1.0_r64 可切换到8.1
repo init -u https://android.googlesource.com/platform/manifest
# 长达一个小时+的下载过程
repo sync
# 切换分支到
repo start android-8.1.0_r64 --all
第二步:编译源码
到这里,如果image镜像是在模拟器运行就可以开始编译了,否则还需按官网说明下载驱动。
# 清空输出目录
cd /Volumes/android/aosp
make clobber
# 生成编译脚本
. build/envsetup.sh
# 选择构建目标
lunch
aosp_x86_64-eng
# aosp:Android Open Source Project,可供进行编译使用;
# _x84_64: Binder支持64位;
# -eng:拥有各种调试工具的开发版设置,拥有root跟debug权限
# 编译;make jN,一般N为当前CPU核心数的1~2倍,这个过程应该需要一点时间 :)
make -j4
# 经过漫长莫约3h+后,我这边已经build好了,由于没有原生真机只能模拟器运行了
# 关闭命令行后,可以先跑下面两个命令:
# . build/envsetup.sh
# lunch
emulator
附
导入源码到AS调试Java层代码
由于导入源码占内存较大,可先在 /应用程序/Android Studio/Contents/bin/studio.vmoptions
中配置内存参数:-Xmx2048m
# 初始化命令工具
. build/envsetup.sh
#编译 idegen 模块,生成idegen.jar
mmm development/tools/idegen/
# 生成针对 Android 开发工具的配置文件
./development/tools/idegen/idegen.sh
# 这样会在源码路径下生成以下三个熟悉的文件
# android.ipr:编译器配置、入口,相关的libraries等。也是导入源码的入口。
# android.iml:描述了modules和依赖关系等,有确认不需要导入的文件夹可在这里设置。
# android.iws:工作区的设置。
android.ipr
# 一段时间后,就能导入进来了,配置一下依赖跳转
# File -> Project Structure 打开 Module,然后选中 Dependencies:
# 保留 JDK 跟 Module Source 项,并添加源码的 external 和 frameworks 依赖
# 启动模拟器,就可以 Attach Debugger to Android process 调试了。
# 调试可以参考:http://weishu.me/2016/05/30/how-to-debug-android-framework/
使用gdbclient调试C层代码
gdb操作可参考:
# 通过 shell ps + grep 过滤进程
adb shell ps -A | grep calculator
# gdbclient <pid> 可以通过 gdbserver 调试对应的进程
gdbclient 2341
# r:run
# b <path/file>:<line>:breakpoint
# c:continue
# s:step
# p <variable>:print
(gdb) c
问题记录
- MacOS 编译Android源码提示找不到tools.jar
build/core/config.mk:663: 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.
解决:可以保证设备是有JDK的,查一下文件发现,还需要在 .bash_profile 中配置变量 export ANDROID_JAVA_HOME=$JAVA_HOME
,好了了以后需要刷新一下:. ~/.bash_profile
- 找不到对应的macOS.sdk:internal error: Could not find a supported mac sdk: [“10.10” “10.11” “10.12” “10.13”]
解决:
# 先查看XCode 中 mac sdk的版本,我的是 10.14
cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
ls
# 方式一、在源码目录 darwinSupportedSdkVersions 中添加(这个方式我试过,后续在我的设备还是编译不过去)
vim build/soong/cc/config/x86_darwin_host.go
darwinSupportedSdkVersions = []string{
"10.10",
"10.11",
"10.12",
"10.13",
"10.14",
}
# 方式二、在 https://github.com/phracker/MacOSX-SDKs/releases 下载 Command_Line_Tools_macOS_10.13_for_Xcode_9.4.1.dmg (这个以前是10.13的)安装即可。