AAR、APK 和 AAB 是什么
在 Android 中,构建产物有三种文件格式,分别是 AAR
、APK
和 AAB
。它们的作用如下:
- AAR(Android Archive): 用于封装和共享 Android 库项目,实现代码复用和模块化开发,例如自定义 UI 组件库。
- APK(Android Package): 是 Android 应用的安装包,包含应用运行所需全部内容,可直接安装到设备上。
- AAB(Android App Bundle): 用于发布 Android 应用,Google Play 根据用户设备配置从 AAB 生成针对性 APK 进行分发。
AAR
如何生成 AAR
要在 Android studio 中生成 AAR,首先需要先创建 android Library 的模块。如下图所示:
然后要在选中当前 Library 模块时,通过 Build -> Make Module 来执行创建 AAR 文件的任务,执行完成后就可以在 build/outputs/aar
中看到生成的aar文件。图片示例如下:
AAR 的文件结构
在 Android studio 中双击 aar 文件,就可以查看 aar 文件的结构信息。如下图所示:
AAR中相关文件或者目录的作用如下:
bash
example.aar
├── AndroidManifest.xml # 库的清单文件,描述了库的组件、权限等信息
├── classes.jar # 编译后的 Java 字节码文件
├── res # 资源目录,包含布局、字符串、图片等资源文件
├── R.txt # 资源索引文件,列出了库中所有资源的 ID
├── assets # 资源文件目录,可包含任意类型的文件
├── jni # 包含本地库(如 .so 文件)的目录
├── proguard.txt # ProGuard 规则文件,用于代码混淆
APK的文件结构
APK中相关文件或者目录的作用如下:
perl
example.apk
├── AndroidManifest.xml # 应用的配置清单文件,描述了应用的组件、权限、图标等信息
├── classes.dex # 编译后的 Dalvik 可执行文件,包含应用的 Java 字节码
├── res # 资源目录,包含布局、字符串、图片等资源文件
│ ├── layout
│ │ └── main_layout.xml
│ ├── drawable
│ │ └── icon.png
│ └── values
│ └── strings.xml
├── assets # 资源文件目录,可包含任意类型的文件
├── resources.arsc # 资源映射文件,它包含了应用程序中使用的所有资源的索引信息
├── META-INF # 存放与 APK 文件的完整性和签名相关的信息
│ ├── CERT.RSA # 包含 APK 文件的数字签名信息
│ ├── CERT.SF # 包含 APK 文件中所有资源文件的哈希值和清单文件的哈希值
│ └── MANIFEST.MF # 是 APK 文件的主清单文件。它包含了与 APK 文件相关的元数据信息,如创建时间、修改时间、版本号等。
└── lib # 包含库文件(如 .so 文件)的目录
└── armeabi-v7a
└── libnative-lib.so
需要注意:有些 APK 解压后看不到 META-INF 目录,有可能是使用的 V2 的签名,关于Android签名的相关信息可以看Android v1、v2、v3签名详解
AAB
AAB 的优势
在 2021 的 Google IO 中,建议我们使用 AAB 来替换 APK。使用 AAB 的优势如下:
- 更小的应用体积 --- 减小 APK 体积意味着用户能以更少的下载流量和空间获得应用程序。
- 更少的 APK --- 不再需要根据地区、机型等区别管理多个 APK。Google Play 控制台会为开发者自动生成和签署 APK。
- 动态功能模块(Dynamic feature modules) --- 仅在用户需要时才在应用程序中加载对应功能,即按需加载。
AAB的文件结构
AAB中相关文件或者目录的作用如下:
csharp
example.aab
├── base # 基础模块,包含应用的基本功能
│ ├── manifest # 与 APK 不同,app bundle 将每个模块的 AndroidManifest.xml 文件存储在这个单独的目录中。
│ │ └── AndroidManifest.xml
│ ├── lib # res/, lib/, and assets/ 这些目录与典型 APK 中的目录完全相同。当上传
│ ├── res # App Bundle 时,Google Play 会检查这些目录并且仅打包满足
│ ├── assets # 目标设备配置需求的文件,同时保留文件路径
│ ├── root # 此目录存储的文件之后会重新定位到包含此目录所在模块的任意 APK 的根目录
│ ├── libs # 存放不同CPU架构的.so文件
│ │ └── armeabi - v7a
│ │ └── libmain.so
│ ├── dex # 与 APK 不同,app bundle 将每个模块的 DEX 文件存储在这个单独的目录中
│ │ └── classes.dex
│ ├── assets.pb # assets.pb、native.pb 和 resources.pb 文件是 AAB 格式的重要部分,它们
│ ├── native.pb # 描述了 APP 的不同服务目标,动态下发根据这些目标从 drawable/hdpi、
│ └── resources.pb # lib/armeabi-v7a 或者 `values/es` 等路径中组织不同资源进行下发
├── feature1 # 表示一个不同的应用模块
├── feature2 # 表示一个不同的应用模块
├── asset_pack_1 # 对于需要大量图形处理的大型应用或游戏,可以将资产模块化处理为资源包
├── BUNDLE-METADATA # 此目录包含元数据文件,其中包含对工具或应用商店有用的信息。此类元数据文件可能包含 ProGuard 映射和应用的 DEX 文件的完整列表
├── META-INF
│ ├── ANDROIDD.RSA
│ ├── ANDROIDD.SF
│ └── MANIFEST.MF
├── BundleConfig.pb # 提供了有关 bundle 本身的信息(如用于构建 app bundle 的构建工具版本)