如何在不遍历所有 Makefile 的情况下构建 bootimage

How can I build bootimage without going through all Makefiles

我目前正在为 Android phone 开发 Linux 内核。我的工作流程是:

  1. 更改内核代码
  2. 使用 make bootimage
  3. 构建
  4. 闪现 fastboot flash boot

这很好用。但是,构建会花费不必要的时间,因为 make bootimage 首先遍历整个树并包含所有 Android.mk 文件。这比实际编译内核和创建引导映像花费的时间更长。不必包含这些文件,因为它们没有任何变化。为了减少工作流程中的周转时间,我想加快构建步骤。

在构建其他项目时,有一些方法可以不构建依赖项,从而跳过读取所有 Android.mk 文件(例如 mm)。

有一个 make 目标 bootimage-nodeps 似乎做了正确的事情:它创建了一个新的引导映像,而不需要遍历所有 Android.mk 文件。不幸的是,依赖项还包括内核本身(因此尽管有更改但不会构建)。

我的问题是:有没有一种方法可以构建内核并创建引导映像而无需读取所有 Android.mk 文件。

我不确定你是否可以通过这种方式节省时间(因为这个解决方案需要 zip/unzip 多次,这需要更多时间然后在我的机器上搜索所有 Android.mks)但是因为你问题是:

Is there a way to build the kernel and create a boot image withouth having to read all Android.mk files.

你可以试一试:

准备工作:

  1. 调用make dist一次
  2. target_files.zip 解压缩到 out/dist/

现在创建一个脚本来为您执行以下操作:

  1. 用新构建的内核覆盖解压后的 target_files 中的内核
  2. 用新内核
  3. 压缩 target_files
  4. 使用来自 build/tools/releasetools/ 的 python 脚本 img_from_target_files 和额外的参数 -z。示例:img_from_target_files -z out/dist/target_files.zip new_imgs.zip
  5. 在新创建的 new_imgs.zip 中,您将找到带有新内核的新 boot.img

您可以尝试 make SINGLE_SHOT 命令 - 如果您知道 Andorid.mk 的路径:-

m -j8 ONE_SHOT_MAKEFILE=build/target/board/Android.mk bootimage

这在 Android L/M/N 版本中对我来说效果很好

如果您仍在研究它,请尝试使用 makeshowcommands 目标,例如:

make bootimage showcommands

showcommands 目标将显示构建内核和引导映像所需的所有命令。一些命令(包括用于创建引导映像的命令)前面有 $(hide),因此未显示。

了解命令和参数后,下次需要制作引导映像时,您可以手动 运行 命令(无需使用 make bootimage 且无需包含所有生成文件)。 我有完全相同的问题,这是我找到的唯一可行的解​​决方案。