归档 紫溪涧 关于
手机端编译安卓内核 返回首页

序号: /2021/01/15/008

机型代号:
红米 note 7 pro(代号:violet)
红米 note 9 pro(代号:gauguin)

近来电脑愈发派不上用场,
正好原用的 violet 退役,
想添加一个 cifs 支持方便挂载路由器硬盘,
用手上这台主力机 gauguin 编译内核。

gauguin 用 magisk 给 boot.img 打补丁并刷入,
获取根权限后使用 linuxdeploy 部署 Ubuntu。

交叉编译工具链

内核版本 4.14+ 需要 clang 编译,
选用 tc-build 工具链,
最新 clang+llvm+binutils。
地址:【点击访问】

或使用 llvm 官网预编译包(推荐),
地址:【点击访问】

编译 tc-build 项目

apt install bc \
            bison \
            ca-certificates \
            ccache \
            clang \
            wget \
            cmake \
            curl \
            file \
            flex \
            gcc \
            g++ \
            git \
            vim \
            zip \
            libelf-dev \
            libssl-dev \
            make \
            ninja-build \
            python3 \
            texinfo \
            u-boot-tools \
            xz-utils \
            zlib1g-dev -y
git clone --depth=1 https://github.com/ClangBuiltLinux/tc-build.git 

cmake项目地址:【点击访问】

1.下载 cmake 源码包
wget https://hub.fastgit.org/Kitware/CMake/releases/download/v3.20.0/cmake-3.20.0.tar.gz
2.解压、编译、安装
tar -xzvf cmake-3.20.0.tar.gz
cd cmake-3.20.0
mkdir build && cd build && cmake ..
make -j4 && make install

注:编译工具链耗时约 4-6 小时,需物理降温,
同时编译脚本可使用 -h 参数查看更多帮助信息。

cd tc-build

./build-llvm.py

./build-binutils -t aarch64-linux-gnu

可指定并行编译及链接线程,
降低手机发热,减少内存占用,同时增加编译时长。

./build-llvm.py -D \
LLVM_PARALLEL_COMPILE_JOBS=6 \
LLVM_PARALLEL_LINK_JOBS=4 \
--lto thin

编译工具链和内核时均可使用 ccache,
可加快二次编译速度。

安装ccache 
apt install ccache -y

启用及路径配置写入 .bashrc
# 启用ccache
export USE_CCACHE=1
# 改变ccache缓存路径
export CCACHE_DIR=~/.ccache

shell 指定 ccache 缓存大小
ccache -M 10G

重新连接会话或 source 资源使配置生效
. ~/.bashrc

编译内核

可选用官方或以下内核源码:
地址:【点击访问】

git clone --depth=1 https://github.com/Panchajanya1999/msm-4.14.git -b R violet

挂载路由器硬盘或电脑共享目录需要 cifs 支持,
编辑: vendor/violet-perf_deconfig:

cd violet

vim arch/arm64/configs/vendor/violet-perf_defconfig

修改以下项并保存
CONFIG_CIFS=y

通常开启 lto 会提升程序性能并减小体积,
但有时会导致无法开机。

vim arch/arm64/configs/vendor/violet-perf_defconfig

修改以下项并保存
CONFIG_LTO_NONE=y
# CONFIG_LTO is not set
# CONFIG_THIN_LTO is not set
# CONFIG_LTO_CLANG is not set
# CONFIG_CFI_CLANG is not set
# CONFIG_CFI is not set

内核有 vDSO 支持,需安装 32 位交叉编译工具链:

apt install gcc-arm-linux-gnueabi -y

建立脚本 run.sh 并执行编译。

vim run.sh

添加内容并保存
#!/bin/bash
starttime=`date +'%Y-%m-%d %H:%M:%S'`
export ARCH=arm64
export SUBARCH=arm64
TC_DIR="/root/tc-build"
MPATH="$TC_DIR/install/bin/:$PATH"
rm -f out/arch/arm64/boot/Image.gz-dtb
make O=out vendor/violet-perf_defconfig
PATH="$MPATH" make -j6 O=out \
    NM=llvm-nm \
    OBJCOPY=llvm-objcopy \
    LD=ld.lld \
        CROSS_COMPILE=aarch64-linux-gnu- \
        CROSS_COMPILE_ARM32=arm-linux-gnueabi- \
        CC=clang \
        AR=llvm-ar \
        OBJDUMP=llvm-objdump \
        STRIP=llvm-strip
        2>&1 | tee error.log
