2021 年 8 月起,Google Play 要求所有新应用必须以 Android App Bundle (AAB) 格式进行发布。在这一规定执行一年半后,2023 年 4 月 10 日,Google Play 发布了一则博文,正式推出了去年 10 月就开始测试的应用自动归档(auto-archive)功能。

自动归档功能基于此前推行的 AAB,和 iOS 上的「卸载未使用的 App」功能类似,如果用户选择使用自动归档,则在通过 Google Play 安装应用且手机存储空间不足时,手机会自动移除不常用应用中的部分内容,保留用户个人数据与应用图标。当需要使用该应用时,点击应用图标即可下载移除的内容,接续上次使用继续正常运作。

Android App Bundle 是什么?它与一般的 APK(Android PacKage)有什么区别?它能做到什么 APK 做不到的功能?这篇文章就解答了这一问题。


你终于收到了你的新手机:高分辨率,高刷新率,不拿来看剧实在是可惜了。所以在确认自己的设备受 Netflix 官方支持后,你装上 Play 商店、搜索 Netflix,却发现列表中没有你想要的结果。

是 SafetyNet 没过吗?是解锁影响了系统验证吗?还是开发版 Play 商店设备认证出了问题?

你不想深究、更不想折腾,转念一想 Android 自由、开放,既然自己的设备属于受支持的「合法设备」,上网找个安装包手动装上也未尝不可。于是在网上找了一个 Netflix 的 APK 安装包,装上后却发现 Netflix 提醒「应用功能损坏」,依然要求你前往 Play 商店重新安装。

找个 APK 就能手动安装的传统方法为什么失效了?

多 APK 支持特性与 AAB 发布格式

上述问题出现的根源在于,如果你从某个网站上(即便是相对正规的下载渠道)下载到的安装包是以往常见的 .apk 格式,那这个安装包在安装后很有可能只是一个功能并不完整的「精简版」。

这是「多 APK 支持」特性带来的必然结果。

多 APK 支持是 Google 自 Android 5.0 时代开始引入的特性,不同于以往一个 ​APK​ 文件包含功能组件的「大杂烩」做法,​多 APK 支持特性要求开发者把一个庞大的 APK 拆分成功能不同的模块;如果开发者选择通过 Play 商店进行应用分发,则还需要根据 Android App Bundle(AAB)的格式进行上传。

APK Bundle 示意

如此一来,当用户通过 Play 商店下载拥有多 APK 支持特性的应用时,Play 商店就会根据设备的具体情况下载必要的应用组件,这个过程中用于参考的数据包括处理器架构、屏幕尺寸、功能集支持情况和配置条件等等。

这就好比点外卖时有了备注功能,我们的设备在从 Play 商店下载安装应用前就会向应用商店发出提醒说:

我的机器采用 arm64 架构的处理器,系统语言为中文,所以 x86 架构的英文版就不用给我了,谢谢。

这种应用分发方式帮助开发者更好地进行应用分发,同时也为用户节省了宝贵的流量和带宽资源,因此 Play 商店里有不少应用都采用了这种应用分发方式。

通过 Google Play 发布的 AAB 格式好处很多,除了能在一开始就为用户节省手机上宝贵的存储空间,还可以在发布时,将按配置分发挑拣 APK 的工作交给应用商店,用户不会在下载 app 时面对一大堆安装包感到迷惑,开发者也省去了因为下错版本带来的服务支持麻烦。

应用归档也正是依托于这样分散的 APK 模块完成,当你需要手机空间时,Google Play 会帮你卸载那些不包含个人设置与数据的模块,以 Google News 为例,归档后的应用可从 32MB 缩减至 1.4MB。

但这也带来了一个问题——和微信这种拥有国内、国外两部分市场的应用不同,当我们需要下载 Netflix 这样,正常情况下只通过 Play 商店进行分发的应用时,没有应用商店的配合,网络上的可以找到的独立 APK 安装包很有可能只是「身轻如燕」、没有任何附加功能的「毛坯」版本(base.apk)。

启动后依然会提示我们前往 Play 商店重新安装

这个版本即便能够正常安装,启动后 Netflix 还是会因为功能完整性问题提示你前往 Play 商店重新安装。

第三方渠道的重新打包

