1

我正在开发一个使用一些本机代码的 Android 应用程序。我使用的本机库有两种变体,一种用于 ARM v6 架构,一种用于 v7。因此,在我的 libs 文件夹中,我有两个文件夹,用于 v6 库的“armeabi”和用于 v7 库的“armeabi-v7a”。这里的主要问题是这个库大约是 8mb,所以当根据设备只需要这些库中的一个时,我有 16mb 的库 - 我有 8mb 的膨胀,这使得我的 apk 相当大。

如果我创建 2 个具有不同版本代码的单独 apk,一个带有 v6 lib,一个带有不同版本代码的 v7 lib,Google Play 无法识别这两个 apk 在设备支持方面的任何差异,并尝试用另一个替换一个.

我在讨论这个问题的地方看到了这个问题,但没有提供解决方案。

如何让 Google Play 让这两个 APK 一起发布?

任何帮助将非常感激。

4

4 回答 4

2

这(还)不可能。请参阅http://developer.android.com/guide/google/play/publishing/multiple-apks.html#SupportedFilters

支持的过滤器 [...]

  • OpenGL 纹理压缩格式 [...]
  • 屏幕尺寸(以及,可选的,屏幕密度)[...]
  • API 级别 [...]

其他启用 Google Play 过滤器的清单元素(但未在上面列出)仍照常应用于每个 APK。但是,Google Play 不允许您基于它们的变体发布多个 APK。因此,如果每个 APK 的上述过滤器相同(但 APK 会根据清单文件中的其他特征而有所不同),则您无法发布多个 APK。例如,您不能提供仅在特性上有所不同的不同 APK。

编辑:我想到的一种解决方案是基于插件的:您部署一个具有核心逻辑、UI 和所有这些东西的应用程序,并提供几个不同的“应用程序”,这些“应用程序”使用相同的证书签名,但只包含本机库。MXPlayer 使用这种方法来支持不同的架构,而不会使单个 APK 臃肿:https ://sites.google.com/site/mxvpen/download (参见“编解码器”部分)。

于 2012-07-13T12:23:59.933 回答
0

就我而言,我在同一个 APK 中编译了不同的库并对其进行了 Proguard,这有助于减小大小。但是同样的差异并不大,但它有所帮助。

此外,我不确定它是否适合您的需求,但如果您想拥有不同的 APK,我认为不同的包名称可以,但再次推荐将使用单个 APK。

那是我的一小部分信息,有关更多信息和帮助,请告诉我。

于 2012-07-13T12:23:29.277 回答
0

请参阅此链接 Options for Releaving Native Android* Apps for Intel® Architecture (x86)

Google Play 支持多个 APK 的 CPU 架构过滤

于 2014-06-04T06:04:51.023 回答
-1

现在可以了,请参阅此链接。

https://developer.android.com/studio/build/configure-apk-splits.html

更新 :

您需要在 android 标签内的模块级 build.gradle 中添加以下代码:

splits
{

        // Configures multiple APKs based on ABI.
        abi {

          // Enables building multiple APKs per ABI.
          enable true

          // By default all ABIs are included, so use reset() and include to specify that we only
          // want APKs for x86, armeabi-v7a, and mips.

          // Resets the list of ABIs that Gradle should create APKs for to none.
          reset()

          // Specifies a list of ABIs that Gradle should create APKs for.
          include "x86", "armeabi-v7a", "mips"

          // Specifies that we do not want to also generate a universal APK that includes all ABIs.
          universalApk false
        }
}

这将为您提供多个 apk 以针对不同的架构上传。根据安卓:

不同的 Android 手机使用不同的 CPU,这反过来又支持不同的指令集。CPU 和指令集的每种组合都有其自己的应用程序二进制接口或 ABI。ABI 非常精确地定义了应用程序的机器代码在运行时应该如何与系统交互。

另外,请记住使用不同的 versionCode 推送两个 apk。一种方便的方法是使用以下脚本,稍后在同一网址上提供:

// Map for the version code that gives each ABI a value.
ext.abiCodes = ['armeabi-v7a':1, mips:2, x86:3]

// For per-density APKs, create a similar map like this:
// ext.densityCodes = ['mdpi': 1, 'hdpi': 2, 'xhdpi': 3]

import com.android.build.OutputFile

// For each APK output variant, override versionCode with a combination of
// ext.abiCodes * 1000 + variant.versionCode. In this example, variant.versionCode
// is equal to defaultConfig.versionCode. If you configure product flavors that
// define their own versionCode, variant.versionCode uses that value instead.
android.applicationVariants.all { variant ->

  // Assigns a different version code for each output APK
  // other than the universal APK.
  variant.outputs.each { output ->

    // Stores the value of ext.abiCodes that is associated with the ABI for this variant.
    def baseAbiVersionCode =
            // Determines the ABI for this variant and returns the mapped value.
            project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))

    // Because abiCodes.get() returns null for ABIs that are not mapped by ext.abiCodes,
    // the following code does not override the version code for universal APKs.
    // However, because we want universal APKs to have the lowest version code,
    // this outcome is desirable.
    if (baseAbiVersionCode != null) {

      // Assigns the new version code to versionCodeOverride, which changes the version code
      // for only the output APK, not for the variant itself. Skipping this step simply
      // causes Gradle to use the value of variant.versionCode for the APK.
      output.versionCodeOverride =
              baseAbiVersionCode * 1000 + variant.versionCode
    }
  }
}

This goes below the splits code. This gives you multiple apks with your orignal version code multiplied by the architecture code given in abiCodes array in the script above. Eg : if your version code is 5, the mips builds code would be 2005. A universal apk will also be created if you universalApk is true in splits code. The can be a fallover apk in case no architecture build apk is found for a certain device.

于 2017-06-29T07:23:25.397 回答