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"