前言
最近有业务需求,需要向已经打包的APK里面注入渠道(channel)信息,方便APK下载安装之后进行渠道归因。向APK里面注入渠道信息已经有比较成熟的方案美团walle。walle的强大和实现原理本文不再赘述。为了理解walle的代码,并且在出现异常case的时候,能够自己解决。必须要对APK文件的结构了如指掌。
因此,本文的目的就是以一个简单的利用walle向APK里面注入渠道号为例。带你了解APK里面的各种细节,相信读者在看完此篇文章之后,再阅读walle的代码的时候一定豁然开朗。
ZIP和APK文件格式概览
ZIP文件格式概览
APK文件本质上是一个ZIP文件,因此在了解APK的格式之前必须先了解ZIP文件的格式。详情参见zip文件格式详解 。
ZIP文件的整体格式如下图所示,主要由三部分组成
数据区(Contents of ZIP entries):存储文件压缩内容
中央目录区(Central Directory Header):存储zip文件里面包含的所有目录
中央目录结尾记录(End of Central Directory Record:ECDR):存储zip文件的整体信息

其中,中央目录结尾记录对于理解本文最为重要。最好看完zip文件格式详解 再继续往下阅读。此区域里面有一个值核心目录偏移地址非常的重要,以下图为例的话,核心目录的起始地址就是0x2D(注意:是地址,不是数值)

APK文件格式概览
APK在签名(V2/V3签名)之后,会在数据区和中央目录区之间插入APK签名区(APK Signing Block)

这篇博客旨在通过向APK中注入渠道信息的实例,深入解析APK的ZIP和APK签名结构。介绍了如何找到中央目录地址,计算ID-Value序列的起始地址,并通过二进制分析提取特定ID的注入信息,帮助读者理解APK文件的内部工作原理。
最低0.47元/天 解锁文章
376

被折叠的 条评论
为什么被折叠?



