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