一文了解 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 的构建工具版本)

参考

相关推荐
剑客狼心5 小时前
Android Studio:键值对存储sharedPreferences
android·ide·android studio·键值对存储
雾里看山7 小时前
【MySQL】 表的约束(上)
android·mysql·adb
q567315239 小时前
无法在Django 1.6中导入自定义应用
android·开发语言·数据库·django·sqlite
a3158238069 小时前
Android设置个性化按钮按键的快捷启动应用
android·开发语言·framework·源码·android13
Henry_He9 小时前
SystemUI通知在阿拉伯语下布局方向RTL下appName显示异常
android
XJSFDX_Ali10 小时前
安卓开发,底部导航栏
android·java·开发语言
云罗张晓_za89866812 小时前
抖音“碰一碰”发视频:短视频社交的新玩法
android·c语言·网络·线性代数·矩阵·php
货拉拉技术15 小时前
记一次无障碍测试引发app崩溃问题的排查与解决
android·前端·程序员
GrimRaider16 小时前
【逆向工程】破解unity的安卓apk包
android·unity·游戏引擎·软件逆向