endtime=`date +'%Y-%m-%d %H:%M:%S'`
start_seconds=$(date --date=" $starttime" +%s);
end_seconds=$(date --date="$endtime" +%s);
echo Start: $starttime.
echo End: $endtime.
echo "Build Time: "$((end_seconds-start_seconds))"s."
cp out/arch/arm64/boot/Image.gz-dtb .
给脚本增加执行权限
chmod +x run.sh

执行编译
./run.sh

这样我们在本目录得到了内核文件 Image.gz-dtb。

打包内核

使用 anykernel3 项目对内核打包,
地址:【点击访问】

cd 
git clone https://github.com/osm0sis/AnyKernel3.git anykernel

参考文章:『论如何优雅的刷入内核』

cd ankernel

vim anykernel.sh

修改并保存
#包名
kernel.string=Violet-q-Kernel
#不检查机型
do.devicecheck=0
#刷入位置
block=/dev/block/bootdevice/by-name/boot;

ramdisk 内容用不到全部删除,
也可以找其他刷机包解压改一下再重新压缩。

将刚才编译的内核放入本目录,
并构建压缩脚本:

vim build.sh

添加内容并保存
#!/bin/sh

echo compressing...

zip -r kernel.zip \
anykernel.sh \
Image.gz-dtb \
LICENSE \
META-INF \
tools

echo done.
添加执行权限并执行压缩
chmod +x build.sh
./build.sh

这样就得到了内核包 kernel.zip,
使用 twrp 备份原 boot、dtbo 分区并刷入新内核,
注意刷入内核后选择清除 cache 并重启。

补充说明

Github 代理加速

有时克隆代码过慢,
可通过透明代理瞬间跑满带宽:

git config --global url."https://hub.fastgit.xyz".insteadOf https://github.com

或

git config --global url."https://github.com.cnpmjs.org".insteadOf https://github.com

配置文件为 ~/.gitconfig。

小米官方内核源码

小米官方内核开源库:『点击访问』

小米官方内核编译WIKI:『点击访问』

编译方法类似,不过总有一些问题需要修改。

常见问题参考:『点击访问』

使用手机刷机

首先使用电脑对手机进行解锁 bootloader。
注:解锁及跨版本线刷会清除全部数据。

使用 gauguin 对 violet 进行刷机:
准备一条双头 Type-c 数据线,
violet 按上音量+关机键进入 fastboot 模式,
gauguin 本机 Ubuntu 安装工具:

apt install android-tools-adb android-tools-fastboot -y

将 violet 线刷包放入 gauguin 容器内并解压,
修改刷机脚本删除第一行的验证内容并开始刷入:

vim flash_all_except_data_storage.sh

fastboot $* getvar product 2>&1 | grep "^product: *violet$"
修改为
fastboot $* getvar product 2>&1 

执行线刷
./flash_all_except_data_storage.sh

刷完重启会自动进入官方 rec,
选择清除全部数据并重启进入系统。
激活设备并设置锁屏密码方可正常解密 data。

注:Termux、Magisk 也可安装 adb、fastboot 工具。

Twrp

刷入 Twrp 步骤跟线刷类似,
准备 Twrp 镜像 twrp.img 及 misc.bin,
gauguin 执行命令刷入后,
violet 进入 Twrp 解密 data,
然后进行刷入 magisk 等操作。

fastboot flash recovery twrp.img

fastboot flash misc misc.bin

fastboot reboot

无 Twrp 获取 root

提取当前版本卡刷包 boot.img,
使用 magisk app 给 boot.img 打补丁,
并进入 fastboot 模式刷入:

fastboot flash boot magisk_patched.img
fastboot reboot

开机进入 magisk 即可获得 root。

END


本作品采用“CC BY-SA 4.0”进行许可。


如果你觉得本文对你有帮助,请我喝杯咖啡吧。