好在支持「多 APK」特性的应用越来越多,一些与之对应的第三方分发方式也逐渐成型。以 Netflix 的安装包为例:我们在 APKMirror 能够下载到一个后缀名为 .apkm 格式的安装包,在 ApkPureAptoide 这类网站上则能够下载到一个后缀名为 .xapk 格式的安装包。

从第三方渠道下载到的安装包

无论后缀名如何,这些与常见 APK 文件命名相似,但无法在 Android 系统中直接安装的文件其实都是各大网站针对多 APK 应用推出的应用打包方式。如果我们将 .xapk 文件后缀名改为 .zip 并打开,会发现里面塞满了不同名称、不同功能的 .apk 安装文件。

.xapk 拆包所得

从命名上其实我们已经可以大致猜出不同应用的功能。根据 Google 给出的官方文档,开发者可以使用过滤器将一个应用拆分成功能各不相同的部分,包括:

  • OpenGL 纹理压缩格式
  • 屏幕尺寸及可选屏幕密度
  • 设备功能集
  • Android(Go 版本)
  • API 级别
  • CPU 架构

除此之外,从 Netflix 的 XAPK 文件拆包结果来看,语言和本地化文件(config.语言缩写.apk)其实也是根据设备情况单独进行分发的。不过看到这里可能已经有人想问了:

既然 .xapk 文件都能直接「拆包」了,直接把得到的 .apk 文件一个个装上不行吗?

答案是否定的,事实上,第一个 .apk 文件可能就会把你卡住:

别想了,这些 .apk 文件可不是你想的那种 .apk 文件

使用 SAI 进行安装、管理

拆包一个个装这条路显然是走不通的,因此 APKMirror、APKPure、Aptoide 等网站纷纷推出了相应的工具来辅助安装,这里我们不再赘述。

APKPure 会提示你安装 APKPure 应用

除了拥有加密特性的 .apkm,针对相对通用一点 .xapk 文件,我们还可以借助专门的「多 APK 应用」安装工具 SAI(全名 Split APKs Installer)来进行安装和管理。

在手机上安装 SAI 之后,我们可以直接使用 SAI 来选择并安装手机里的 ​XAPK​ 文件。这里我们既可以直接将 XAPK 文件整个进行安装(如果出现报错可以去设置中打开「使用 ZipFile API」),也可以根据自身需求进行精细化选择和定制。

以 Netflix 的 XAPK 文件为例,在 SAI 的设置中打开「专业模式」后选中需要安装的 XAPK 文件并打开,此时 SAI 会弹出一个「多 APK」模块选单对选中 XAPK 文件中包含的所有模块进行展示。除了必须勾选的基础 APK、CPU 架构代码、DPI 配置资源和默认语言外,我们还可以根据实际需要手动勾选其它模块进行安装。

自定义安装

举个例子,在更换手机系统语言后,Netflix 会检测语言变化并自动从 Play 应用商店下载目标语言的 APK 安装包进行更新;如果你的设备里缺少 Play 服务或无法正常使用 Play 商店更新这类资源,使用 SAI 的高级模式进行安装和更新就非常方便了。

事实上,使用 SAI 进行安装的整个过程可以看作是对 Play Store 分发的一种「复现」或者说手动模拟,其它应用的安装过程自然也大同小异。如果你不清楚自己设备的架构,不妨求助 DevCheckCastro 这类应用。

关联阅读:解决 Android 的疑难杂症,从看懂设备参数开始

除了应用安装,SAI 同样也支持导出安装包,并且在导出时可以自行选择要包括的模块,方便控制安装包的体积,导出的格式是 ​APKs​,和 ​XAPK​ 类似的一种压缩格式。导出的文件同样可以由 SAI 打开安装。

使用 SAI 导出安装包

你可以在 Play 商店 免费下载 SAI,应用免 root 即可使用。

 

关联阅读:

参考文章:

> 下载少数派 客户端、关注 少数派公众号,发现更多实用的 Android 技巧 🌟

以下内容于 2023 年 04 月 11 日更新
Google Play 应用自动归档特性上线

2023 年 4 月 10 日,Google Play 上线了基于 AAB 发布格式的应用自动归档(auto-archive)功能,可以在手机空间不足时,通过归档不常用应用的部分内容达到不卸载应用增加可用空间的目的。这一功能背后的原理,就是自 Android 5.0 时代开始推行的多 APK 支持与 AAB 发布格式。文章就此功能进行了翻新,添加了部分相关内容。