集成阿里热修复找不到so的问题

时间:2022-10-11 18:36:56

集成阿里AndFix热修复的过程很简单,但是其中可能会遇到一些错误,比如so库的问题:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/-2/base.apk"],nativeLibraryDirectories=[/data/app/-2/lib/arm64, /data/app/com.ccipa.wlw-2/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "libutility.so"

原因是我们的项目集成了别人的库而且使用到了so库,一般情况下只需要armeabi-v7a的so或者armeabi、arm64-v8a就可以了。我的项目是只用了v7a的so,其他的都没有使用,然后在初始化AndFix时遇到上面的错误,很明显是找不到arm64-v8a下面的so。所以我就在jniLibs下创建了arm64-v8a文件夹,然后把v7a包下的so拷贝了一份放在了里面,然后接着运行,这时发现又出现了如下的问题:
java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/-1/lib/arm64/libutility.so" is 32-bit instead of 64-bit
发现是abi架构64bit的问题,那就过滤掉64bit的文件,全部使用32bit的,把新建的arm64-v8a的文件以及so再删除掉,在gradle中添加:
 
android {

    defaultConfig {
        
        ndk {
            abiFilters "armeabi-v7a"
        }
    }

 再次运行,发现不在出现问题,饶了一小圈,文件没有任何变化,只是在gradle添加了过滤。 

这里说明一下,如果你的项目中依赖了别人的库,并且添加了so文件,比如只添加了v7a的so,则在gradle中添加过滤时只能是

 
android {

    defaultConfig {
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
}

 

如果还有其他处理架构,如写成:

defaultConfig {
        ndk {
            abiFilters "armeabi-v7a", "armebi", "arm86-v8a", "x86"
        }
    }
则必须要添加对应架构下的so,否则仍然会出现找不到so的问题。