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

相关推荐
阿拉斯攀登6 分钟前
第 13 篇 输入设备驱动(触摸屏 / 按键)开发详解,Linux input 子系统全解析
android·linux·运维·驱动开发·rk3568·瑞芯微·rk安卓驱动
bukeyiwanshui35 分钟前
【无标题】
linux·运维·服务器
疯狂吧小飞牛36 分钟前
Linux 多网卡同网段配置冲突问题
linux·运维·服务器
学习3人组36 分钟前
Workerman实现 WSS 基于客户端 ID 的精准推送
android·java·开发语言
阿拉斯攀登1 小时前
第 11 篇 RK 平台安卓驱动实战 4:I2C 设备驱动开发,以 OLED 屏为例
android·驱动开发·i2c·瑞芯微·嵌入式驱动·rk3576·嵌入式安卓
-ONLY-¥1 小时前
Nginx性能优化与监控全攻略
linux
wang2455981991 小时前
Redis基础——1、Linux下安装Redis(超详细)
linux·数据库·redis
段娇娇1 小时前
Android jetpack LiveData (二) 原理篇
android·android jetpack
Bruce_kaizy1 小时前
c++ linux环境编程——linux信号(signal)
linux·c++·操作系统·环境编程
我命由我123452 小时前
Android 多进程开发 - FileDescriptor、Uri、AIDL 接口定义不能抛出异常
android·java·java-ee·kotlin·android studio·android-studio·android runtime