一文了解 Android 中 AAR、APK 和 AAB 的文件结构

AAR、APK 和 AAB 是什么

在 Android 中,构建产物有三种文件格式,分别是 AARAPKAAB。它们的作用如下:

  • 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 的构建工具版本)

参考

相关推荐
JhonKI3 小时前
【MySQL】存储引擎 - CSV详解
android·数据库·mysql
开开心心_Every3 小时前
手机隐私数据彻底删除工具:回收或弃用手机前防数据恢复
android·windows·python·搜索引擎·智能手机·pdf·音视频
大G哥4 小时前
Kotlin Lambda语法错误修复
android·java·开发语言·kotlin
鸿蒙布道师7 小时前
鸿蒙NEXT开发动画案例2
android·ios·华为·harmonyos·鸿蒙系统·arkui·huawei
androidwork7 小时前
Kotlin Android工程Mock数据方法总结
android·开发语言·kotlin
xiangxiongfly91510 小时前
Android setContentView()源码分析
android·setcontentview
人间有清欢11 小时前
Android开发补充内容
android·okhttp·rxjava·retrofit·hilt·jetpack compose
人间有清欢12 小时前
Android开发报错解决
android
每次的天空13 小时前
Android学习总结之kotlin协程面试篇
android·学习·kotlin
每次的天空15 小时前
Android学习总结之Binder篇
android·学习·binder