Android App Bundle 技术介绍及详细使用教程

一 Android App Bundle 是什么?

Android App Bundle 是一种发布格式 —— 准确地说,是一个带有.aab扩展名的 zip 文件。它包含应用支持的所有设备的代码和资源,例如 DEX 文件、本地代码库、清单文件、各种资源文件等。一旦上传用于发布,Google Play 就会处理 APK 的签名和生成,这个过程称为动态交付 (Dynamic Delivery)。动态交付的用途是,根据用户的设备配置为用户生成优化的 APK。

app bundle.gif

使用 Android App Bundle 的好处

  • 更小的应用体积 — 减小 APK 体积意味着用户能以更少的下载流量和空间获得应用程序。
  • 更少的 APK — 不再需要根据地区、机型等区别管理多个 APK。Google Play 控制台会为开发者自动生成和签署 APK。
  • 动态功能模块(Dynamic feature modules) — 仅在用户需要时才在应用程序中加载对应功能,即按需加载。

二 Android App Bundle 包结构

aab_format-2x.png app bundle 是经过签名的二进制文件,可将应用的代码和资源组织到不同的模块中,如下图所示。各个模块的代码和资源的组织方式都与 APK 中的相似,之所以如此,是因为每个模块都可以作为单独的 APK 生成。然后,Google Play 会使用 app bundle 生成向用户提供的各种 APK,如 Base APKConfiguration APKsFeature module APKs 以及multi-APKs(multi-APKs 适用于不支持 Split APK 的设备)。以蓝色标识的目录,如drawable/values/lib/表示 Google Play 用来为每个模块创建配置 APK 的代码和资源。

  • base/, feature1/, and feature2/: 其中每个顶级目录都表示一个不同的应用模块。应用的基本模块始终包含在 App Bundle 的 base 目录中。
  • asset_pack_1/ and asset_pack_2/: 对于需要大量图形处理的大型应用或游戏,可以将资产模块化处理为资源包。Google Play 使用 Play Asset Delivery 用于分发。
  • BUNDLE-METADATA/: 此目录包含元数据文件,其中包含对工具或应用商店有用的信息。此类元数据文件可能包含 ProGuard 映射和应用的 DEX 文件的完整列表。此目录中的文件未打包到应用的 APK 中。
  • Module Protocol Buffer (*.pb) files: 这些文件提供了一些元数据,有助于向各个应用商店(如 Google Play)说明每个应用模块的内容。
  • manifest/: 与 APK 不同,app bundle 将每个模块的 AndroidManifest.xml 文件存储在这个单独的目录中。
  • dex/: 与 APK 不同,app bundle 将每个模块的 DEX 文件存储在这个单独的目录中。
  • res/, lib/, and assets/: 这些目录与典型 APK 中的目录完全相同。当上传 App Bundle 时,Google Play 会检查这些目录并且仅打包满足目标设备配置需求的文件,同时保留文件路径。
  • root/: 此目录存储的文件之后会重新定位到包含此目录所在模块的任意 APK 的根目录。

三 Dynamic feature modules

image (1).png

apk_splits_tree-2x.png

  • Base APK:此 APK 中包含了所有其他分裂 APK 都可以访问的代码和资源,并提供应用的基本功能。当用户请求下载应用时,会首先下载并安装该 APK。这是因为只有基本 APK 的清单才包含关于应用的服务、内容提供方、权限、平台版本要求和对系统功能的依赖性的完整声明。Google Play 会根据项目的应用模块(即基本模块)为应用生成基本 APK。
  • Configuration APKs:每个配置 APK 都包含针对特定屏幕密度、CPU 架构或语言的原生库和资源。当用户下载应用时,他们的设备只会下载并安装该设备对应的配置 APK。每个配置 APK 都是基本 APK 或功能模块 APK 的依赖项。也就是说,配置 APK 会随它们为之提供代码和资源的 APK 一起下载和安装。与基本模块和功能模块不同,不需要为配置 APK 单独创建模块。如果您在为基本模块和功能模块 组织管理配置专用的备用资源 时遵循了标准实践,Google Play 会自动为您生成配置 APK
  • Feature module APKs:每个功能模块 APK 都包含使用功能模块进行了模块化处理的某项应用功能的代码和资源。随后可以自定义如何以及何时将该功能下载到设备上。例如, 使用 Play 核心库 ,可在将基本 APK 安装到设备上之后再按需安装某些功能,以向用户提供额外的功能。

