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

Vat*_*rma 5 linux android android-kernel ubuntu-18.04

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

\n\n\n\n

以下是编译的最后几行:

\n\n
CC drivers/media/platform/msm/broadcast/tspp.mod.o\nCC drivers/media/platform/msm/dvb/adapter/mpq-adapter.mod.o\nCC drivers/media/platform/msm/dvb/demux/mpq-dmx-hw-plugin.mod.o\nGZIP arch/arm64/boot/Image.gz\nCC drivers/soc/qcom/llcc_perfmon.mod.o\nCC drivers/video/backlight/lcd.mod.o\nCC net/bridge/br_netfilter.mod.o\nLD [M] drivers/char/rdbg.ko\nLD [M] drivers/media/platform/msm/broadcast/tspp.ko\nLD [M] drivers/media/platform/msm/dvb/adapter/mpq-adapter.ko\nLD [M] drivers/media/platform/msm/dvb/demux/mpq-dmx-hw-plugin.ko\nLD [M] drivers/soc/qcom/llcc_perfmon.ko\nLD [M] drivers/video/backlight/lcd.ko\nLD [M] net/bridge/br_netfilter.ko\nCAT arch/arm64/boot/Image.gz-dtb\nmake[1]: Leaving directory \'/home/.../KernelCustomization/android_kernel_oneplus_sdm845/Out\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
    \n
  • 拱门/arm64/boot/Image.gz-dtb
  • \n
  • 拱门/arm64/boot/Image.gz
  • \n
  • 拱门/arm64/启动/图像
  • \n
\n\n

我需要帮忙:

\n\n
    \n
  • 我可以使用什么图像在 Android 设备上闪烁?
  • \n
  • 使用 TWRP 启动映像足以刷新内核吗?
  • \n
\n\n

找到谷歌文档

\n\n

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

\n\n

根据谷歌文档中的以下几行:

\n\n
\n\n

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

\n\n

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

\n\n
\n\n

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

\n\n

尽管如此,我还是无法找出刷新它的正确步骤。我想知道我是否会做错什么,然后我会损坏我的设备,所以我想在闪烁之前确定它是否可以工作。

\n\n

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

\n\n
\n\n

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

\n\n
    \n
  • 首先我们需要获取库存固件的启动映像,我们可以通过运行以下命令来获取它:\n\n
      \n
    • adb shell "ls -la /dev/block/platform/soc/1d84000.ufshc/by-name/" > MoreInfo\\msm_partitions.txt
    • \n
    • 记下引导分区名称,例如 boot_a -> /dev/block/sde11 boot_b -> /dev/block/sde39
    • \n
    • 缺少使用命令 dd 命令制作 boot.img 的步骤。
    • \n
  • \n
  • 从此线程下载最新的 Android Image Kitchen。
  • \n
  • 使用启动映像运行以下命令:unpackimg.sh .img
  • \n
  • 找到 zImage 文件并将其替换为您的内核映像(将其重命名为启动映像中的内容)
  • \n
  • 运行以下命令重新打包:repackimg.sh
  • \n
  • 使用 fastboot 或 TWRP 刷新新的启动映像!
  • \n
\n\n

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

\n\n
\n\n

更新:

\n\n

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

\n\n

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

\n\n
    \n
  1. fastboot getvar 全部 | grep \xe2\x80\x9c当前槽\xe2\x80\x9d
  2. \n
  3. dd if="活动插槽启动路径" of=/sdcard/boot.img
  4. \n
  5. 继续 boot.img 并按照上面编写的刷新内核的步骤刷新内核。
  6. \n
\n\n

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

\n

小智 4

  1. A/B OTA 更新 首先,您需要通过以下命令确认您的手机是否是 A/B OTA 更新: fastboot getvar slot-count 如果该命令返回“2”,则您的手机支持 A/B OTA 更新,这意味着您的手机支持 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. 刷写 fastboot flash boot boot.img 这适用于 A/B 和非 A/B 系统,因为映像将刷写到默认活动分区(如果您没有 OTA 或使用“fastboot set_active”更改 boot_a 则默认为 boot_a) ) 在 A/B 系统上,您还可以使用 'fastboot getvar current-slot' 获取活动插槽和特定闪存分区 'fastboot flash boot_a boot.img' 或 'fastboot flash boot_b boot.img' XDA 提供脚本来刷新内核映像(Image.gz-dtb) 具有以下步骤:从手机中转储 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 提供定制的内核和刷新脚本,您应该检查并找到合适的方式来刷新内核映像。