1. 编译aosp源代码
1.1 首先是要完整编译一次源代码的,这样方便使用编译好的gcc等编译工具,也方便内核源代码编译后的产物的验证
- 1.导入环境变量:
source build/envsetup.sh
- 2.选择编译目标:
lunch aosp_sailfish-userdebug
- 3.开始执行编译:
make
- 4.编译成功后来到产物目录下:
cd out/target/product/sailfish
- 5.设置ANDROID_PRODUCT_OUT环境变量:
export ANDROID_PRODUCT_OUT=/home/ubuntu20/aosp_10.0.0_r17/out/target/product/sailfish
- 6.pixel手机连接电脑,然后重启到bootloader模式:
adb reboot-bootloader
- 7.开始刷机:
fastboot flashall -w
- 8.刷完自动重启,整个编译和刷机流程大致是这样
1.2 要知道编译aosp源代码是不包括编译内核源代码的,内核镜像是已经编译好内置到特定目录下的,不同produce产品所在目录可能不同。
- 1.aosp_10.0.0_r17分支代码对应pixel手机使用的内核在此目录下:
/home/ubuntu20/aosp_10.0.0_r17/device/google/marlin-kernel/Image.lz4-dtb
- 2.编译aosp源代码的时候,并不会重新编译内核了,只是打包的时候将其之前编译好的内核一起打包进去。
- 3.可以使用以下命令查看手机内核版本信息:
adb shell "cat /proc/version"
输出:Linux version 3.18.137-g72a7a64494e (android-build@wphn3.hot.corp.google.com) (gcc version 4.9.x 20150123 (prerelease) (GCC) ) #1 SMP PREEMPT Fri Sep 27 18:40:34 UTC 2019
- 内核编译时间:Fri Sep 27 18:40:34 UTC 2019,很明显是2019年已经编译好的内核文件,我们是2024年才刷机呢
- 内核版本是:3.18.137,g72a7a64494e表示git提交点是72a7a64494e
- 编译内核gcc版本:gcc version 4.9.x 20150123 (prerelease) (GCC)
2. msm内核下载与编译
2.1 msm内核下载
- 1.pixel手机使用高通芯片,对应内核是msm分支的。具体查看地址:
https://android.googlesource.com/kernel/
,解释是这样说的:msm -> Kernel tree for Qualcomm chipsets
- 2.下载msm内核代码:
git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git
#把android.googlesource.com改为aosp.tuna.tsinghua.edu.cn解决墙的问题 - 3.检出对应的分支提交点72a7a64494e的代码:
git checkout 72a7a64494e
2.2 msm内核下编译
- 1.设置gcc编译环境
export PATH=$PATH:/home/ubuntu20/aosp_10.0.0_r17/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin
export PATH=$PATH:/home/ubuntu20/aosp_10.0.0_r17/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin
export ARCH="arm64"
export CROSS_COMPILE="aarch64-linux-android-"
export CROSS_COMPILE_ARM32="arm-linux-androideabi-"
- 2.执行make编译
执行配置:
make marlin_defconfig
#从https://source.android.com/source/building-kernels.html 查看pixel对应marlin_defconfig,通用的是make menuconfig(这个好像是编译Linux内核才有用,编译aosp内核无效)
执行编译:make
编译产物:/home/ubuntu20/aosp_kernel/msm/arch/arm64/boot/Image.lz4-dtb
- 3.编译问题处理
编译过程有个出错:drivers/thermal/thermal_core.c找不到# include <..base/base.h>
解决方法:将# include <..base/base.h>改为# include "..base/base.h"即可
3. 验证内核编译产物
3.1 临时验证内核(重启失效,这种方法可以防止刷成砖头)
- 进入bootloader模式:
adb reboot bootloader
- 刷入内核镜像:
fastboot boot /home/ubuntu20/aosp_kernel/msm/arch/arm64/boot/Image.lz4-dtb
3.2 刷机验证内核(建议先使用临时验证方法,验证正常再刷机)
- 配置kernel环境变量:
export TARGET_PREBUILT_KERNEL=/home/ubuntu20/aosp_kernel/msm/arch/arm64/boot/Image.lz4-dtb
- 编译bootimage镜像:
make bootimage
#build/make/core/main.mk里面有bootimage编译目标,还有其他编译目录可以自行查看 - 进入bootloader模式:
adb reboot-bootloader
- 刷入boot.img镜像:
fastboot flash boot boot.img
- 手机重启即完成刷机验证流程,再使用以下命令查看手机内核版本信息,发现内核编译信息变为现在的了:
adb shell "cat /proc/version"