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

Android 如何允许特定本机库使用特定的ABI?,android,android-ndk,shared-libraries,abi,android-native-library,Android,Android Ndk,Shared Libraries,Abi,Android Native Library,我需要过滤我的第三方本地库,并且只允许所有库使用“armeabi”。只有一个例外特定库必须包含在其“armeabi-v7a”变体中 如何根据库的不同过滤我的第三方本机库?(或在应用程序模块上) 我在APK中最终想要的是: armeabi/lib-1.so armeabi/lib-2.so armeabi/lib-3.so armeabi-v7a/special-lib.so 完整故事: 我有一个内置了几个模块的应用程序。它使用一些第三方本机库。到目前为止,我们只使用所有库的“armeabi”

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

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

我在APK中最终想要的是:

  • armeabi/lib-1.so
  • armeabi/lib-2.so
  • armeabi/lib-3.so
  • armeabi-v7a/special-lib.so
完整故事:

我有一个内置了几个模块的应用程序。它使用一些第三方本机库。到目前为止,我们只使用所有库的“armeabi”版本,因为它们是最兼容的,而且我们的目标是低应用程序大小(没有多个APK)。但是,现在我们需要包括一个新的第三方库,它只能以“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/special-lib.so
如果在armeabi-v7a设备上安装,安装程序根本不需要也不会安装来自armeabi目录的文件。请参阅,以获取与此相同的权威消息来源。(在较旧的Android版本中存在安装程序错误,其中可能安装了一些armeabi LIB,但并非全部,具体取决于它们在APK中的打包顺序。有关详细信息,请参阅。但这只是错误,不是预期行为,而且仅在较旧的版本上。)


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

谢谢,我不知道在这种情况下,设备也只会从一个文件夹中选择LIB(好的,无论如何)。我计划处理设备采用armeabi体系结构的情况,并禁用armeabi-v7a库功能。我之所以想这样做是因为第三方LIB的可用性,我只是没有一个单一的体系结构。我觉得很奇怪。分发本机库的任何人都应该尽可能在所有体系结构中提供本机库……是的,理想情况下,库应该在所有体系结构中都可用,以便让应用程序开发人员选择要发布的库。尽管在实践中,可能还有其他原因不提供所有体系结构(例如,如果库是低级别的,并且您无法测试一些不太常见的体系结构,并且您有理由怀疑它是现成的)。对于您的情况,您可以将special-lib.so从armeabi-v7a移动到armeabi,并假装它是一个armeabi库,如果您通过运行时检查知道您不在armeabi-v7a上,请避免使用它。另外,在实践中,如果您主要针对较新的android版本,只需跳过armeabi并仅提供armeabi-v7a,您就失去了相当小的一部分用户群-请参见,例如,我可以将所有LIB从“armeabi”移动到“armeabi-v7a”文件夹吗?我指的是文件(在其armeabi版本中)与真实的armeabi-v7a文件共存于同一文件夹中。我测试了这个,它在我的案例中起作用。但是我担心潜在的问题(可能在特定设备上)。是的,您可以将LIB从armeabi移动到armeabi-v7a,这应该可以正常工作,在特定设备上没有问题。但是如果您这样做了,我建议您为armeabi-v7a重新构建lib(如果它是您可以自己构建的lib),因为这样做会提高性能。