首页 > 解决方案 > 减小 AOSP 内核映像大小

问题描述

我正在尝试构建一个 AOSP 内核,但我无法使生成的内核boot.img小到足以闪存和启动它。它包含带有附加 dtbs 和 initramfs 的压缩内核。我的目的是使用Syzkaller对驱动程序进行模糊测试。我目前正在使用 Pixel XL (marlin)。我使用内核分支android-msm-marlin-3.18-pie-qpr3(也尝试过相关的分支),并且正在尝试各种基于 gcc 的工具链。对于 AOSP,我选择了 Pie(标签android-9.0.0_r46、构建PQ3A.190801.002)。但是,请注意这是一个普遍的问题,它不是模糊测试、内核或设备特定的。

我的要求是:

我尝试过的事情和我的想法:

[5710] partition_enable_wp: group 0 not defined
[5720] DTB offset is incorrect, kernel image does not have appended DTB
[5720] Device info 0x00000131/00010001/0x00010001/0, pmic 0x20009/0x455013/0x0/0x0
[5740] ERROR: Appended Device Tree Blob not found
[5740] panic (frame 0x83a86848):
...

我验证了 DTB 存在并且内核按预期压缩。我的问题是:有可能吗?Android 引导程序甚至支持 xz/lzma 吗?我几乎没有在网上找到任何有关此的信息。有没有办法使用 xz 或 lzma 压缩内核来启动 Android?

我还按照 AOSP 主页(链接)上关于使用 KASAN 和 KCOV 构建像素内核的教程进行操作。我遇到了一些问题,但最终(使用 Linaro GCC 5.5.0,进行了一些配置更改而没有CONFIG_DEBUG_INFO)我可以构建和启动它。作为概念验证很好,但不是我需要的,因为我不得不跳过一些必需的功能。

我几乎陷入了困境,并且已经在这个问题上花了几个星期。还有其他选择吗?我很乐意以任何方式启动它。我很乐意提供任何细节和日志,但感觉这已经是一篇很长的帖子了。非常感谢您!

标签: androidlinuxlinux-kernelandroid-source

解决方案


我找到了一个适合我的解决方案。不过,这是一个很接近的电话,对于不同的情况可能还不足以减小尺寸。无论如何,它可能会帮助其他人。

我使用pigz而不是默认工具,它通过开关gzip提供了更高的压缩级别。-11通过进一步改进来增加优化迭代的次数-I 45(默认为 15)。这挤出了我需要的最后一点:结果Image.gz-dtb比以前小了大约 2.5%。

这些是我对内核构建系统所做的更改(假设pigz将在您PATH的构建时):

diff --git a/arch/arm64/boot/Makefile b/arch/arm64/boot/Makefile
index b7cf2a498c19..7dfd438e997b 100644
--- a/arch/arm64/boot/Makefile
+++ b/arch/arm64/boot/Makefile
@@ -30,7 +30,8 @@ $(obj)/Image: vmlinux FORCE
        $(call if_changed,objcopy)

 $(obj)/Image.gz: $(obj)/Image FORCE                                    
-       $(call if_changed,gzip)                  
+#      $(call if_changed,gzip)
+       $(call if_changed,pigz)

 $(obj)/Image.lz4: $(obj)/Image FORCE  
        $(call if_changed,lz4)
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib                      
index c2b437eb23d5..73d4581f7531 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -272,6 +272,11 @@ quiet_cmd_gzip = GZIP    $@
 cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -n -f -9 > $@) || \
        (rm -f $@ ; false)

+
+quiet_cmd_pigz = PIGZ    $@
+cmd_pigz = (cat $(filter-out FORCE,$^) | pigz -n -f -11 -I 45 > $@) || \
+       (rm -f $@ ; false)
+
 # DTC
 # ---------------------------------------------------------------------------

它闪烁并启动良好,甚至在合理的时间内启动,与我之前的情况相反。


推荐阅读