应用包结构

Android 包 (Package)

Android 应用以 APK (Android package) 存档文件的形式分发。APK 文件是一个 ZIP 压缩存档,包含 Android 应用的所有内容,是 Android 设备用于安装应用的文件。

APK 文件具有以下结构:

名称
类型
描述

META-INF

目录

此目录包含 APK 元数据。

META-INF/MANIFEST.MF

文件

此文件包含 Java 运行时环境在加载 JAR 文件时使用的各种信息,例如要运行的主类、包版本、构建编号、包创建者、Java 小程序和 Java webstart 包的安全策略/权限、JAR 中文件名列表及其 SHA-256 摘要等。

META-INF/CERT.RSA 或 META-INF/CERT.DSA

文件

包含 CERT.RF 的签名内容,用于使用公钥验证应用完整性。

META-INF/CERT.SF

文件

此文件包含所有文件列表及其 SHA-1 摘要。

lib

目录

此目录包含依赖于平台的编译代码。

lib/armeabi-v7a

目录

此目录仅包含适用于所有基于 ARMv7 及更高版本处理器的编译代码。

lib/arm64-v8a

目录

此目录仅包含适用于所有基于 ARMv8 arm64 及更高版本处理器的编译代码。

lib/x86

目录

此目录仅包含适用于 x86 处理器的编译代码。

lib/x86_64

目录

此目录仅包含适用于 x86_64 处理器的编译代码。

kotlin

目录

包含 Kotlin 特定数据(仅当应用使用 Kotlin 编写时)。

res

目录

此目录包含未编译到 resources.arsc 中的资源。

assets

目录

此目录包含应用资源。

AndroidManifest.xml

文件

此文件是 Android 应用的清单。它包含有关包名、应用组件、应用权限、兼容性功能等信息。

classes.dex

文件

此文件是以 dex 文件格式编译的类,可被 Dalvik 虚拟机和 Android 运行时理解。

resources.arsc

文件

此文件包含预编译资源,如字符串、颜色或样式。

Android App Bundles

Android App Bundle 是一种发布格式,包含应用的所有编译代码和资源,并将 APK 生成和签名推迟到 Google Play 处理。

Google Play 使用应用包为每个设备配置生成和提供优化的 APK,因此只有特定设备需要的代码和资源才会被下载来运行应用。

2021 年下半年,新应用将被要求使用 Android App Bundle 在 Google Play 上发布。

Android App Bundle 是开发者上传到 Google Play 的文件(扩展名为 .aab)。

应用包是签名的二进制文件,将应用的代码和资源组织成模块。每个模块的代码和资源的组织方式与在 APK 中类似——这是合理的,因为这些模块中的每一个都可能作为单独的 APK 生成。然后,Google Play 使用应用包生成提供给用户的各种 APK,如基础 APK、功能 APK、配置 APK 以及(对于不支持拆分 APK 的设备)多 APK。蓝色标记的目录(如 drawable/values/lib/ 目录)代表 Google Play 用于为每个模块创建配置 APK 的代码和资源。

以下列表更详细地描述了应用包的一些文件和目录:

  • base/、feature1/ 和 feature2/ - 每个这些顶级目录代表应用的不同模块。应用的基础模块始终包含在应用包的 base 目录中。但是,每个功能模块的目录由模块清单中 split 属性指定的名称给出,参见文档

  • asset_pack_1/ 和 asset_pack_2/ - 对于大型、图形密集的应用或游戏,开发者可以将资源模块化为资源包。

  • BUNDLE-METADATA/ - 此目录包含元数据文件,其中包含对工具或应用商店有用的信息(例如,ProGuard 映射或应用 DEX 文件的完整列表)。此目录中的文件不会打包到应用的 APK 中。

  • 模块协议缓冲区 (*.pb) 文件 - 这些文件提供元数据,帮助向应用商店(如 Google Play)描述每个应用模块的内容。

  • manifest/ - 与 APK 不同,应用包将每个模块的 AndroidManifest.xml 文件存储在这个单独的目录中。

  • dex/ - 与 APK 不同,应用包将每个模块的 DEX 文件存储在这个单独的目录中。

  • res/、lib/ 和 assets/ - 这些目录与典型 APK 中的目录相同。

  • root/ - 此目录存储稍后重新定位到包含此目录所在模块的任何 APK 根目录的文件。

拆分 APK 概述

提供优化应用的基本组件是在 Android 5.0(API 级别 21)及更高版本上可用的拆分 APK 机制。拆分 APK 与常规 APK 非常相似——它们包含编译的 DEX 字节码、资源和 Android 清单。但是,Android 平台能够将多个安装的拆分 APK 视为单个应用。也就是说,您可以安装多个具有访问公共代码和资源的拆分 APK,并在设备上显示为一个已安装的应用。

以下描述了可能在设备上一起安装以形成完整应用体验的不同类型的 APK。

  • 基础 APK 包含所有其他拆分 APK 可以访问的代码和资源,并为应用提供基本功能。当用户请求下载应用时,此 APK 首先被下载和安装。这是因为只有基础 APK 的清单包含应用服务、内容提供者、权限、平台版本要求和系统功能依赖项的完整声明。Google Play 从项目的应用(或基础)模块为应用生成基础 APK。

  • 配置 APK 包含特定屏幕密度、CPU 架构或语言的原生库和资源。当用户下载应用时,他们的设备仅下载和安装针对其设备的配置 APK。每个配置 APK 是基础 APK 或功能模块 APK 的依赖项。如果开发者使用标准实践来为其基础和功能模块组织替代的、特定配置的资源,Google Play 会自动为他们生成配置 APK。

  • 功能模块 APK 包含开发者使用功能模块进行模块化的应用功能的代码和资源。然后,开发者可以自定义该功能在设备上的下载方式和时间。Google Play 从项目的功能模块为应用生成功能模块 APK。

考虑一个具有三个功能模块和支持多个设备配置的应用。下图说明了应用的各种 APK 的依赖树可能的样子。请注意,基础 APK 形成树的头部,所有其他 APK 都依赖于基础 APK。

参考资料

最后更新于