最近遇到一个问题在VIVO的一些型号上发生Crash, log 信息如下:
java.lang.UnsatisfiedLinkError:
couldn't find DSO to load: libreactnativejni.so
caused by: couldn't find DSO to load: libfb.so
caused by: couldn't find DSO to load: libgnustl_shared.so
caused by: dlopen failed: "/data/data/****/lib-main/libgnustl_shared.so" is 64-bit instead of 32-bit
原因分析
此问题引起Crash的主要原因
Android同时加载32位和64位so库出现问题,因为app在安装过程中,系统会对app进行解析根据so文件类型,如果有一个依赖库使用ARM64支持编译的扩展,而另外一些依赖库仅支持ARM32,就会出现问题。 系统将加载ARM64依赖,而拒绝加载仅ARM32的so库,就可能导致应用程序崩溃
问题解决
因为Android 32位和64位二进制混合加载容易出现问题,并且目前安卓设备绝大多数是 ARM 架构,armeabi-v7a支持大部分机型,因此对于大部分应用来说可以考虑去掉 x86 架构的支持(但是请注意模拟器大部分是 x86 架构,因此去掉 x86 架构后将无法在模拟器上运行)。
ndk {
// 设置支持的SO库架构
abiFilters 'armeabi-v7a'
}