环境与基本概念
在交叉编译中,目标机器是只最终运行编译后的二进制文件的机器,宿主机器是指执行编译过程的机器。例如,我在电脑上编译一个安卓内核,编译好了刷到手机上,那么这个电脑就是宿主机器,这个手机就是目标机器。或者,更常见的例子,电脑上编译一个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