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

问题描述

我的Android应用程序使用了一个自定义的本机库(用C ++编写),我为每种架构armeabi-v7aarm64-v8ax86x86_64进行了编译。支持64位本机库(arm64-v8a / x86_64)的Android的最早版本是API级别21,但具有32位本机库(armeabi-v7a / x86)我能够支持Android API级别16以下的设备。

由于API级别不同,并且由于编译的库很大,因此我为每种体系结构创建了一个特定的apk文件。因此,最终我有4个不同的apk文件,这些文件使我的应用程序几乎可以在API级别16以下的所有Android设备上运行。这种方法行之有效,并已记录在here中。构建这些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捆绑包格式,并且documentation当前处于声明状态

重要提示:2021年下半年,将需要新的应用与Android App Bundle一起在Google Play上发布。大于150 MB的新应用必须使用Play功能交付或Play资产交付。

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

我将如何创建一个最终与我现有的4个apk文件具有相同效果的Android捆绑软件?

解决方法

首先,有一种更简单的方法来实现您已经拥有的功能-双向拆分(请参阅https://developer.android.com/studio/build/configure-apk-splits)。此方法为您处理versionCode等。

如该页面上所述-最好为此目的使用应用程序捆绑包。应用程序捆绑包有两个主要目的-最小化(/优化)下载,并允许动态模块。首先,它使Google Play从本质上获取了包含所有内容的庞大应用程序捆绑包,并制作了一个较小的apk,仅包含正在询问的特定设备所需的内容。只有这个最小的APK才能下载到设备。

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

您可以使用bundletool(https://github.com/google/bundletool/releases)模拟并尝试应用捆绑包的工作方式(.aab格式),捆绑工具({{3}})根据Google 的规定,Google Play会使用它来处理应用包文件。

此外,您可以降低口味。那些只会挡在现在。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...