Gradle 在设备上找不到但存在于 apk 中的本机库

Gradle native libraries not found on device but present in apk

我的应用程序使用 Here SDK and Twilio SDK。两者都使用本机库(这里的 SDK 具有从 /libs 和 /jniLibs 文件夹本地插入的本机库,Twilio SDK 从 jCenter 插入)。但是在 Android 5.1 Here SDK 抛出异常 "MISSING LIBRARIES: libMAPSJNI.so" 尽管这个库出现在结果 APK 中。我打开了我的程序安装在设备上的文件夹,并在两种情况下比较了内容:有或没有 Twilio SDK。不同之处在于当连接 Twilio API 文件夹 /lib 是一个文件,并且由于显而易见的原因,加载程序无法看到它里面的本地库需要初始化 Here SDK。如果删除 Twilio gradle 依赖项,程序集将正常进行。可能是什么原因以及如何解决?如果需要,我可以用这些库附加测试项目

您需要像这样修改您的build.gradle

android {
    (...)
    splits {
        abi {
            enable true
            reset()
            include 'armeabi-v7a'
            universalApk false
        }
    }
    (...)
}

可能是因为Twilio SDK支持x86,而HERE SDK目前不支持。

通过定义一个 splits 块你可以告诉 Gradle 创建 APKs for each listed ABI:

include "armeabi", "armeabi-v7a", "x86", "mips"

或者,您可以通过添加以下过滤器将所有需要的 ABI 包含到 one APK 中:

android {
(...)
defaultConfig {
    (...)
    ndk {
        // allow only 32bit *.so libs
        abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
    }
}

}

这两种方法都将排除可能与 32 位 HERE SDK 冲突的 64 位功能,但后者将通过单个 APK 支持更多设备。

一些库,例如新的 Android Room Persistence 库,添加了 32 位版本以及两个 64 位 ABI 版本 arm64-v8ax86_64。由于 HERE SDK 目前仅提供 32 位库,因此排除 64 位库变体应该是安全的。另一方面,预计 64 位设备可以优雅地处理 32 位库。