Android 10:更新内核模块

one*_*one 5 android kernel-module linux-kernel android-source android-kernel

背景:我正在使用 Pixel 4,build QQ2A.200501.001.B2,它是 Android 10。当我从官方源构建内核并刷新它时,触摸屏、WLAN 和其他功能不起作用。我追踪到这个事实是内核模块/vendor/lib/modules没有更新,因此新内核无法加载它们中的任何一个。我尝试仅刷新boot.img整个 AOSP,同样的问题,它们没有更新。我可以通过手动将我构建的内核模块推送到设备并按insmod正确的顺序手动加载它们来解决此问题。

所以我的问题是:

  • 为什么他们不首先更新?
  • 当我刷新时如何将它们与内核一起更新?
  • 或者,如何在刷新后永久更新它们?

当然必须有一种“官方”方式来做到这一点?内核模块通常是如何部署的?


一些注意事项:

我无法将它们推送到/vendor/lib/modules,因为我无法重新/vendor挂载可写:

flame:/ # mount -o rw,remount /vendor                                                                                                                                                   
'/dev/block/dm-5' is read-only
Run Code Online (Sandbox Code Playgroud)

禁用dm-verity似乎没有帮助。

我注意到 AOSP 源包含 中的所有模块/vendor/lib/modules,位于它采用内核映像形式的同一位置(在我的例子中是device/google/coral-kernel)。因此,很自然地,我尝试用我构建的模块替换那里的模块,但是在构建和刷新之后,我发现其中/vendor/lib/modules仍然包含旧模块。

AOSP 文档说不再boot.img包含 ramdisk,它现在位于system分区中。另外,OverlayFS如果我没读错的话,应该使用“供应商覆盖”来更新那里的文件。但是,在我的设备上,没有product/vendor_overlay像文档所说的那样的目录,只有product/overlay/. 我也不确定这是否是解决这个问题的正确方法,或者我将如何在我的情况下创建这样的覆盖。

谢谢

Tec*_*eks 1

好的。几个问题,几个答案:

  • 为什么他们不首先更新?

    • 因为它们应该位于 /vendor/lib/modules 中,并且当您重新编译内核时,您只是创建了进入 boot.img 的内核二进制文件。

    • 当我刷新时如何将它们与内核一起更新?

    您可以将模块编译到内核中。这会使您的内核变得更大一些,但使您无需插入这些模块。

    • 或者,如何在刷新后永久更新它们?

    您确实可以像您尝试过的那样修改 /vendor - 但不能修改 DM-verity 块设备(在您的情况下为 /dev/block/dm-5 ) - 底层分区(/dev/block/sd?#,某些东西,其中如果您查看 /dev/block/by-name/vendor 中的链接,您就可以看到。

    注意:这将导致 dm-verity 无法安装 /vendor,除非您正确禁用 dm-verity!

    尝试测试的另一个途径:Linux 内核模块有严格的 vermagic 要求(简单来说,模块字符串必须与内核的“uname -r”匹配,以确保关键内核结构未被修改)。如果您不更改内核魔法(Makefile 中的 VERSION、PATCHLEVEL、SUBLEVEL 和 EXTRAVERSION)(或将它们“伪造”为设备附带的原始内核版本),则应加载模块。