编译安卓内核:以坚果R1、魔趣MK100(Android 10)系统为例

环境与基本概念

在交叉编译中,目标机器是只最终运行编译后的二进制文件的机器,宿主机器是指执行编译过程的机器。例如,我在电脑上编译一个安卓内核,编译好了刷到手机上,那么这个电脑就是宿主机器,这个手机就是目标机器。或者,更常见的例子,电脑上编译一个app,手机上运行,电脑就是宿主机器,手机就是目标机器。

在本例中,目标机器和宿主机器如下。

目标机器:坚果R1 魔趣MK100 (Android 10) 系统

宿主机器:Linux Mint 22.3 - Cinnamon 64-bit (基于 Ubuntu 24.04 LTS)

编译安卓源码,用linux系统比较方便,windows的wsl2容易出各种毛病,所以我这里用的是 Mint系统,在Mint系统上编译出内核,先通过AIK打包,再通过fastboot刻录到目标机器坚果R1。

以下操作均在宿主机进行。

创建工作目录:

执行如下命令。

bash 复制代码
mkdir build_r1_mokee_kernel
cd build_r1_mokee_kernel
clone内核源码到宿主机本地:

执行如下命令。

bash 复制代码
git clone https://github.com/MoKee/android_kernel_smartisan_sdm845.git --depth 1 --branch mkq-mr1

这里的分支对应于系统的版本,例如mkq-mr1就对应于新MK100, 所以这里我选择的分支是mkq-mr1

安装编译所需环境:

执行如下命令

bash 复制代码
wget http://security.ubuntu.com/ubuntu/pool/universe/p/python2.7/python2.7_2.7.18-13ubuntu1.5_amd64.deb http://security.ubuntu.com/ubuntu/pool/universe/p/python2.7/libpython2.7-stdlib_2.7.18-13ubuntu1.5_amd64.deb http://security.ubuntu.com/ubuntu/pool/universe/p/python2.7/python2.7-minimal_2.7.18-13ubuntu1.5_amd64.deb http://security.ubuntu.com/ubuntu/pool/universe/p/python2.7/libpython2.7-minimal_2.7.18-13ubuntu1.5_amd64.deb  
sudo apt install ./libpython2.7-minimal_2.7.18-13ubuntu1.5_amd64.deb ./libpython2.7-stdlib_2.7.18-13ubuntu1.5_amd64.deb ./python2.7-minimal_2.7.18-13ubuntu1.5_amd64.deb ./python2.7_2.7.18-13ubuntu1.5_amd64.deb
bash 复制代码
sudo ln -sf /usr/bin/python2.7 /usr/bin/python
bash 复制代码
sudo apt install -y gcc-9 g++-9 gcc-9-aarch64-linux-gnu

由于目标机系统比较老,所以必须用python2。编译完可以删除掉软链接或者把软链接重新指向python3。

尝试用clang不是很兼容,所以改用gcc9,安装gcc9时如果提示找不到包,可以像python2那样手动下载安装。

编译老代码的话,就不求用最新的工具链,只求最匹配的最稳的。

生成配置:

先进入内核源码根目录。

bash 复制代码
cd android_kernel_smartisan_sdm845
rm -rf out

然后执行如下命令。

bash 复制代码
make O=out ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- mokee_trident_defconfig

其中,输出都放到out里是为了不污染源码

arm64是目标架构

aarch64-linux-gnu- 是交叉编译前缀

mokee_trident_defconfig 是配置文件

编译:

执行如下命令。

bash 复制代码
make O=out ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KCFLAGS="-fcommon -w" HOSTCFLAGS="-fcommon -w" -j$(nproc)

编译成功后,生成的内核文件位于:out/arch/arm64/boot/Image.gz-dtb

打包成boot.img

先返回上一级目录。

bash 复制代码
cd ..

然后下载 AIK。

AIK项目地址:https://github.com/osm0sis/Android-Image-Kitchen

执行如下命令下载、解压AIK工具。

bash 复制代码
wget -O AIK-Linux-v3.8-ALL.tar.gz https://xdaforums.com/attachments/aik-linux-v3-8-all-tar-gz.5300923/
tar zxvf AIK-Linux-v3.8-ALL.tar.gz

然后下载ROM提取boot.img。

https://sourceforge.net/projects/mokee/files/RELEASE/trident/MK100.0-trident-221019-RELEASE.zip/download 下载 坚果R1魔趣MK100.0的最新稳定版ROM:MK100.0-trident-221019-RELEASE.zip。下载完成后,从压缩包中复制出 boot.img 到 AIK-Linux目录下。

然后执行如下命令,解包boot.img

bash 复制代码
cd AIK-Linux
./unpackimg.sh

解包完成后,AIK-Linux下会多两个文件夹ramdisk和split_img。

把 Image.gz-dtb 复制到 split_img下替换 boot.img-kernel

bash 复制代码
rm split_img/boot.img-kernel
cp ../android_kernel_smartisan_sdm845/out/arch/arm64/boot/Image.gz-dtb  split_img/boot.img-kernel

然后重新打包

bash 复制代码
./repackimg.sh

打包完会生成image-new.img,这个文件就是拥有我们编译过的新内核的 boot.img

刻录进手机

先安装fastboot、adb

bash 复制代码
sudo apt install android-tools-fastboot android-tools-adb

手机进入fastboot模式(可以关机后长按 音量+ 音量- 电源键,也可以通过adb或recovery进入),然后通过数据线连接宿主机。

宿主机执行如下命令把image-new.img刷入手机boot分区

bash 复制代码
sudo fastboot flash boot image-new.img

相关链接:坚果手机 R1 魔趣刷入教程 (MK100)

相关推荐
玉梅小洋2 小时前
Linux命令详解 —— IP 命令及永久配置
linux·运维·tcp/ip
江畔何人初2 小时前
k8s中Role与networkpolicy区别
linux·运维·云原生
、BeYourself2 小时前
应用专属文件与应用偏好设置(SharedPreferences)
android
2501_948120152 小时前
基于模糊数学的风险评估模型
android
MengFly_2 小时前
Compose 脚手架 Scaffold 完全指南
android·java·数据库
Madison-No72 小时前
【Linux】一切皆文件的理解 && 缓冲区 && 简易设计libc库
linux·运维·服务器
快来吃饭�2 小时前
Ubuntu-20.04 gem5 构建并实现一个简单的配置脚本
linux·ubuntu·系统架构
daemon.qiang3 小时前
mplayer使能支持vaapi
linux·centos
70asunflower3 小时前
Docker exec 命令完全解析
linux·ubuntu·docker