背景
下载Android10的内核源码编译并刷入Pixel3中,为后面的过反调试做准备。
环境
mv Ubuntu 18.04
已经成功编译的AOSP 10_r41环境,编译内核需要源码交叉编译环境。
Pixel3
下载内核代码
Ubuntu中找个非中文路径的位置
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是用来下载代码的,如果你已经安装了就进入下一步。
## 创建一个目录
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的环境变量。
进入我们的源码目录
## 载入编译源码环境
source build/envsetup.sh
## 3就是Pixel3的产品线,blueline_user_debug版本。
lunch 3
载入环境之后,进入内核源码目录,开始编译。编译内核需要libssl-dev
库,如果你没有安装,需要安装这个库。
sudo apt-get install libssl-dev
可以通过命令查询是否已经安装了。
## 进入内核源码目录
./build/build.sh
编译大概需要十分钟这样,具体看电脑配置。
到这里内核编译完成了。
刷入手机Pixel3中
前提:
已经编译AOSP完成,且刷入手机是没问题的,正常屏幕触摸,WiFi,蓝牙连接正常,相机麦克风可用。
查看当前系统的内核:
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
设置新的内核环境变量
先把编译好的系统刷入手机中。
源码目录下执行:
## 重启手机到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
目录下执行:
## 内核位置指向我们自己编译的位置,当前窗口有效
export TARGET_PREBUILT_KERNEL=/home/aosp/aosp/k/out/android-msm-pixel-4.9/dist/Image.lz4
如果想恢复默认内核位置,执行:
export TARGET_PREBUILT_KERNEL=""
开始构建新的内核boot.img
## 源码根目录执行
make bootimage
刷入新内核
构建成功之后,刷入ko
文件,再刷入新的boot.img
adb root
## 关闭验证
adb disable-verity
## 重启手机
adb reboot
## 重启机器成功之后:
adb root
adb remount -R
## 这里按照这个流程跑
进入内核目录
我的位置是/home/aosp/k
执行:
adb push /out/android-msm-pixel-4.9/dist/*.ko /vendor/lib/modules
接着进入bl模式
adb reboot bootloader
进入AOSP编译的产物目录
android-10.0.0_r41\out\target\product\blueline
## 执行,临时用新内核启动系统
fastboot boot boot.img
## 执行完成后会重启。手机启动之后可以查看内核版本了。
## 继续
adb reboot bootloader
## 烧入新内核
fastboot flash boot boot.img
查看内核信息:
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
在内核目录下产物目录下执行
## 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的顺序。