1.为什么要用Android App Bundle
从 2021年8月起,新应用需要使用 Android App Bundle 才能在 Google Play 中发布。现在,Play Feature Delivery 或 Play Asset Delivery 支持大小超过 150 MB 的新应用。
2.Android App Bundle 简介
Android App Bundle (简称AAB)是一种发布格式,其中包含您应用的所有经过编译的代码和资源,它会将APK生成及签名交由 Google Play 来完成。
Google Play 会使用您的 App Bundle 针对每种设备配置生成并提供经过优化的 APK,因此只会下载特定设备所需的代码和资源来运行您的应用。您不必再构建、签署和管理多个 APK 来优化对不同设备的支持,而用户也可以获得更小且更优化的下载文件包。
3.Google Play的两种资源选择性加载方式:
android 因为要适配各种不同硬件和配置,我们有不同 dp 密度的图片文件,语言文件,不同指令集的so等,现在 Android App Bundle 来了可以优化这个问题,google 市场我们下载 apk 时,市场先会检测我们手机的特性,然后选择最合适的资源打成 apk 再发给我们,比如我的手机只需要 arm-v7 的 so,hdpi 的图片,剩下的不会下发我们,这样可以大幅度减少 apk 的体积,尤其是对于 so 来说,以高德地图为例,不同的 so 包加起来有小 10M 了。
Android 设备的CPU类型(通常称为ABIs)
armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部 分Android设备都使用它.
arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。
armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
x86: 平板、模拟器用得比较多。
x86_64: 64位的平板。
这里使用一个APK解压后,可以看到APK内部的文件夹结构。
Lib文件中包含arm64-v8a,armeabiv-v7a两个文件夹,有些应用为适配更多的机型可能还会有armeabi、x86、x86_64等文件夹。在不同的手机中是不需要所有的这些文件夹的。
动态下发库
App Bundles 将一个 apk 拆分成多个 apk,我们的 apk 一般会被拆分为如下几个部分:
Base Apk:首次安装的apk,公共代码和资源,所以其他的模块都基于Base Apk;
Configuration APKs:native libraries 和适配当前手机屏幕分辨率的资源;
Dynamic feature APKs:不需要在首次安装就加载的模块。
Android App Bundle 与 APK 不同,App Bundle 纯粹是为了上传文件而设计的,用户无法直接安装和使用它,.aab 只是一个 zip 文件,Google Play 从中生成优化的 APK 并将其提供给设备进行安装。
(1) Play Feature Delivery:(特色分发)
使用 App Bundle 格式发布应用时,您可以选择使用 Play Feature Delivery,它可让您向应用项目中添加功能模块。这些模块包含仅根据您指定的条件随应用提供的功能和资源,或者稍后在运行时供使用 Play 核心库下载的功能和资源。
让您可按条件分发或按需下载应用的某些功能。 为此,首先需要将这些功能从基础应用中分离到功能模块中。(由于我们的方向是游戏,这块就不做深入了解)。
使用 App Bundle 发布游戏时开发者可以使用 Play Asset Delivery:它是 Google Play 用于分发大量游戏资产的解决方案,为开发者提供了灵活的分发方式和极高的性能。
Play Asset Delivery (PAD) 将 app bundle 的优势带到游戏中。它允许超过 150 MB 的游戏替换旧版扩展文件 (OBB),方法是将包含游戏所需的所有资源的单个工件发布到 Play。PAD 提供了灵活的分发模式、自动更新、压缩和增量修补功能,并且可免费使用。使用 PAD,所有资源包均在 Google Play 上托管和提供,因此您无需使用内容分发网络 (CDN) 向玩家提供游戏资源。
Play Asset Delivery 使用资源包,资源包由资源(如纹理、着色器和声音)组成,但不包含可执行代码。通过 Dynamic Delivery,您可以按照以下三种分发模式自定义如何以及何时将各个资源包下载到设备上:安装时分发、快速跟进式分发和按需分发。
install-time(安装时分发):资源包在用户安装应用时分发。这些资源包以拆分 APK(APK 集的一部分)的形式提供。它们也称为“预先”资源包;您可以在应用启动时立即使用这些资源包。这些资源包会增加 Google Play 商店上列出的应用大小。用户无法修改或删除这些资源包。
(下载大小上限为1GB)
fast-follow(快速跟进式) 资源包会在用户安装应用后立即自动下载;用户无需打开应用即可开始 fast-follow 下载。下载过程中,用户仍然可以进入应用。这些资源包会增加 Google Play 商店上列出的应用大小。
(下载大小上限为 512 MB)
on-demand(按需分发) 资源包会在应用运行时下载。
什么时候触发下载?
(下载大小上限为 512 MB)
总资源下载大小上限
一个 Android App Bundle 中的所有 Asset Pack 的总下载大小上限为 2 GB。
一个 Android App Bundle 中最多可以使用 50 个资源包。
Google Play 商店会以归档文件(而非拆分 APK)的形式提供配置为 fast-follow 和 on-demand 的资源包。这些资源包随后会在应用的内部存储空间中展开。您可以使用 Play Core API 查询以这种方式提供的资源包的位置。应用不应假定这些文件存在或其位于何处,因为它们可能会被用户删除,或在两次游玩的间隙被 Play Core SDK 移动到其他位置。尽管这些文件可由应用写入,您也应将其视为只读文件,因为资源包补丁依赖于这些文件的完整性。
文档地址:
https://developer.android.google.cn/guide/app-bundle/asset-delivery/build-unity?hl=zh-cn
在运行时,可使用 Play Asset Delivery for Unity类来检索打包在资源包中的 AssetBundle。
首先需要获取 Play Asset Delivery 的 Unity 插件(或软件包)。
GitHub下载地址:https://github.com/google/play-unity-plugins/releases
下载好了之后,在Unity中导入google-play-plugins-1.5.0.unitypackage
导入成功后在Unity的菜单栏中多了Google菜单
依次选择 Google > Android App Bundle > Asset Delivery Settings。
如需选择直接包含 AssetBundle 文件的文件夹,请点击 Add Folder。
针对每个 Bundle,将 Delivery Mode 更改为 Install Time、Fast Follow 或 On Demand。解决所有错误或依赖项,然后关闭窗口。
依次选择 Google > Build Android App Bundle 以构建 App Bundle。
(可选)配置 App Bundle 以支持不同的纹理压缩格式。
您可以通过能作为自动化构建系统的一部分运行的编辑器脚本配置 Asset Delivery。
使用AssetPackConfig类定义需要包含在 Android App Bundle build 中的资源,以及这些资源的分发模式。这些资源包无需包含 AssetBundle。
在给定 BuildPlayerOptions 和 AssetPackConfig 的情况下,您还可以在 Bundletool 类中使用静态 BuildBundle 方法生成具有资源包的 Android App Bundle。
Unity打包AAB设置
可以在编辑器中直接设置打包AAB.
也可以通过代码控制自动打包脚本生成AAB
https://docs.unity3d.com/cn/2018.4/ScriptReference/EditorUserBuildSettings-buildAppBundle.html
也可以在项目中添加如下代码
//值为true表示打出aab包。
EditorUserBuildSettings.buildAppBundle = true;
这样按照Unity的打包流程就可以生成AAB包了。
AAb包不能直接按照到手机,这个时候咱们可以使用bundletool工具来生成APKS。
官网地址:
https://developer.android.google.cn/studio/command-line/bundletool
这是官网给出的方法:
bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks--ks=/MyApp/keystore.jks
--ks-pass=file:/MyApp/keystore.pwd
--ks-key-alias=MyKeyAlias
--key-pass=file:/MyApp/key.pwd
这是在我本机实际调试出的
java -jar "D:\Program Files\Unity\Editor\2019.4.17f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\bundletool-all-0.10.3.jar" build-apks --bundle="D:\Client_Android_AAB_depot\UnityProject\Build\Android\Makeup_Your_Story_64.aab" --output="D:\Client_Android_AAB_depot\UnityProject\Build\Android\Makeup_Your_Story_64.apks" --ks="D:\Client_Android_AAB_depot\UnityProject\user.keystore" --ks-pass=pass:"111111" --ks-key-alias="111111" --key-pass=pass:"111111"
APKS转成APK才能方便咱们安装。
官网给出的命令是这样的。
bundletool install-apks --apks=/MyApp/my_app.apks
其实把apks的后缀改成rar解压后能看到里面有好几个apk文件
下面是我写的自动解压脚本
copy D:\Client_Android_AAB_depot\UnityProject\Build\Android\Makeup_Your_Story_64.apks D:\Client_Android_AAB_depot\UnityProject\Build\Android\Makeup_Your_Story_64.zip
set zip="C:\Program Files\7-Zip\7z.exe"
%zip% e D:\Client_Android_AAB_depot\UnityProject\Build\Android\Makeup_Your_Story_64.zip -oD:\Client_Android_AAB_depot\UnityProject\Build\Android\
del D:\Client_Android_AAB_depot\UnityProject\Build\Android\Makeup_Your_Story_64.zip
del D:\Client_Android_AAB_depot\UnityProject\Build\Android\base-arm64_v8a.apk
del D:\Client_Android_AAB_depot\UnityProject\Build\Android\base-armeabi_v7a.apk
del D:\Client_Android_AAB_depot\UnityProject\Build\Android\base-master.apk
del D:\Client_Android_AAB_depot\UnityProject\Build\Android\toc.pb
pause
这样咱们就完成了了解AAB,使用AAB,以及怎样安装AAB的一个大概流程。