这是一个新的系列文章,我们称之为 "Modern Android Development 技巧",简称为 "MAD Skills"。本系列文章致力于帮助开发者们打造更好的现代 Android 开发体验,敬请关注。
今天为大家发布本系列文章中的第五篇: 打造您的首个 app bundle。如果您想回顾过去发布的内容,请参考下面链接查看:
除了其他特性,我们创建的 Android App Bundle 格式解锁了发布更小尺寸应用的能力。应用尺寸越小意味着更可能被下载,也意味着在磁盘空间不足时能够更多地避免被卸载。另外,在 2021 年下半年,Google Play 将要求 新的应用和游戏以 Android App Bundle 的格式发布。
在这篇文章中,我们会详细介绍如何构建您的第一个 app bundle、如何通过 Play Console 上传 app bundle 以及深入理解一些配置选项。
使用 app bundle 并不需要改变现有的代码库。
您只需要通过命令行或者 Android Studio 即可构建一个 Android App Bundle。
通过命令行构建
如果使用命令行,您需要像下面这样运行其中一个 bundle 任务:
./gradlew bundleRelease
然后在您应用的 build 文件夹下找到 bundle 文件,其默认的路径是 app/build/outputs/bundle/release。
这个 bundle 文件需要先被签名。如果使用 jarsigner 的话,您需要像下面这样签名 bundle 文件:
jarsigner -keystore $pathToKeystore app-release.aab $keyAlias
请使用您实际项目的配置来替换上面命令的参数。在输入 keystore 密码后,bundle 文件就会被签名,之后就可以随时上传了。
通过 Android Studio 构建
在 Android Studio 中,选择 "Build => Generate Signed Bundle / APK" 并且按照对话框提示完成构建。
无论您使用命令行还是 Android Studio,整个处理过程完成后会帮您生成一个经过签名并且可以上传 Play 商店的发行版 bundle。
通过 Play Console 上传
为了上传应用 bundle 到 Play 商店,您首先需要选择一个发行渠道创建一个新的发布。您可以拖放 bundle 文件到 "App bundles and APKs" 部分,或者使用 Google Play 开发者 API 上传。
Play Console 中高亮的 (绿色) 部分是为了上传 app bundle 准备的
Bundle 文件上传之后,Play 商店会根据用户的设备配置来优化 APK 文件。同时这一步也会缩小下载和安装的尺寸。
探索您的 Android App Bundle
如果想查看 Play 商店如何分发您的应用到用户设备,您可以点击该 bundle 行末尾的 "Details" 按钮。
高亮的 "Details" 按钮截图
在详情页中,您可以看到关于该应用 bundle 的很多信息,包括版本号、minSdk 版本、目标 SDK、功能依赖、权限、屏幕尺寸、本地化以及其他相关信息。
您也可以直接下载该应用签名后的 APK 文件,以此来查看 Play 商店分发给特定设备的具体内容。您可以通过点击 "Explore Bundle" 并打开 "Downloads" 标签页来访问该页面。
在这个页面中您既可以直接选择一个具体型号的设备,也可以通过 "Add filter" 下拉菜单添加一个甚至多个过滤条件匹配相应的设备。
在 app bundle explorer 中打开的过滤下拉菜单
下载应用 bundle 并在本地安装
在 app bundle explorer 页面的末尾有一个 "Download" 按钮可以下载一个 Zip 压缩文件,该压缩文件包含多个 APK,均针对上文中所讨论的目标设备进行了量身定制。
下载并解压这个文件后,其中包含的所有 APK 文件可以在该文件夹路径下使用 adb install — multiple *.apk 命令安装到本地模拟器或设备。
在这里所有的 apk 文件均和应用的正常运行相关,同时我想指出 base.apk 是必须要安装的,它提供了您应用的核心功能。除了代码和资源,base 模块还包含了合并后的 AndroidManifest 文件以及整个应用的依赖项。
每一个功能模块或者不同配置的 apk 文件包含了其对应的资源及代码,而 base 模块会将所有的这些模块集成到一起。
取消优化
您可以在每个模块的 build.gradle
中取消优化,只需要指定 language
、density
或者 abi
,并且设置 enableSplit
为 false
,这会告诉构建系统不需要针对指定的配置进行优化。
除非必须,不然我不建议修改这个部分,因为设置 enableSplit 为 false 会极大地增加您应用在设备安装时占用空间的大小。
// 这个配置指定了一个应用 bundle 该如何根据
// 语言、屏幕像素密度以及 cpu 架构 (abi) 来分拆 apk。
// 默认值为 true
// 这意味着每个不同的相关配置会生成一个分解后的 apk。
bundle {
language {
enableSplit = true
}
density {
enableSplit = true
}
abi {
enableSplit = true
}
}
当然存在例外,比如您的应用中内置了语言选项,而且您希望所有可能被用到的语言都一直被加载。即便如此,使用 Android App Bundle 还可以提供给您按需加载功能模块的方法,而这一方法可以帮助您的应用避免安装那些只有一小部分用户可能使用的功能模块。
为了让您可以通过编程的方式下载和安装功能模块,我们还提供了分拆的 API 以方便您使用。这个 API 是 PlayCore 库的一部分,我们会在 MAD Skills 系列的下一篇文章进行详细介绍,敬请关注。