为 Mi10 编译内核
INFO
| property | value |
|---|---|
| Device name | Mi10 |
| Code name | umi |
| Kernel version: | 4.19 |
编译环境
1 | $ neofetch |
Install dependencies
Packages
Install via pacman
1 | sudo pacman -S llvm bc bison base-devel ccache curl flex gcc-multilib git git-lfs gnupg gperf imagemagick lib32-readline lib32-zlib elfutils lz4 sdl openssl libxml2 lzop pngcrush rsync schedtool squashfs-tools libxslt zip zlib lib32-ncurses wxgtk3 ncurses |
Toolchains
Compulsory toolchains(Clang)
LineageOS/clang r416183b
1
git clone https://github.com/LineageOS/android_prebuilts_clang_kernel_linux-x86_clang-r416183b --depth=1 /path/to/your/toolchains/clang-12-lineage
Zyc-clang-12/17/18
Download inhttps://github.com/ZyCromerZ/Clang/releases
Example:
1 | cd /path/to/your/toolchains/ |
GCC-aarch64 LineageOS/android_prebuilts_gcc_linux-x86_aarch64_aarch64-linux-android-4.9
1
git clone https://github.com/LineageOS/android_prebuilts_gcc_linux-x86_aarch64_aarch64-linux-android-4.9 --depth=1 /path/to/your/toolchains/gcc
GCC-arm32 LineageOS/android_prebuilts_gcc_linux-x86_arm_arm-linux-androideabi-4.9
1
git clone https://github.com/LineageOS/android_prebuilts_gcc_linux-x86_arm_arm-linux-androideabi-4.9 --depth=1 /path/to/your/toolchains/gcc32
Suitable defconfig
一般内核源码里面的defconfig并不靠谱(甚至代码本身都不靠谱,即使是第三方维护的)。提取当前ROM的defconfig能更容易编译成功。
在内核编译时,会自动生成完整的defconfig并打包到内核中,这为我们编译提供了方便。
一般自动生成的defconfig会带有类似如下的header:
1 | # |
提取方法
在一台可以在shell中提权到Root的设备上,进入shell,执行一下命令
1 | # Elevate yourself to root, you may do this either by |
接下来,将提取的defconfig转移到PC上备用。
Prepare kernel repo
Choose
选择内核的思路基于以下优先级
- 同 ROM 的第三方维护内核
- 其他类原生维护的内核(如果你也是类原生)
- 官方的内核(别抱太大希望)
内核仓库命名方式一般为<android/platform>_kernel_<vendor>_<cpu/code name>
Clone repo
本文选择 tequilaOS 维护的platform_kernel_xiaomi_sm8250,并且使用较为稳定的taco(对于本仓库而言)分支
由于我们不需要历史记录,因此选择shallow clone:
1 | cd /path/to/your/repos |
Prepare to compile
Apply defconfig
将前面提取的defconfig移动到<repo-root>/arch/arm64/configs/下。
Build script
以下是我自己编写的 build script, 你需要修改里面的变量才能使用。
1 |
|
写入完记得加权:
1 | chmod +x build.sh |
Compile
1 | ./build.sh |
完整的一次编译大概耗时 3min
如果报错,你可以尝试其他版本的工具链和其他地方获取到的defconfig。
或者你需要手动修改内核代码,但是如果修改地方过多,你应该考虑使用其他工具链和其他defconfig。
对于本次使用的仓库,以下文件需要修改:
1 | diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c |
为内核添加你的签名
默认情况下,你使用的工具链,提交哈希,编译参数,whoami,hostname都会被记录在内核信息中。如果你还希望记录其他信息,你可以编辑defconfig。
CONFIG_DEFAULT_HOSTNAME用于记录默认hostname。CONFIG_LOCALVERSION用于记录额外的版本信息,比如CONFIG_LOCALVERSION="-caiyi@cai1hsu.me"或者CONFIG_LOCALVERSION=-RELEASE。但是一定不能包含空格,否则可能会导致解析错误。
检查 build artifacts
进入 <repo-root>/out/arch/arm64/boot 下,检查所有的文件。
如果编译成功,你应该至少会看见Image,除此之外,你可能还会有Image.gz, Image.gz-dtb, dbto.img。
Image是未压缩的内核文件,如果你只有这个文件,说明你的设备不压缩内核,使用这个文件即可。
如果存在Image.gz-dtb则使用Image.gz-dtb。没有的话,如果有Image.gz则使用Image.gz。
Flash
使用 Anykernel3 或者 magiskboot 手动修补,具体步骤请查看其他文章。
- 标题: 为 Mi10 编译内核
- 作者: Caiyi Shyu
- 创建于 : 2023-11-21 08:48:59
- 更新于 : 2024-09-30 18:43:49
- 链接: https://blog.caiyi1.me/2023/11/21/build-kernel/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。