如何允许特定本机库的特定 ABI?

How to allow specific ABIs for specific native libraries?

我需要过滤我的第 3 方本机库,并且只允许 "armeabi" 所有这些库。除了一个例外! - 特定的库必须包含在其 "armeabi-v7a" 变体中。

如何根据库不同地过滤我的第 3 方本机库? (或在应用程序模块上)

我的APK最终想要的是:

全文:

我有一个内置几个模块的应用程序。它使用一些第 3 方本机库。到目前为止,我们只使用所有库的 "armeabi" 版本,因为它们最兼容,而且我们的目标是降低应用程序大小(没有多个 APK)。但是,现在我们需要包含一个新的第 3 方库,该库仅以 "armeabi-v7a" 形式提供。

我们一直在使用过滤器:

productFlavors {
        app {
            ndk {
                abiFilters "armeabi"
}}}

它位于主应用程序模块中。它从所有模块和库中过滤所有本机库。现在我们被迫使用这个过滤器:

productFlavors {
        app {
            ndk {
                abiFilters "armeabi", "armeabi-v7a"
}}}

这使应用程序正常运行,但也显着增加了它的大小。我们不想使用它。它允许新库的 armeabi-v7a 版本,但它也允许我们不想包含的其他几个库的 armeabi-v7a 版本。

问题: 我们只想允许 "armeabi-v7a" 驻留在我们的应用程序模块之一中的一个特定库。我们可以通过 ABI 过滤器或其他方式实现吗?

关于 64 位的注意事项: 我知道如果您有任何 64 位本机库,您需要拥有所有这些库(因为如果应用程序找到一个 64-位库,它将以 64 位模式启动,将无法使用 32 位库)。但是,在 armeabi 与 armeabi-v7a 的情况下,没有这样的问题,您不必提供每个库的两个版本。

关于您关于必须提供每个库的两个版本的最后一点 - 不,这仍然适用于 armeabi 与 armeabi-v7a。

给定一个包含您列出的文件的 APK:

  • armeabi/lib-1.so
  • armeabi/lib-2.so
  • armeabi/lib-3.so
  • armeabi-v7a/特殊-lib.so

如果在 armeabi-v7a 设备上安装它,安装程序根本不需要,也不会从 armeabi 目录安装文件。有关详细信息,请参阅 https://developer.android.com/ndk/guides/abis.html#aen for an authoritative source saying the same. (There have been installer bugs in older Android versions, where some of the armeabi libs may have been installed, but not all, depending on which order they are packaged in the APK. See 。但这只是错误,不是预期的行为,而且仅适用于旧版本。)

此外,如果您 运行 完全不支持 armeabi-v7a 的 armeabi 设备上的应用程序会怎样?在那种情况下,您根本不会有 special-lib.so 可用 - 这是预期的吗?如果没有,您的应用基本上已经需要 armeabi-v7a,因此只需发布所有库的 armeabi-v7a 版本。