折腾了一天,终于成功的构建了安卓内核镜像。。。分享一下过程和遇到的坑 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codehz
V2EX    Android

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

  •  
  •   codehz 2017-04-16 20:36:15 +08:00 22406 次点击
    这是一个创建于 3107 天前的主题,其中的信息可能已经有所发展或是发生改变。

    构建这个镜像的唯一目的就是我想在手机上实验 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 里又没有可疑的输出

    遇到的坑有:

    • 黑屏原因有很多,大多数都是构建内核的参数问题比如弄错了基础配置模板,弄错了 ABI 一类的,仔细看厂商仓库的文件修改时间,应该能找到正确的配置模板的

    • WiFi 不工作 /数据网络无效 /指纹识别无效 /拍照无效 /触控无效多半是模块没弄上去。。。

    • 即使已经把所有的模块都带上了,还是有设备无法工作我在搞 1+3T 的时候就遇到过 WiFi 始终无法工作的问题,解决方法就是研究厂商的刷机包,看看 system/lib/modules 里面有没有没有涵盖到的模块比如我那个就是缺少一个 qca-cld 的驱动,解决方法就是

      1. 找到对应的模块我在某第三方刷机包里发现 wlan.ko 是一个链接,而链接的目标就是 qca 目录,里面有个 qca-cld-wlan.ko 文件那不必说,肯定就是 qca-cld 模块了
      2. 找到模块名字之后,就是把那个模块的独立源代码下载下来,比如我遇到的那个 wifi 驱动,就是直接从 google 的代码库里找到的,然后克隆到某个特定的目录
      3. 在那个目录里执行构建模块任务make KERNEL_SRC=~/data/kernel -j
      4. 得到构建到的目标内核模块,加入到 modules 里,重新打包刷机
    • 各种编译错误:多数是符号定义的问题,由于构建系统的复杂性,搞清楚整个构建系统对我来说,还不如直接批量修改源代码,比如把一部分#include<>改成#include"",或者在#include""里加上相对路径,或者修改某些宏定义一类的。诚然,修改 Makefile 应该是更好的选择,奈何复杂度太高。

    FAQ:

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

      两个字:简单

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

    12 条回复    2018-12-23 14:09:51 +08:00
    abmin521
        1
    abmin521  
       2017-04-16 21:32:55 +08:00
    不错 mark
    xdream86
        2
    xdream86  
       2017-04-16 22:57:57 +08:00   1
    让我想起了装黑苹果的日子
    codehz
        3
    codehz  
    OP
       2017-04-16 23:03:25 +08:00
    @xdream86 哈哈,不过安卓至少是开源的,折腾的人更多,相关资源也更多( macos 的驱动可没开源
    shijingshijing
        4
    shijingshijing  
       2017-04-17 01:16:02 +08:00
    @codehz 我比较好奇的是,各个驱动是怎么搞定的,目测是 defconfig 文件这个?不然的话,摄像头,蓝牙,指纹什么的都没办法用吧。
    ZeoKarl
        5
    ZeoKarl  
       2017-04-17 08:06:48 +08:00
    手动 mark
    majinjing3
        6
    majinjing3  
       2017-04-17 08:24:30 +08:00 via Android
    姿辞
    codehz
        7
    codehz  
    OP
       2017-04-17 09:56:47 +08:00 via Android
    @shijingshijing 一加的大部分驱动都是直接在厂商给的内核代码里的,小部分需要自己编译,我运气比较好,一找就找到了,虽然我觉得 xda 上可能有相关帖子。。。
    Panic
        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 是什么鬼
    codehz
        9
    codehz  
    OP
       2017-04-17 17:39:26 +08:00 via Android
    @Panic WSL 啊。。。编译内核用 WSL 就可以完成了,何必弄个 Linux 来做呢
    zhujiahao
        10
    zhujiahao  
       2018-11-04 00:53:24 +08:00
    没有找到生成的 wlan.ko,所以我的手机一直不能使用 wifi
    为什么加入了 qcacld2.0 后仍然不能生成 ko ?
    zhujiahao
        11
    zhujiahao  
       2018-11-06 22:53:56 +08:00
    有些开源比较残,需要慢慢弄
    zhujiahao
        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
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     889 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 22:20 PVG 06:20 LAX 15:20 JFK 18:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86