构建这个镜像的唯一目的就是我想在手机上实验 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 中到底应该设置多少偏移量一类的操蛋问题
1
abmin521 2017-04-16 21:32:55 +08:00
不错 mark
|
2
xdream86 2017-04-16 22:57:57 +08:00 1
让我想起了装黑苹果的日子
|
4
shijingshijing 2017-04-17 01:16:02 +08:00
@codehz 我比较好奇的是,各个驱动是怎么搞定的,目测是 defconfig 文件这个?不然的话,摄像头,蓝牙,指纹什么的都没办法用吧。
|
5
nieyujiang 2017-04-17 08:06:48 +08:00
手动 mark
|
6
majinjing3 2017-04-17 08:24:30 +08:00 via Android
姿辞
|
7
codehz OP @shijingshijing 一加的大部分驱动都是直接在厂商给的内核代码里的,小部分需要自己编译,我运气比较好,一找就找到了,虽然我觉得 xda 上可能有相关帖子。。。
|
8
Panic 2017-04-17 17:30:58 +08:00
准备构建环境,操作系统 Linux 或者 Macos 均可,我个人建议使用最好的 Linux 发行版—— Windows ,然后根据发行版的不同,下载合适的构建工具(一般如果不是有什么特殊版本要求(这里假设目标环境是 arm64 ,其他的也是同理)的话, linux 和 windows ( WSL )都可以选择下载 https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9 )。
乱入的 windows 是什么鬼 |
10
zhujiahao 2018-11-04 00:53:24 +08:00
没有找到生成的 wlan.ko,所以我的手机一直不能使用 wifi
为什么加入了 qcacld2.0 后仍然不能生成 ko ? |
11
zhujiahao 2018-11-06 22:53:56 +08:00
有些开源比较残,需要慢慢弄
|
12
zhujiahao 2018-12-23 14:09:51 +08:00 1
在 defconfig 设置中,CONFIG_QCA_CLD_WLAN=m 才生成模块,我知道为啥没有生成 ko,是因为产生的 object 文件没有更新。。。
提供 win 下几个 debug 方法,供参考: adb devices adb logcat -v time -b all > f:/libradebug.log adb shell dmesg >F:/Kerneldmesg.log |