四 Android App Bundle 的使用

4.1 配置基本模块

对于大多数应用而言,要支持 Android App Bundle 并不费力。因为应用基础 APK 中包含代码和资源的模块是一个标准的应用模块,当使用 Android Studio 新建项目的时候得到的默认模块就是这样的一个模块,在此模块下的 build.gradle 脚本文件中使用 application 插件 (com.android.application),并为应用的基础功能提供所需的代码和资源。

apply plugin: 'com.android.application'

4.2 版本号与应用升级

使用 Android App Bundle,无需关注上传到 Google Play 的多个 APK 的版本号,只需要关注应用基础模块的版本号即可。在基础模块下的 build.gradle 配置版本号,如下示例所示:

android {
    defaultConfig {
        // ...
        // 只需要在基础模块下指定应用的版本号
        versionCode 1
        versionName "1.0"
    }
}

上传 App Bundle 之后,Google Play 会使用基础模块中定义的应用版本号,为从这个 App Bundle 生成的所有 APK 的版本号进行重新设置。因此,当设备下载并安装应用时,所有拆分的 APK 都有一样的版本号。 当需要使用新的代码或者资源更新应用时,必须更新应用基础模块下的版本号,并且构建一个完整的新 App Bundle。将新的 App Bundle 上传到 Google Play 后,会重新生成一系列基于基础模块新的版本号的 APK。随后,当用户更新应用时,Google Play 服务端会更新设备上安装的所有 APK 的版本号,设备上所有安装的 APK 都会更新到新版本。

4.3 启用或停用配置 APK 类型

默认情况下,支持为每一组屏幕分辨率、cpu 架构和语言成配置 APK。在应用基础模块下的 build.gradle 脚本文件中,通过 android.bundle 代码块可以启用或者禁用对一个(或多个)配置 APK 的支持。如下示例所示:

android {
 
    ......
 
    bundle {
        density {
            // Different APKs are generated for devices with different screen densities; true by default.
            enableSplit true
        }
        abi {
            // Different APKs are generated for devices with different CPU architectures; true by default.
            enableSplit true
        }
        language {
            // This is disabled so that the App Bundle does NOT split the APK for each language.
            // We're gonna use the same APK for all languages.
            enableSplit true
        }
    }
}

4.4 构建生成 App Bundle

使用 Android Studio 构建 App Bundle

  1. 下载安装 Android Studio 3.2 及以上版本;
  2. 在菜单栏中依次打开Build -> Generate Singned Bundle or APK,在弹出窗口中选择 Android App Bundle,点击下一步选择签名,最终导出 Android App Bundle 文件(.aab)。如果在 build.gradle 中配置了签名选项,可以在 Gradle 窗口中,依次展开 基础模块名 -> Tasks -> build,然后双击下面的 bundle或者 bundleRelease)执行任务,执行完成之后会在 基础模块名/build/outputs/bundle/<build-type>目录下找到已签名的 App Bundle 文件(亦可以直接在 Android Studio 的命令行中执行 gradlew bundle 命令构建)
  3. 获取到最终的 Android App Bundle 文件,上传到 Google Play 进行部署(或者通过 Android Studio 部署 App Bundle 到连接的设备上)

4.5 Bundle 文件部署到设备

获取到最终的 Android App Bundle 文件后,通常可用三种方案进行部署

  • 上传到 Google Play 部署
  • 通过 Android Studio 部署 App Bundle 到连接的设备
  • 使用命令行工具

4.5.1 上传到 Google Play

国内暂时比较困难

4.5.2 Android Studio 部署   

