如何在不遍历所有 Makefile 的情况下构建 bootimage
How can I build bootimage without going through all Makefiles
我目前正在为 Android phone 开发 Linux 内核。我的工作流程是:
- 更改内核代码
- 使用
make bootimage
构建
- 闪现
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.
你可以试一试:
准备工作:
- 调用
make dist
一次
- 将
target_files.zip
解压缩到 out/dist/
现在创建一个脚本来为您执行以下操作:
- 用新构建的内核覆盖解压后的
target_files
中的内核
- 用新内核
压缩 target_files
- 使用来自
build/tools/releasetools/
的 python 脚本 img_from_target_files
和额外的参数 -z
。示例:img_from_target_files -z out/dist/target_files.zip new_imgs.zip
- 在新创建的
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 版本中对我来说效果很好
如果您仍在研究它,请尝试使用 make
的 showcommands
目标,例如:
make bootimage showcommands
showcommands
目标将显示构建内核和引导映像所需的所有命令。一些命令(包括用于创建引导映像的命令)前面有 $(hide)
,因此未显示。
了解命令和参数后,下次需要制作引导映像时,您可以手动 运行 命令(无需使用 make bootimage
且无需包含所有生成文件)。
我有完全相同的问题,这是我找到的唯一可行的解决方案。
我目前正在为 Android phone 开发 Linux 内核。我的工作流程是:
- 更改内核代码
- 使用
make bootimage
构建
- 闪现
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.
你可以试一试:
准备工作:
- 调用
make dist
一次 - 将
target_files.zip
解压缩到out/dist/
现在创建一个脚本来为您执行以下操作:
- 用新构建的内核覆盖解压后的
target_files
中的内核 - 用新内核 压缩
- 使用来自
build/tools/releasetools/
的 python 脚本img_from_target_files
和额外的参数-z
。示例:img_from_target_files -z out/dist/target_files.zip new_imgs.zip
- 在新创建的
new_imgs.zip
中,您将找到带有新内核的新 boot.img
target_files
您可以尝试 make SINGLE_SHOT
命令 - 如果您知道 Andorid.mk 的路径:-
m -j8 ONE_SHOT_MAKEFILE=build/target/board/Android.mk bootimage
这在 Android L/M/N 版本中对我来说效果很好
如果您仍在研究它,请尝试使用 make
的 showcommands
目标,例如:
make bootimage showcommands
showcommands
目标将显示构建内核和引导映像所需的所有命令。一些命令(包括用于创建引导映像的命令)前面有 $(hide)
,因此未显示。
了解命令和参数后,下次需要制作引导映像时,您可以手动 运行 命令(无需使用 make bootimage
且无需包含所有生成文件)。
我有完全相同的问题,这是我找到的唯一可行的解决方案。