我有一个 .aar,其中包括一些本机 .so。 Andrid 项目 B 实现了这个 .aar,如下所示:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation(name: 'abcd', ext:'aar')
implementation(name: 'somethingelse', ext:'aar')
}
在Android项目B中,当我使用android.tools.build:gradle 3.4.0和3.5.0时,一切正常。但是当我在根 gradle 中更改为 3.6.0 时:
dependencies {
classpath 'com.android.tools.build:gradle:3.6.0' // dont work
classpath 'com.android.tools.build:gradle:3.4.0' // works fine
}
运行时出现错误,例如:
2021-05-24 20:41:55.723 6064-6153/com.xxxx.xxxxx A/xxxx: java_vm_ext.cc:577] JNI DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception java.lang.UnsatisfiedLinkError: dalvik.system.DexClassLoader[DexPathList[[zip file "/data/app/~~tqEwSNB6cPXs4GapbzXZzQ==/com.xxxx.xxxxx-TRHmC-RfgNxXwoU9Ax-Hrw==/base.apk"],nativeLibraryDirectories=[/data/app/~~tqEwSNB6cPXs4GapbzXZzQ==/com.xxxx.xxxxx-TRHmC-RfgNxXwoU9Ax-Hrw==/lib/arm64, /system/lib64, /system_ext/lib64]]] couldn't find "libcamera_lib.so"
java_vm_ext.cc:577] at void java.lang.Runtime.loadLibrary0(java.lang.ClassLoader, java.lang.Class, java.lang.String) (Runtime.java:1083)
java_vm_ext.cc:577] at void java.lang.Runtime.loadLibrary0(java.lang.Class, java.lang.String) (Runtime.java:1008)
java_vm_ext.cc:577] at void java.lang.System.loadLibrary(java.lang.String) (System.java:1664)
高亮度:
nativeLibraryDirectories=[/data/app/~~tqEwSNB6cPXs4GapbzXZzQ==/com.xxxx.xxxxx-TRHmC-RfgNxXwoU9Ax-Hrw==/lib/arm64, /system/lib64, /system_ext/lib64]]] couldn't find "libcamera_lib.so"
但是当我解压并检查 aar 甚至最终输出的 apk 时,我确实发现 cmera_lib.so 就在那里。
知道那里发生了什么吗?为什么更改 android.tools.build:gradle 会导致运行时出现 .so not find 错误,而 .so 就在 apk 内部?
3.6.0 中发生的变化是
android:extractNativeLibs
默认 已更改:
如果 AndroidManifest.xml 中未配置 extractNativeLibs,则默认值为“true”。但是,当使用 Android Gradle 插件 3.6.0 或更高版本构建应用程序时,如果未在 AndroidManifest.xml 中配置且 minSdkVersion >= 23,则此属性将重置为“false”。如果 minSdkVersion < 23 and extractNativeLibs is explicitly set to "false" in AndroidManifest.xml, you must add the following to your app's build.gradle file:
packagingOptions { jniLibs { useLegacyPackaging = false } }
问题是一些设备(例如小米)仍然不支持非提取的本机库。
我是这样解决的,通过在AndroidManifest.xml中配置应用程序节点 Android:extractNativeLibs="true",并且Gradle中不需要配置任何东西,所以再次运行不会报错。 我希望我能帮助你。
android:extractNativeLibs="true"