编译安卓内核:以坚果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)

相关推荐
z2023050817 小时前
RDMA之路由算法介绍 (6)
linux·服务器·网络·人工智能·ai
楼兰公子17 小时前
# RK3588 Linux 驱动开发完整学习指南RK3588_Linux_Driver_Development.md
linux·驱动开发
光电笑映17 小时前
Linux 文件 IO:从概念到系统调用
linux·运维·服务器
历程里程碑17 小时前
53 多路转接select
linux·开发语言·数据结构·数据库·c++·sql·排序算法
WYH28717 小时前
一、驱动基础
linux·嵌入式硬件
痕忆丶17 小时前
openharmony开发之磁盘相关
linux
z2023050817 小时前
RDMA 之RoCEv2 的报文格式(5)
linux·服务器·网络·人工智能
uesowys17 小时前
CentOS Linux安装部署Hermes Agent智能体
linux·centos·hermes agent
毋语天17 小时前
Linux 命令——文件、进程、网络与 Vim 编辑器
linux·网络·编辑器
William.csj17 小时前
Linux——查看cuda版本的全面方法
linux·运维·服务器