android ota解包函数,android L arm64 kernel image压缩、解压

一、背景

android L 开始支持arm64 cpu 。

但是通过kernel官方文档,可以看到arm64不再支持kernel压缩了。

kernel/Documentation/arm64/booting.txt

3. Decompress the kernel image

——————————

Requirement: OPTIONAL

The AArch64 kernel does not currently provide a decompressor and

therefore requires decompression (gzip etc.) to be performed by the boot

loader if a compressed Image target (e.g. Image.gz) is used.  For

bootloaders that do not implement this requirement, the uncompressed

Image target is available instead.

翻译一下:

AArch64架构 kernel 不提供gzip等解压器(为什么arm64不支持?),如果要使用压缩的kernel image, bootloader必然支持解压功能(即android LK必然先解压kernel,然后启动)。 否则,你就只能使用未压缩的kernel image啦!!

通过看代码,确实kernel/arch/arm64/boot 目录,确实没有arm32目录kernel/arch/arm/boot/compressed下的decompressor相关代码 。

二、问题

android KK 版本,仅支持arm32,且kernel image 编译时默认使用中gzip压缩,然后kernel启动时自解压。

如我之前写的另一篇blog《android系统分区大小设置的经验值》,android KK版本boot分区,都设置得比较小,一般只有20M左右。而android L版kernel image不压缩,编译出来的kernel image一般在在30M以上?

问题来了! KK版本升级到L版本,boot分区太小,导致L版本无法升级! 怎么办?

三、方案

1、首先看kernel如何压缩生成Image.gz :

/kernel/arch/arm64/boot/Makefile

$(obj)/Image: vmlinux FORCE

$(call if_changed,objcopy)

$(obj)/Image.gz: $(obj)/Image FORCE

$(call if_changed,gzip)                       // Image通过使用gzip命令压缩为文件:Image.gz

$(obj)/Image.gz-dtb: $(obj)/Image.gz $(DTB_OBJS) FORCE   // dtb直接copy到Image.gz后,可见dtb没有压缩的。

$(call if_changed,cat)

2、  kernel/Android.mk 文件中根据arch64/arch32这则不同的压缩文件。arm64使用上面通过gzip压缩出来的Image.gz 。

然后 build/core/Makefile 通过mkbootimg 将 ramdisk, Image.gz,  dtb 打包成  boot.img。

ifeq ($(TARGET_ARCH), arm64)

ifeq ($(APPENDED_DTB_SUPPORT), yes)

TARGET_PREBUILT_KERNEL := $(KERNEL_OUT)/arch/$(TARGET_ARCH)/boot/Image.gz-dtb

else

TARGET_PREBUILT_KERNEL := $(KERNEL_OUT)/arch/$(TARGET_ARCH)/boot/Image.gz

endif

else

ifeq ($(APPENDED_DTB_SUPPORT), yes)

TARGET_PREBUILT_KERNEL := $(KERNEL_OUT)/arch/$(TARGET_ARCH)/boot/zImage-dtb

else

TARGET_PREBUILT_KERNEL := $(KERNEL_OUT)/arch/$(TARGET_ARCH)/boot/zImage

endif

endif

3、 根据 kernel/Documentation/arm64/booting.txt描述,arch64不支持自解压,必须在lk中解压,但android default 是不支持。

不过,还好zlib是开源软件,android系统自带zlib代码在目录:external/zlib/src

我们只需将解压相关的代码移植到lk,解压Image.gz后,再启动kernel 。

本文转自:http://blog.csdn.net/fybon/article/details/41078723

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值