1

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

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

我最终在我的 APK 中想要的是:

  • armeabi / lib-1.so
  • armeabi / lib-2.so
  • armeabi / lib-3.so
  • armeabi-v7a / special-lib.so

完整的故事:

我有一个内置在几个模块中的应用程序。它使用了一些 3rd 方本机库。到目前为止,我们只使用所有库的“armeabi”版本,因为它们最兼容,而且我们的目标是小应用程序大小(没有多个 APK)。但是,现在我们需要包含一个新的 3rd 方库,该库仅以“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 的情况下,没有这样的问题,您不必提供每个库的两个版本。

4

1 回答 1

3

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

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

  • armeabi / lib-1.so
  • armeabi / lib-2.so
  • armeabi / lib-3.so
  • armeabi-v7a / special-lib.so

如果在 armeabi-v7a 设备上安装它,安装程序不需要也不会安装 armeabi 目录中的文件。请参阅https://developer.android.com/ndk/guides/abis.html#aen以获得相同的权威来源。(在较旧的 Android 版本中存在安装程序错误,其中一些 armeabi 库可能已安装,但不是全部,具体取决于它们在 APK 中打包的顺序。请参阅https://stackoverflow.com/a/25648943/ 3115956有关详细信息。但这只是错误,不是预期的行为,并且仅适用于旧版本。)

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

于 2016-07-26T13:29:50.153 回答