折腾了一天,终于成功的构建了安卓内核镜像。。。分享一下过程和遇到的坑

2017-04-16 20:36:15 +08:00
 codehz

构建这个镜像的唯一目的就是我想在手机上实验 Linux namespaces 特性,目前大多数安卓 ROM 内置的内核要么完全不支持这个特性,要么只能支持 Network Namespace

构建的过程看上去是比较简单的,实际上坑却不少(只是我自己的过程总结,如有不对之处请大佬轻拍😜)

  1. 准备一台安卓手机——除非你准备在模拟器里玩。对于手机厂商的要求就是,至少得开放刷机权限,以及公开内核代码。

  2. 准备刷机模板——直接用https://github.com/osm0sis/AnyKernel2,然后 clone 到 out 目录,根据模板的 README 修改刷机脚本。

  3. 准备构建环境,操作系统 Linux 或者 Macos 均可,我个人建议使用最好的 Linux 发行版—— Windows ,然后根据发行版的不同,下载合适的构建工具(一般如果不是有什么特殊版本要求(这里假设目标环境是 arm64 ,其他的也是同理)的话, linux 和 windows ( WSL )都可以选择下载 https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9 )。

  4. 下载内核源代码——不作死的话就用厂商自带的,然后检出目标分支到 kernel 目录

  5. 进入 kernel 目录并设置环境变量,比如ARCH=arm64和 PATH

  6. 生成默认配置:在 arch 里根据手机型号找到合适 defconfig 文件的文件名——比如 1+3T 就是arch/arm64/configs/msm-perf_defconfigarch/arm64/configs/msm-oqc_defconfig,然后我选择了msm-oqc_defconfig作为测试,那么接下来就在代码根目录输入make msm-oqc_defconfig

  7. 魔改配置,直接make menuconfig,然后根据需要进行修改

  8. 启动构建make -j(不作死的话就加个数字)

  9. 等待构建完毕,导出内核模块——

    find -name *ko -exec cp "{}" ../out/modules \;

    同样也要复制内核镜像文件——

    cp arch/arm64/boot/Image.gz-dtb ../out

  10. 打包

    cd ../out && zip -r ../flash.zip *

  11. 刷机,进入 TWRP ,开启 sideload 模式,然后

    adb sideload flash.zip

  12. 重启,测试各个功能,注意要测试 dmesg 里又没有可疑的输出

遇到的坑有:

FAQ:

  1. 为啥使用AnyKernel这种方式构造刷机包?

    两个字:简单

    不用去纠结 boot.img 中到底应该设置多少偏移量一类的操蛋问题

15040 次点击
所在节点    Android
12 条回复
abmin521
2017-04-16 21:32:55 +08:00
不错 mark
xdream86
2017-04-16 22:57:57 +08:00
让我想起了装黑苹果的日子
codehz
2017-04-16 23:03:25 +08:00
@xdream86 哈哈,不过安卓至少是开源的,折腾的人更多,相关资源也更多( macos 的驱动可没开源
shijingshijing
2017-04-17 01:16:02 +08:00
@codehz 我比较好奇的是,各个驱动是怎么搞定的,目测是 defconfig 文件这个?不然的话,摄像头,蓝牙,指纹什么的都没办法用吧。
nieyujiang
2017-04-17 08:06:48 +08:00
手动 mark
majinjing3
2017-04-17 08:24:30 +08:00
姿辞
codehz
2017-04-17 09:56:47 +08:00
@shijingshijing 一加的大部分驱动都是直接在厂商给的内核代码里的,小部分需要自己编译,我运气比较好,一找就找到了,虽然我觉得 xda 上可能有相关帖子。。。
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 是什么鬼
codehz
2017-04-17 17:39:26 +08:00
@Panic WSL 啊。。。编译内核用 WSL 就可以完成了,何必弄个 Linux 来做呢
zhujiahao
2018-11-04 00:53:24 +08:00
没有找到生成的 wlan.ko,所以我的手机一直不能使用 wifi
为什么加入了 qcacld2.0 后仍然不能生成 ko ?
zhujiahao
2018-11-06 22:53:56 +08:00
有些开源比较残,需要慢慢弄
zhujiahao
2018-12-23 14:09:51 +08:00
在 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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/355256

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX