目录
linux kernel已经编译过很多次了,在macOS上有一些坑要踩,再整理一下,就有了这篇水文。
环境准备
由于macOS的磁盘文件系统默认不区分大小写,因此编译源码最好在ubuntu上进行,或者在macOS上创建一块case-sensitive的磁盘+docker编译。本文主要记录一下方法二。
磁盘创建方式:磁盘工具->分区->创建加密的大小写敏感的磁盘->输入密码->完成。 创建成功后,新磁盘和原来的磁盘共享剩余的空间,路径为/Volumes/APFS-case-sensitive,可以把源码放到这里。
之后创建一个ubuntu docker并映射一下文件,编译环境就搞定了。
开始编译
编译参考官方文档:https://source.android.com/setup/build/building-kernels
1. 下载kernel
选择需要clone的版本。通常选择msm或者goldfish。具体手机型号和kenrel版本对应关系参考官方文档,选择kernel一小节。
msm 项目包含适用于 ADP1、ADP2、Nexus One、Nexus 4、Nexus 5、Nexus 6、Nexus 5X、Nexus 6P、Nexus 7 (2013)、Pixel 和 Pixel XL 的源代码,可用作在 Qualcomm MSM 芯片组上开展相关工作的着手点。
goldfish 项目包含适用于所模拟的平台的内核源代码。
下载地址:https://android.googlesource.com/kernel
下载时可以使用tsinghua镜像源,https://android.googlesource.com/ 全部使用 https://aosp.tuna.tsinghua.edu.cn/ 代替即可。
#下载源代码
git clone https://aosp.tuna.tsinghua.edu.cn/kernel/goldfish/
# 切换分支
git checkout remotes/origin/android-goldfish-4.4-dev
由于替换kernel会导致系统不稳定,因此切换branch的kernel version和原来的version最好一致。原始kernel:
2. 下载交叉编译工具链
下载地址:https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.9
export PATH=<dir>/x86_64-linux-android-4.9/bin/:$PATH
# 可选
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/
export PATH=<dir>/aarch64-linux-android-4.9/bin/:$PATH
3. 开始编译
编译时交叉工具链、arch、make config配置的选择很重要。推荐参考虚拟机中的kernel文件再进行配置。
android studio中创建avd后,img保存的路径在<SDK>/system-images/android-28/google_apis/x86中。这里很神奇的是,pixel2虚拟机的CPU在AVD manager中是x86的,但是img路径中kernel却是kernel-ranchu-64。因此,编译kernel时的ARCH需要选择x86_64。
make时的config配置在kernel源码的arch/x86/configs中,这里选择x86_64_ranchu_defconfig。和x86_64_defconfig的区别暂未深究。
交叉编译工具链选择export CROSS_COMPILE=,选择另一个会报错。
编译时可能会缺少部分文件,google一下安装即可。
# 用android vitrual machine 默认创建的android arch都是x86的,据说x86比x86_64要快,未验证
#export ARCH=x86
export ARCH=x86_64
export CROSS_COMPILE=x86_64-linux-android-
# export CROSS_COMPILE=aarch64-linux-android-
make x86_64_ranchu_defconfig
# 根据cpu number选择,一般是一倍到两倍之间
make -j10
4. 编译完成
5. 运行
使用sdk的tools中的emulator模拟器来启动android virtual machine,替换kernel为编译好的kernel。
如果出现PANIC: Missing emulator engine program for 'x86' CPU.错误,请用sdk/emulator下的emulator来启动。
$ ./emulator -list-avds
Nexus_5X_API_19_-_change_system.img_dex2oat
Pixel_2_API_25
Pixel_2_API_27
Pixel_2_API_28
$ ./emulator -avd Pixel_2_API_28 -kernel <PATH>/goldfish/arch/x86/boot/bzImage
替换kernel后:
如果遇到最后输出clocksource: Switched to clocksource tsc就停了的状态,可能是由于arch不对导致的。
PS:折腾了半天,各种google,最后发现goldfish目录下写好了build配置. 0.0