【问题标题】:Defining ABI version Android Studio when using SDK使用 SDK 时定义 ABI 版本 Android Studio
【发布时间】:2017-11-28 21:46:18
【问题描述】:

两周前,我将我的 Android 应用的新版本上传到开发者控制台以运行 Alpha 测试。但是,我无法在我的测试设备上下载此测试版本,因为 Play 商店没有向我的测试用户提供此类更新。

在我无法解决这个问题here 后,我直接联系了 Google 开发者支持。

我现在收到以下回复:

我调查了您的问题,发现您的应用的版本 15 与 Nexus 5 不兼容,因为您的应用清单与以下原生平台存在冲突:armeabi、armeabi-v7a。

有关平台的更多信息,请访问我们的开发者网站https://developer.android.com/ndk/guides/abis.html

这很令人困惑。据我了解链接页面上的信息,ABI 设置仅在使用NDK 时可用/相关。但是我正在使用Android Studio 2.1 中的最新SDK 版本

是否可以在使用 SDK 时设置/定义 ABI 版本?

App Manifest 不包含任何与 ABI 版本相关的设置。

当我手动将 APK 复制到我的设备(运行 Android 4.4.4 的 Nexus 5)并安装它时,它运行没有任何问题。那么,APK 真的不兼容我的设备吗?

编辑:

user1056837 的评论启发,我找到了this page,它描述了如何将NDK 块添加到build.gradle 文件:

android {
    ...

    ndk {
        // All configurations that can be changed in android.ndk.
        ...
    }

    productFlavors {
        create("arm") {
            ndk {
                // You can customize the NDK configurations for each
                // productFlavors and buildTypes.
                abiFilters.add("armeabi-v7a")
            }
        }

        create("fat") {
            // If ndk.abiFilters is not configured, the application
            // compile and package all suppported ABI.
        }
    }
}

目前我的build.gradle 文件包含任何 NDK 配置。我不确定,如何通过添加这样的配置来解决 Play 商店的问题。

据我了解链接页面上的信息,将创建一个没有配置abiFilters胖二进制文件。对吗?

那么以下一项应该是正确的:

  1. 我的项目确实在我不知情的情况下包含一些本机代码。在这种情况下,会创建一个胖二进制文件,因为我的 build.gradle 文件确实包含任何 NDK 配置。
  2. 我的项目包含任何隐藏的本机代码。在这种情况下,NDK 配置根本不会产生任何影响。

我在这里错过了什么吗?无论哪种情况是正确的,在这两种情况下我都不知道什么配置可以解决问题...

【问题讨论】:

  • 应用程序清单不提供支持什么 ABI 的信息,它只能通过检查 apk 文件中存在哪些类型的本机库来查看(在带有 cygwin 的 Windows 上,我这样做单线检查:aapt l example.apk | grep .so)
  • 我正在使用 OS X,但无法使用 appt 命令。我会试着弄清楚这一点。但正如问题中所说,我不确定 ABI 版本是否真的是问题的根源。我发现的所有信息仅在与NDK 一起使用时才相关,但我使用的是Java SDK。 Java 创建独立于平台的字节码。为什么在这种情况下二进制版本应该是相关的?
  • 可能某些第三方库正在向您的应用程序添加特定于架构的二进制文件。如果找不到 aapt,请将 APK 作为 zip 文件打开,并查看 lib 文件夹中是否有任何包含 .so 文件的子文件夹。
  • @ph0b 感谢您的提示。但是,APK 内的lib 文件夹 包含任何.so 文件。此文件夹中只有一个文件,即commons-io-2.4.jar,即org.apache.commons.io lib。所以,.so 文件不走运。任何其他想法如何检查我的 APK 中是否有任何 NDK 问题?我仍然不相信谷歌在这方面是正确的......
  • 只需将您的build.gradle文件ndk-block添加到android->defaultConfig部分并手动设置abiFilters

标签: android android-studio android-ndk


【解决方案1】:

也许为时已晚,但尽管如此: 我有同样的问题。它在第三方库中。当我的应用程序开始构建时,bitcoinj 库在/lib/x86_64/darwin/libscrypt.dylib folder 中创建了一个本机脚本。我只是在 build.gradle 文件中排除了这个文件夹。

packagingOptions {
    exclude 'lib/x86_64/darwin/libscrypt.dylib'
}

之后一切正常。我的应用现在支持 5900 台设备。

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 2013-05-17
    • 1970-01-01
    • 2018-04-10
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2022-01-07
    相关资源
    最近更新 更多