如何在 android 设备上刷新内核映像?

How to flash the kernel image on android device?

我正在尝试学习内核定制,为此我有目标 OnePlus 6T 设备。我可以通过以下步骤在我的 Ubuntu 18 上编译内核源代码:

以下是编译的最后几行:

CC drivers/media/platform/msm/broadcast/tspp.mod.o
CC drivers/media/platform/msm/dvb/adapter/mpq-adapter.mod.o
CC drivers/media/platform/msm/dvb/demux/mpq-dmx-hw-plugin.mod.o
GZIP arch/arm64/boot/Image.gz
CC drivers/soc/qcom/llcc_perfmon.mod.o
CC drivers/video/backlight/lcd.mod.o
CC net/bridge/br_netfilter.mod.o
LD [M] drivers/char/rdbg.ko
LD [M] drivers/media/platform/msm/broadcast/tspp.ko
LD [M] drivers/media/platform/msm/dvb/adapter/mpq-adapter.ko
LD [M] drivers/media/platform/msm/dvb/demux/mpq-dmx-hw-plugin.ko
LD [M] drivers/soc/qcom/llcc_perfmon.ko
LD [M] drivers/video/backlight/lcd.ko
LD [M] net/bridge/br_netfilter.ko
CAT arch/arm64/boot/Image.gz-dtb
make[1]: Leaving directory '/home/.../KernelCustomization/android_kernel_oneplus_sdm845/Out'

现在,下一步是闪烁图像。我已经 root OnePlus 6T 设备,我对成功编译后生成的三个图像文件感到困惑,即

我需要帮助:

找到 Google 文档

https://source.android.com/devices/bootloader/partitions-images

根据 google 文档中的以下几行:


boot: 引导分区包含一个内核映像和一个通过 mkbootimg 组合的 RAM 磁盘。为了直接刷入内核而不刷入新的引导分区,可以使用虚拟分区:

kernel:虚拟内核分区通过将新映像覆盖在旧映像上来仅覆盖内核(zImage、zImage-dtb、Image.gz-dtb)。为此,它会确定现有内核映像在 eMMC 中的起始位置并复制到该位置,请记住新内核映像可能比现有内核映像更大。引导加载程序可以通过移动其后的任何数据或因错误而放弃操作来生成 space。如果提供的开发内核不兼容,您可能需要更新 dtb 分区(如果存在),或者更新具有相关内核模块的供应商或系统分区。


我想我必须使用 arch/arm64/boot/Image.gz-dtb 来刷新内核。我的理解是 Image.gz-dtb 是一个虚拟映像,可用于在 android.

上仅闪存内核

不过,我还是想不出刷入它的正确步骤。我想知道我是否会做错什么然后我会破坏我的设备所以我想在闪烁之前确定它是否可以工作。

此时任何帮助或指导都会很有帮助。


我找到了在 android 设备上刷新自定义内核所需的步骤,即

我需要更多关于缺失步骤的信息。实际上上面写的过程适用于只有一个启动分区的设备。有谁知道如何在具有 a/b 分区的设备上刷新我的单个内核映像?


更新:

我在互联网上搜索了 A/B 分区,我发现这些用于无缝更新,即一个分区一次处于活动状态,另一个不活动的分区可用于闪存更新。重新启动时,另一个分区将变为活动状态,而一个分区将变为非活动状态。更多信息:https://www.xda-developers.com/how-a...opment-on-xda/

如果我的理解是正确的,那么我只需要按照以下步骤找到正确的映像以在闪存内核的第一步中使用:

  1. fastboot getvar 全部 | grep“当前插槽”
  2. dd if="path to boot of active slot" of=/sdcard/boot.img
  3. 继续 boot.img 并使用上面编写的闪存内核步骤来闪存内核。

有这方面知识的请确认一下。我会非常感谢你的。

  1. A/B OTA更新 首先,您需要通过以下命令确认您的 phone 是否为 A/B OTA 更新 fastboot getvar slot-count 如果命令 returns '2',那么你的 phone 支持 A/B OTA 更新,这意味着你有两个引导 分区 'boot_a' 和 'boot_b',否则,应该只有一个分区 'boot'
  2. 引导映像 您构建的映像 (Image.gz-dtb) 只是带有设备树的内核映像。他们 不足以闪存到引导分区,因为应该结合 ramdisk 和引导参数。 ramdisk 内容包含非 A/B OTA 系统的正常启动二进制文件或恢复二进制文件 A/B OTA系统。您需要找到官方的 ramdisk 映像并与您的内核映像结合。通常情况下 mkbootimg 将用于在 AOSP android.
  3. 中创建引导映像
  4. 正在闪烁 fastboot 闪存启动 boot.img 这适用于 A/B 和非 A/B 系统,因为映像将被刷新到默认活动分区(boot_a 如果您没有 OTA 或使用 'fastboot set_active' 更改它,则默认为默认) 在 A/B 系统上,您还可以使用 'fastboot getvar current-slot' 获取活动插槽和特定闪存 分区 'fastboot flash boot_a boot.img' 或 'fastboot flash boot_b boot.img' XDA 提供脚本来刷新内核映像 (Image.gz-dtb),步骤如下: 一种。从你的 phone 转储 boot.img b.从 boot.img 中提取 ramdisk.img C。将 Image.gz-dtb 与 ramdisk.img 合并为新的 boot.img d.闪存新 boot.img 以启动分区

    https://forum.xda-developers.com/oneplus-6t/development/kernel-holydragon-t3878107 提供定制的内核和刷写脚本,您应该检查并找到合适的方式来刷写您的内核映像。