背景

下载Android10的内核源码编译并刷入Pixel3中,为后面的过反调试做准备。

环境

mv Ubuntu 18.04

已经成功编译的AOSP 10_r41环境,编译内核需要源码交叉编译环境。

Pixel3

下载内核代码

Ubuntu中找个非中文路径的位置

1
2
3
4
5
6
mkdir ~/bin
echo "PATH=~/bin:\$PATH" >> ~/.bashrc
source ~/.bashrc
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 或者使用 curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod a+x ~/bin/repo

repo是用来下载代码的,如果你已经安装了就进入下一步。

1
2
3
4
5
6
7
8
9
10
## 创建一个目录
mkdir k
## 例如我的目录是
/home/aosp/k
cd k
repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-crosshatch-4.9-android10-qpr1 --depth=1
## 看到这样的信息就表示OK
## repo has been initialized in /home/aosp/k
## 同步代码-j8是下载线程,建议4
repo sync -c --no-tags -j4

这里有个很严重的坑

不要使用Mac下载源码复制到Ubuntu中!

不要使用Mac下载源码复制到Ubuntu中!

不要使用Mac下载源码复制到Ubuntu中!

由于大小写不敏感,下载文件比如a.h和A.h只有其中一份,编译内核的时候会导致文件丢失missing xxx。等等。

这里访问的是android.googlesource.com的地址,需要留学上网才能下载代码。自己想办法。

图片描述

同步代码速度慢估计一个小时就OK,目录结构大概是这样:

图片描述

编译内核

编译内核我们需要编译AOSP的环境变量。

进入我们的源码目录

1
2
3
4
## 载入编译源码环境
source build/envsetup.sh
## 3就是Pixel3的产品线,blueline_user_debug版本。
lunch 3

图片描述

载入环境之后,进入内核源码目录,开始编译。编译内核需要libssl-dev库,如果你没有安装,需要安装这个库。

1
sudo apt-get install libssl-dev

图片描述

可以通过命令查询是否已经安装了。

1
2
## 进入内核源码目录
./build/build.sh

编译大概需要十分钟这样,具体看电脑配置。

图片描述

到这里内核编译完成了。

刷入手机Pixel3中

前提:

已经编译AOSP完成,且刷入手机是没问题的,正常屏幕触摸,WiFi,蓝牙连接正常,相机麦克风可用。

查看当前系统的内核:

1
2
3
adb shell cat /proc/version
Linux version 4.9.210-gdee0d123b122-ab6570413 (android-build@abfarm-east4-083) (Android (5484270 based on r353983c) clang version 9.0.3 (https://android.googlesource.com/toolchain/clang 745b335211bb9eadfa6aa6301f84715cee4b37c5) (https://android.googlesource.com/toolchain/llvm 60cf23e54e46c807513f7a36d0a7b777920b5881) (based on LLVM 9.0.3svn)) #0 SMP PREEMPT Tue Jun 9 02:10:51 UTC 2020
## 版本和分支信息4.9.210-gdee0d123b122

设置新的内核环境变量

先把编译好的系统刷入手机中。

源码目录下执行:

1
2
3
4
## 重启手机到bl模式
adb reboot bootloader
fastboot flashall -w
## 开始刷机

图片描述

AOSP源码本身是附带了内核产物的,默认情况下编译boot.img会使用AOSP源码目录中的内核产物。位置在:

/home/aosp/aosp/android-10.0.0_r41/device/google/crosshatch-kernel/

也就是源码根目录下的:device/google/crosshatch-kernel/

图片描述

我们重新构建boot.img的时候需要重定向到新编译成功的目录

/home/aosp/aosp/android-10.0.0_r41目录下执行:

1
2
## 内核位置指向我们自己编译的位置,当前窗口有效
export TARGET_PREBUILT_KERNEL=/home/aosp/aosp/k/out/android-msm-pixel-4.9/dist/Image.lz4

如果想恢复默认内核位置,执行:

1
export TARGET_PREBUILT_KERNEL=""

开始构建新的内核boot.img

1
2
## 源码根目录执行
make bootimage

图片描述

刷入新内核

构建成功之后,刷入ko文件,再刷入新的boot.img

1
2
3
4
5
6
7
8
9
adb root 
## 关闭验证
adb disable-verity
## 重启手机
adb reboot
## 重启机器成功之后:
adb root
adb remount -R
## 这里按照这个流程跑

进入内核目录

我的位置是/home/aosp/k执行:

1
adb push /out/android-msm-pixel-4.9/dist/*.ko /vendor/lib/modules

图片描述

接着进入bl模式

1
adb reboot bootloader

进入AOSP编译的产物目录

1
2
3
4
5
6
7
8
android-10.0.0_r41\out\target\product\blueline
## 执行,临时用新内核启动系统
fastboot boot boot.img
## 执行完成后会重启。手机启动之后可以查看内核版本了。
## 继续
adb reboot bootloader
## 烧入新内核
fastboot flash boot boot.img

图片描述

查看内核信息:

1
2
adb shell cat /proc/version
Linux version 4.9.185-g9f181f6d (build-user@build-host) (Android (5484270 based on r353983c) clang version 9.0.3 (https://android.googlesource.com/toolchain/clang 745b335211bb9eadfa6aa6301f84715cee4b37c5) (https://android.googlesource.com/toolchain/llvm 60cf23e54e46c807513f7a36d0a7b777920b5881) (based on LLVM 9.0.3svn)) #1 SMP PREEMPT Mon Nov 11 18:47:17 UTC 2019

在内核目录下产物目录下执行

1
2
## k/out/android-msm-pixel-4.9/dist
grep -a 'Linux version' Image.lz4-dtb

图片描述

这里的内核信息和我们手机上面的一致。

到此编译和烧录到手机完结。

视频讲解版本:哔站,讲解内核编译遇到问题

整体流程版本:哔站内核编译整体流程

总结

1:不要使用Mac下载内核源码。

2:下载内核的地址是google地址,需要留学上网。

3:需要AOSP编译的环境。

4:编译内核后需要注意刷入ko和boot.img的顺序。

欢迎关注公众号:黄大官AOSP