65.9K
CodeProject 正在变化。 阅读更多。
Home

通过 Android App Bundle 实现更小的应用和更简单的发布

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (1投票)

2018年10月1日

CPOL
viewsIcon

9455

在本文中,我将解释 Android App Bundles 如何帮助您,并演示如何使用它们。

对于手机用户来说,收到“存储空间不足”的警告可能会非常烦人。手机存储容量仍然是一个有限的资源。尽管多年来手机存储容量有所增长,但填充我们手机的东西也越来越多:音乐、应用、游戏、照片等。

传统的 Android Package Kit (APK) 包含支持应用所有设备的代码和资源(布局文件、图片等)的集合。因此,当您安装一个 APK 时,您实际上安装了您可能永远不会使用的资源。您的屏幕尺寸不会改变,CPU 也不会改变;您通常不会说应用支持的所有语言。显然,APK 提供的比您要求的要多,占用的空间也比实际需要的要多。

但是,如果您认为过大的 APK 是您存在的祸根,现在您有了解决方案。在今年的 Google I/O 上,Android App Bundle 被推出,以帮助开发者以更小的 APK 尺寸交付出色的应用。下面,我将解释 Android App Bundles 如何帮助您,并演示如何使用它们。

什么是 Android App Bundle?

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

来源:https://goo.gl/BbLjWE (Android Developers Blog)

拆分 APK(在 Lollipop 中引入)是从给定的 Android App Bundle 生成的,它们的作用类似于单个 APK。一个典型的应用会获得一个基础 APK 和配置 APK。而且,如果应用有动态功能,用户也会获得动态功能 APK 及其配置 APK。基础 APK 包含所有设备配置共有的文件,例如清单文件。配置 APK 是为您生成的,每个 APK 都包含特定设备配置的资源:语言、CPU 架构或屏幕密度。因此,用户会获得一个像其他设备一样的标准基础 APK,以及只包含用户设备相关资源的配置 APK。

这意味着我的 Android One 手机(小米 Mi A1)会获得一个基础 APK、用于英语的配置 APK、arm64 CPU 架构以及 xhdpi 屏幕分辨率。更有趣的是——当设备配置(例如语言)发生变化时,Google Play 会检测到并下载对应语言的配置 APK。为了进一步减小 APK 尺寸,目前正在计划根据纹理压缩格式、图形 API 和新平台功能来定位设备。

动态功能 APK 包含用户首次安装应用时不需要的功能的代码和资源。开发者可以将功能或功能添加到他们的应用中,作为动态功能模块,Google Play 会按需提供,而不是在安装时提供,从而进一步减小应用下载尺寸。将占用大量空间且在安装时不需要的功能以及很少使用的功能拆分成动态功能模块是有意义的。

拥有早于 Lollipop 的 Android 版本的设备也会看到一些可观的尺寸减小,但其 APK 中将包含所有语言。

到目前为止,很明显构建一个巨大的 APK 是无效且过时的做法。Android App Bundle 是 Android 应用交付的未来,稍后我们将看到如何构建一个。

Android App Bundle != APK

Android App Bundle 与 APK 有一些相似之处,但它们是不同的,并且服务于不同的目的。首先,应用包纯粹用于上传。用户不能直接安装和使用它。应用包是一个 ZIP 存档文件,从中生成优化的 APK 并提供给设备。Android App Bundle 包含元数据文件,用于帮助工具生成 APK(这些文件最终不会出现在 APK 中)。此外,应用包具有严格的验证标准。

从 APK 切换到应用包是一个无缝的过程。使用 Android Studio 3.2 及更高版本,您只需点击几下即可生成签名的应用包,并将其上传到 Play 商店,用户就可以开始享受小尺寸 APK 的好处了。由于代码库没有重大更改,因此无需担心。Android App Bundle 的早期采用者已经报告了由于动态交付而导致的应用程序尺寸显著减小。一些开发者甚至将他们的 APK 尺寸减半。

来源:https://goo.gl/4dpWqD (Android App Bundle Page)

Android App Bundles 有哪些好处?

Android App Bundles 为应用开发者和用户带来了诸多好处。在这里,我们来看看其中的一些好处。

  • 更小的应用尺寸意味着更多的用户可以在不考虑删除什么来腾出空间的情况下安装您的应用。
  • 更小的应用意味着用户不太可能卸载您的应用来为设备腾出空间。
  • 由于 Android App Bundle 是一个单一的工件,因此无需构建、签名或管理多个 APK。
  • 可以为特定的用例和受众添加动态功能,而不会增加应用安装时的尺寸。

您还可以期待更长的列表,因为许多有趣的功能将很快提供给开发者,例如应用包很快也将支持即时应用。

构建应用包

