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

时间:2016-07-26 13:18:27

标签: android android-ndk shared-libraries abi nativelibrary

我需要过滤我的第3方派对本地库,只允许" armeabi"对于他们所有人。有一个例外! - 特定的图书馆必须包含在" armeabi-v7a"变种。

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

我最终想要的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"
}}}

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

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

这使应用程序工作,但也显着增加其大小。我们不想使用它。它允许armeabi-v7a版本的新库,但它也允许我们不想包含的一些其他库的armeabi-v7a版本。

问题:我们希望允许" armeabi-v7a"仅适用于我们的某个应用模块中的一个特定库。我们可以通过ABI过滤器或其他方式实现这一目标吗?

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

1 个答案:

答案 0 :(得分:2)

关于你必须提供每个lib的两个版本的最后一点 - 不,这仍然适用于armeabi和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设备上运行该应用程序会发生什么情况,根本不支持armeabi-v7a?在这种情况下,你根本就没有special -lib.so - 这是预期的吗?如果没有,你基本上已经为你的应用程序要求armeabi-v7a了,所以只需发布你所有库的armeabi-v7a版本。