如何将多个apk文件转换为一个统一的捆绑包

How to convert multiple apk files into a unified bundle

提问人:ackh 提问时间:8/29/2020 最后编辑:ackh 更新时间:9/7/2020 访问量:907

问:

我的 Android 应用程序使用自定义本机库(用 C++ 编写),我为每个体系结构、 和 编译。支持 64 位本机库 ( / ) 的最早 Android 版本是 API 级别 21,但使用 32 位本机库 ( / ),我能够支持低至 Android API 级别 16 的设备。armeabi-v7aarm64-v8ax86x86_64arm64-v8ax86_64armeabi-v7ax86

由于这些不同的 API 级别,并且由于编译的库变得非常大,我为每个架构创建了一个特定的 apk 文件。因此,最终我有 4 个不同的 apk 文件,这使我的应用程序能够在几乎所有 Android 设备上运行,直到 API 级别 16。这种方法有效,并记录在这里。我构建这些 apk 文件的文件如下所示:build.gradle

android
{
  ...

  defaultConfig
  {
    minSdkVersion 16
    targetSdkVersion 29
    ...
  }

  flavorDimensions "abi"
  productFlavors
  {
    "ARM7"
    {
      dimension "abi"
      ndk.abiFilters 'armeabi-v7a'
      versionCode 160000 + android.defaultConfig.versionCode
      versionNameSuffix "-arm32"
    }

    "ARM8"
    {
      dimension "abi"
      ndk.abiFilters 'arm64-v8a'
      minSdkVersion 21
      versionCode 210000 + android.defaultConfig.versionCode
      versionNameSuffix "-arm64"
    }

    "x86"
    {
      dimension "abi"
      ndk.abiFilters 'x86'
      versionCode 160000 + android.defaultConfig.versionCode
      versionNameSuffix "-x86"
    }

    "x86-64"
    {
      dimension "abi"
      ndk.abiFilters 'x86_64'
      minSdkVersion 21
      versionCode 210000 + android.defaultConfig.versionCode
      versionNameSuffix "-x64"
    }
  }

  ...
}

现在,Google 推送了新的 Android Bundle 格式,文档目前指出

重要提示:在 2021 年下半年,新应用必须与 Android App Bundle 一起在 Google Play 上发布。如果新应用的容量大于 150 MB,则必须使用 Play 功能配送或 Play 素材资源配送。

因此,在某些时候,我将不得不将我的多 apk 方法转换为新的 Android Bundle 格式,但我基本上不知道这应该如何工作。虽然我的每个 apk 文件都包含自己的清单和自己的版本号,而 Android Bundle 包含一个统一的清单。minSdkVersion

我如何能够创建一个最终与我现有的 4 个 apk 文件具有相同效果的 Android Bundle?

安卓 Android-gradle-plugin APK android-app-bundle

评论


答:

0赞 Dellkan 9/7/2020 #1

首先,有一种更简单的方法可以实现你已经拥有的东西——splits-on-abi(见 https://developer.android.com/studio/build/configure-apk-splits)。此方法为您处理 versionCode 等。

如该页面上所述 - 现在最好将 app bundle 用于此目的。App bundle 有两个主要目的 - 缩小(/优化)下载,并允许动态模块。第一位使得 Google Play 基本上会占用包含所有内容的巨大应用程序包,并制作一个较小的 apk,仅包含请求的特定设备所需的内容。只有这个最小的apk才会下载到设备上。

因此,总结一下:您将一个大型应用程序包上传到 Google Play,其中包含适用于所有设备的所有内容。然后,Google Play 会构建仅包含所需内容的最小 apk,并仅将这些 apk 下载到设备上。从技术上讲,Google Play会创建一个下载的文件,这本质上是一个带有多个.apk文件的zip文件,遵循以下格式:app bundle apks format但这主要只是一个您无需担心的实现细节。.apks

您可以使用 bundletool (https://github.com/google/bundletool/releases) 模拟和试用 app bundle 的工作方式(格式),根据 Google 的说法,这是 Google Play 用来处理 app bundle 文件的工具。.aab

此外,您可以删除口味。这些现在只会碍事。

评论

0赞 ackh 9/8/2020
我了解 Android App Bundle 的部分。这就是目标,从 .apk 文件转向捆绑包。我不清楚的是,最终从捆绑包生成的所有 .apk 文件都是 16,即使对于具有 64 位本机库的文件(使用 bundletool 验证)。但是,支持 64 位的 Android 的最低 API 级别是 21,而不是 16。除非有 Google Play 机制阻止在低于 API 级别 21 的任何内容上推出 64 位 .apk 文件,否则存在问题。所以,问题归结为:有这样的机制吗?minSdkVersion
0赞 Dellkan 9/8/2020
设备有责任报告它们支持哪些 abi,并且只有那些通过网络发送。
1赞 Dellkan 9/8/2020
在我看来,这是有效的方法之一。您无需根据 abi(或任何其他资源)手动处理 minSdkVersion。设备将指定它支持的任何内容,然后发送这些内容。我相信这包括来自平台或平台版本的限制。我认为您可能应该先尝试捆绑包,而无需任何特殊处理。只是默认的所有内容,看看它是否像你想要的那样工作。我很确定您正在尝试解决一个实际上不存在的问题。
0赞 ackh 9/9/2020
您可能是对的,Google Play 需要以某种方式自行处理这个问题。我看不出自己有任何选择.我还没有准备好上传和测试捆绑包,这就是我决定问这个问题的原因。无论如何,谢谢。minSdkVersion
1赞 Dellkan 9/9/2020
您可以在 Google Play 上使用封闭式 Alpha 曲目,以便在不发布的情况下对其进行测试。或者,您可以使用 bundletool cli 在本地计算机上测试这一切。 两者都只是简单的 zip 文件——因此您可以使用 Gradle 生成内容,通过 bundletool 运行它,然后以 zip 文件的形式检查输出以查看设备上的实际结果.apk.aab.apks