因为 Android App Bundle 文件(.aab)只是一种发布格式,并不是可安装文件,因此不能直接安装在测试设备上,但是可以通过 Android Studio 将构建的 App Bundle 文件,部署到已连接的测试设备上(即针对测试设备生成对应配置的 APK 并安装运行),因为 Android Studio IDE 和 Google Play 使用的是同一种工具提取 APK 并安装到设备上。默认情况下,从 Android Studio 部署应用到连接的设备上时,IDE 会构建和部署连接设备对应的配置 APK(因为构建单个配置 APK 比构建所有配置 APK 要快得多)。在 Android Studio 中部署 App Bundle,可以参考一下步骤:

  1. 在菜单栏中依次打开Run -> Edit Configurations
  2. 在左侧容器中选中一个run/debug 配置(Android Studio 中显示为 Android App 类型);
  3. 在右侧容器中选中General标签,在Installation Options 下面的Deplay 选项中,选择 APK from app bundle,然后点击Apply保存配置;
  4. 在菜单栏中依次打开 Run -> Run(或者点击工具栏的运行按钮),Android Studio 就会构建 App Bundle,并且根据生成的 App Bundle 为连接的设备生成对应的配置 APK 并安装运行。

注意事项:使用 Android Studio 测试部署 App Bundle 时,并不会生成 APK 文件,而是直接安装到连接的设备并运行,如果需要测试生成配置 APK,请参考:使用 bundletool 为 Android App Bundle 生成 APK 集合。

4.5.3 使用命令行工具

在命令行中构建 App Bundle,有两种方法,一种是 Android Gradle插件,另一种是 BundleTools工具。

  • **Android Gradle 插件:**这个插件由 Google 编写,与 Android Studio 捆绑,并且在 Maven 仓库中可用。插件定义了可在命令行中构建 App Bundle 的命令。
gradlew :<模块名>:bunbleDebug | bundleRelease

注意事项:

  1. 不能使用 apksigner 对 App Bundle 进行签名,要对 App Bundle 进行签名,请使用 jarsigner;
  2. Android Gradle 插件只能构建 App Bundle,但不能生成配置 APK,如需要生成配置 APK,请参考:使用 bundletool 为 Android App Bundle 生成配置 APK。
  • BundleTool 工具:相比 Android Gradle 插件而言,BundleTool 工具生成 App Bundle 要复杂得多,首先要生成 proto 格式的清单和资源(使用 aapt2 编译并链接应用的资源),然后将这些清单和资源打包成 ZIP 文件(文件目录结构与 Android App Bundle 类似),最后使用 bundletool build-bundle --modules=base.zip --output=mybundle.aab命令生成最终的 Android App Bundle 文件(.aab)。具体使用可参考 bundletool 工具使用详解

4.6 Demo 演示

Android App Bundle Demo

五 国内 App Bundle 技术应用

Qigsaw 爱奇艺开源的 Android 动态化方案

Qiigsaw.png

  • 利用 Android App Bundle 开发套件,极速开发体验。
  • 支持 Android App Bundle 所有功能特性,"山寨"Play Core Library 公开接口实现,开发者阅读官方文档即可愉快开发。
  • 任何进程均可动态加载插件,支持 Android 四大组件动态加载。
  • 如果您的应用有出海需求,可无缝切换至 Android App Bundle 方案。
  • 仅一处 Hook,少量私有 API 访问,保证框架稳定性。Android 动态化方案,在国内已蓬勃发展数年之久,其核心目的是减少应用包体积,提升应用安装率。

HMS 动态加载技术

HMS abb.png HMS 基于 Android App Bundle 技术,将各种能力当做 dynanic-feature,通过改造 AAB 技术中的按需加载逻辑(Android 原生的 AAB 技术依赖 Play core library 和 play 商店),实现能力 Kit 的动态加载,和在线更新

六 总结

App Bundle 主要应用场景:动态加载插件,灵活配置,减小包体积

业务接入 App Bundle 需要的改造点:

  • 客户端将基础业务配置到 base module,扩展功能配置到 feature module
  • 后台支持 spliit APKs的配置、打包、下发

参考文献

Android App Bundle 简介

bundletool 工具使用详解

Qigsaw 爱奇艺开源的Android动态化方案

猜你喜欢

转载自juejin.im/post/7120507330956886030
今日推荐