大多数应用项目不需要太多努力就可以构建应用包,以便使用动态交付来提供优化的 APK。事实上,通过在 Android Studio 中进行几次点击,如果您已经按照既定约定组织了应用的 कोड 和资源,就可以构建签名的 Android App Bundle 并准备好发布了。但首先,我们需要获取Android Studio Canary。另外值得注意的是,Android Studio 3.2 stable 已于近期发布。

在 Android Studio 中打开项目后,转到菜单栏并选择 Build > Build Bundle(s)/APKs > Build Bundle(s)。等待您的应用包生成。您可以找到 .aab 文件,或者在应用包生成后从弹出的选项中分析生成的应用包。

此 Android App Bundle 无法上传到 Play Console,因为它未签名。要生成签名版本,请选择 Build > Generate Signed Bundle/APK… > Android App Bundle > Select Base Module > Enter Signing Credentials & Check any other options(就像您为 APK 所做的那样)。

可以使用 Gradle 的 bundle 任务通过命令行生成相同的 Android App Bundle。要生成签名的应用包,必须在模块的 build.gradle 文件中配置签名信息。

# building the app bundle 

./gradlew modulename:bundle
./gradlew modulename:bundleVariant

要对从 Android App Bundle 生成拆分的方式进行更精细地控制,可以从 bundle 块中进行。

android {
...
  bundle {
     density {
         enableSplit = <true or false>
     }

     language {
         enableSplit = <true or false>
     }

     abi {
         enableSplit = <true or false>
     }
  }
}

Bundletool 派上用场

Bundletool 是一个用于处理 Android App Bundles 的命令行工具。使用 bundletool,您可以构建 Android App Bundle、提取连接的设备规格、生成 APK Set 存档 (.apks)、从 APK Set 存档中提取/安装 APK,以及验证应用包。由于 Android App Bundle 仅仅是一种发布格式,因此 bundletool 是用于生成用于测试的 APK 的工具。Google Play 和 IDE 使用相同的工具。

该工具是开源的,可以在GitHub上找到。

使用 bundletool

bundletool <command> ...

以下是 bundletool 接受的所有命令列表:build-bundle、build-apks、extract-apks、get-device-spec、install-apks、validate 和 version。使用 bundletool help <command> 获取有关命令的详细信息,例如标志和其他选项。

在以下示例中,我们将查找连接设备的规格、构建 APK,并为连接的设备安装 APK。

# Get Device Spec
bundletool get-device-spec --adb='/usr/bin/adb' --output='specs.json'

# View Device Specification
cat specs.json 
{
  "supportedAbis": ["arm64-v8a", "armeabi-v7a", "armeabi"],
  "supportedLocales": ["en-US"],
  "screenDensity": 480,
  "sdkVersion": 27
}

# Build APKs
bundletool build-apks  --bundle='<path-to-.aab>' /
--device-spec='<path-to-specs.json>' --output='<path-to-output.apks>'


# Install the APK
bundletool install-apks --apks='<path-to-ouput.apks>'

动态功能模块

动态功能模块使您可以将某些功能移到一个单独的模块中。动态交付用于按需向用户提供这些功能。动态功能模块需要一些努力和仔细考虑。有关创建和配置动态功能模块的更多详细信息,请查看文档

上传到 Play 商店

一旦您有了签名的 Android App Bundle,就可以将其上传到 Play 商店,让 Google Play 为您的用户动态交付优化的 APK。您还需要注册Google Play 应用签名才能上传应用包。

Google Play 应用签名提供了一种安全的方式来管理您的应用签名密钥。Google Play 管理您的应用签名密钥,您只需使用您的上传密钥,用于验证您的身份。自行管理应用签名密钥非常危险。一旦丢失密钥,您就无法更新已发布的应用程序;同样,您的密钥也容易被盗。将签名过程委托给 Google Play 可确保您的密钥更安全,并且您可以请求重置您的上传密钥。因此,您不必被锁定在自己的应用程序之外。注册应用签名后,Google Play 会自动生成并签名发送到用户设备的 APK。

上传后,点击应用包并选择 Explore App Bundle 以查看节省了多少尺寸。从这里,您可以搜索并下载特定于设备的 APK。对于列出的配置,您可以选择 VIEW DEVICES 查看将获得该特定 APK 的设备列表。

好消息是 Android App Bundles 可以通过 Publishing API 发布。

结束语

正如我们所见,Android App Bundle 是 Android 应用交付的未来,它使得单体 APK 过时。应用程序不仅可以从尺寸减小中受益,还可以按需提供功能,为每个用户提供独特的体验。

更有趣的是,开发者只需付出很小的努力就能享受这些好处。一些开发者已经看到了应用程序尺寸的大幅减小。用户也从中受益匪浅,因为他们的设备有更多空间用于音乐、电影甚至应用程序。使用Android Vitals,开发者可以进一步提高其应用程序在用户设备上的性能和稳定性。

迁移到应用包格式,了解您的应用尺寸可以减少多少(以及您可以将安装量增加多少倍)。

© . All rights reserved.