I. 什么是 APK 文件
APK
(Android
application
package
) 是构建和发布 Android
应用程序的关键组成部分,APK
文件是应用程序的打包格式,它将应用程序的代码、资源和清单信息组合在一起,以便在设备上进行安装和运行。
简称 ”安装包“,其本质上就是一个 zip
压缩包。
II. APK 文件的组成部分
常见的文件组成如下,可能还有其他的文件、目录等。
名称 | 目录/文件 | 简析 |
---|---|---|
assets | 目录 | 静态资源文件 |
lib | 目录 | 库文件 |
META-INF | 目录 | 签名文件 |
res | 目录 | 编译资源文件 |
AndroidManifest.xml | 文件 | 配置清单文件 |
classes.dex | 文件 | 核心代码文件 |
resources.arsc | 文件 | 资源映射文件 |
详细解释
assets:静态资源
assets
目录用于存放应用程序的原始静态文件,如音频文件、视频文件、HTML
文件等。
lib:库
lib
目录是应用程序的本地库目录,用于存放与特定硬件架构相关的本地库文件。
META-INF:签名
META-INF
目录存放与 APK
文件的完整性和签名相关的信息。这些文件在 APK
的构建和签名过程中自动生成,其作用主要涉及应用程序的安全性和验证。
有些 APK
解压后看不到 META-INF
目录,有可能是使用的 V2
的签名。V2
的签名信息,则插入在 APk
压缩包的文件结构里(数据区和中央目录中间),所以不会被解压出来。 APK
的签名方式就不在本篇叙述了,Android v1、v2、v3签名详解 这篇文章讲解的不错。
该目录下包含文件:
1. MANIFEST.MF (Manifest File)
MANIFEST.MF
是APK
文件的主清单文件。它包含了与APK
文件相关的元数据信息,如创建时间、修改时间、版本号等。- 主清单文件记录了
APK
文件中包含的其他清单文件的名称和哈希值,用于确保APK
文件的完整性。
2. CERT.RSA (RSA Certificate)
CERT.RSA
文件包含APK
文件的数字签名信息。在APK
构建过程中,开发者会使用数字证书对APK
文件进行签名。- 数字签名是一种保证
APK
文件来源和完整性的机制,它防止APK
在发布过程中被篡改或恶意修改。 Android
设备在安装应用程序时会验证CERT.RSA
文件中的签名信息,确保APK
文件是由合法开发者签名的。
注意:直接解压得到的 CERT.RSA
是使用 RSA
加密了的,需要用 openssl
等工具查看。
openssl pkcs7 -inform DER -in CERT.RSA -text -noout -print_certs
3. CERT.SF (Signature File)
CERT.SF
文件包含APK
文件中所有资源文件的哈希值和清单文件的哈希值。
在APK
签名过程中,清单文件中的每个条目都会被计算哈希值并记录在CERT.SF
文件中。- 当安装
APK
文件时,Android
设备会验证CERT.SF
文件确保其中的哈希值与实际APK
中的资源文件和清单文件一致,防止篡改和修改。所以安装APK
时比较慢,就可能是因为APK
中的资源文件较多,需要进行签名校验。
res: 资源
res
目录是APK
文件中存放资源文件的目录,它包含了应用程序使用的各种资源,如布局文件、图像文件、字符串资源等。- 布局文件(
layout
)定义了应用程序界面的结构和组件的位置。 - 图像文件(
drawable
)包含了应用程序使用的图标、背景图等图像资源。 - 字符串资源(
values
)存储了应用程序中使用的文本字符串,以便实现国际化和本地化。
AndroidManifest.xml:应用程序清单文件
- 清单文件是
APK
文件的核心组成部分,它描述了应用程序的基本信息和特性。 - 清单文件包含了应用程序的包名、版本号、权限要求以及组件的声明,如活动(
Activity
)、服务(Service
)、广播接收器(Broadcast Receiver
)和内容提供器(Content Provider
)等。 - 清单文件告知
Android
系统应用程序的整体结构,使系统能够正确加载和启动应用程序的各个组件。
注意:直接解压 APK
得到的 AndroidManifest.xml
是压缩过的,直接打开将看到乱码,可以通过相关工具(AndroidStudio
,jadx
等)将其解压。
classes.dex:Dalvik 字节码文件
classes.dex
文件是APK
文件中的字节码文件,它包含了应用程序的所有Java
代码经过编译和优化后的结果。Dalvik
是Android
系统使用的一种特定虚拟机,它能够执行经过转换的字节码文件。classes.dex
文件中的字节码被Dalvik
虚拟机解释和执行,使应用程序能够在Android
设备上运行。
resources.arsc:资源索引文件
resources.arsc
是一个二进制文件,它包含了应用程序中使用的所有资源的索引信息。- 资源索引文件记录了每个资源的类型、名称和对应的
ID
。 Android
系统通过解析资源索引文件可以快速访问和加载应用程序所需的资源。
参考
APK文件结构
Android v1、v2、v3签名详解
Android 官方介绍签名