构建这个镜像的唯一目的就是我想在手机上实验 Linux namespaces 特性,目前大多数安卓 ROM 内置的内核要么完全不支持这个特性,要么只能支持 Network Namespace
构建的过程看上去是比较简单的,实际上坑却不少(只是我自己的过程总结,如有不对之处请大佬轻拍😜)
准备一台安卓手机——除非你准备在模拟器里玩。对于手机厂商的要求就是,至少得开放刷机权限,以及公开内核代码。
准备刷机模板——直接用https://github.com/osm0sis/AnyKernel2
,然后 clone 到 out 目录,根据模板的 README 修改刷机脚本。
准备构建环境,操作系统 Linux 或者 Macos 均可,我个人建议使用最好的 Linux 发行版—— Windows ,然后根据发行版的不同,下载合适的构建工具(一般如果不是有什么特殊版本要求(这里假设目标环境是 arm64 ,其他的也是同理)的话, linux 和 windows ( WSL )都可以选择下载 https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9 )。
下载内核源代码——不作死的话就用厂商自带的,然后检出目标分支到 kernel 目录
进入 kernel 目录并设置环境变量,比如ARCH=arm64
和 PATH
生成默认配置:在 arch 里根据手机型号找到合适 defconfig 文件的文件名——比如 1+3T 就是arch/arm64/configs/msm-perf_defconfig
和arch/arm64/configs/msm-oqc_defconfig
,然后我选择了msm-oqc_defconfig
作为测试,那么接下来就在代码根目录输入make msm-oqc_defconfig
魔改配置,直接make menuconfig
,然后根据需要进行修改
启动构建make -j
(不作死的话就加个数字)
等待构建完毕,导出内核模块——
find -name *ko -exec cp "{}" ../out/modules \;
;
同样也要复制内核镜像文件——
cp arch/arm64/boot/Image.gz-dtb ../out
打包
cd ../out && zip -r ../flash.zip *
刷机,进入 TWRP ,开启 sideload 模式,然后
adb sideload flash.zip
重启,测试各个功能,注意要测试 dmesg 里又没有可疑的输出
遇到的坑有:
黑屏——原因有很多,大多数都是构建内核的参数问题——比如弄错了基础配置模板,弄错了 ABI 一类的,仔细看厂商仓库的文件修改时间,应该能找到正确的配置模板的
WiFi 不工作 /数据网络无效 /指纹识别无效 /拍照无效 /触控无效——多半是模块没弄上去。。。
即使已经把所有的模块都带上了,还是有设备无法工作——我在搞 1+3T 的时候就遇到过 WiFi 始终无法工作的问题,解决方法就是研究厂商的刷机包,看看 system/lib/modules 里面有没有没有涵盖到的模块——比如我那个就是缺少一个 qca-cld 的驱动,解决方法就是
make KERNEL_SRC=~/data/kernel -j
各种编译错误:多数是符号定义的问题,由于构建系统的复杂性,搞清楚整个构建系统对我来说,还不如直接批量修改源代码,比如把一部分#include<>
改成#include""
,或者在#include""
里加上相对路径,或者修改某些宏定义一类的。诚然,修改 Makefile 应该是更好的选择,奈何复杂度太高。
FAQ:
为啥使用AnyKernel这种方式构造刷机包?
两个字:简单
不用去纠结 boot.img 中到底应该设置多少偏移量一类的操蛋问题
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.