美文网首页
解决问题:couldn't find DSO to load:

解决问题:couldn't find DSO to load:

作者: 小小小目标 | 来源:发表于2022-03-08 10:47 被阅读0次

1.SoLoader

    SoLoader是facebook推出的一个So文件加载库,它封装了System.loadLibrary并且能够处理so文件的依赖关系,React Native中就是用SoLoader加载相应的so。

Android应用所需要的So文件一般会被放在/data/data/package_name/lib,SoLoader会在/data/data/package_name/lib-main文件夹并根据规则提取apk中的so文件到里面。

SoLoader为了将自己的提取与加载逻辑与系统行为隔离开,特意创建了一个lib-main目录。

2.遇到的问题

有些手机厂商会定制应用安装器,比如蓝绿大厂的部分Android 5.x版本手机,当我们运行64位apk时就会崩溃,看下日志,丢了这么一串东西:

        "/data/data/http://com.xxx/lib-main/libc++_shared.so" is 64-bit instead of 32-bit

可以看到手机是64位的,但是需要加载32位so,SoLoader会在/data/data/com.xxx/lib-main放了64位库,系统的应用安装器会给/data/data/com.xxx/lib放了32位库,因为SoLoader默认加载优先级从高到低排序为:lib-main > lib > 系统lib,所以会导致加载了64位so,出现报错。

3.解决方法

SoLoader在版本0.10.3中修改了指令集优先级的排序,https://github.com/facebook/SoLoader/commit/b2555b82643e26d8830a876a64e43a040b4e3280,先读取lib文件夹下的so文件,判断是哪种指令,然后把这个指令集对应的so放到lib-main里面。

依赖SoLoader版本0.10.3,fresco版本1.13.0之后重新编译react-native

相关文章

网友评论

      本文标题:解决问题:couldn't find DSO to load:

      本文链接:https://www.haomeiwen.com/subject/brcarrtx.html