一个UnsatisfiedLinkError错误和它解决办法

问题

在vivo X5Pro手机上,点击微博登录时出现崩溃。
经过分析发现是微博依赖的so库在该设备上缺失导致的。

原因

vivo X5Pro手机cpu架构为arm64-v8a,在app对应的arm64-v8a目录下没有提供微博分享的so库,按照android so库的加载规则:如果应用存在和设备cpu架构一致的lib库就使用该lib,否则去找其他兼容库。即当app存在arm64-v8a目录,设备为arm64-v8a架构时,默认就会从arm64-v8a目录下拷贝库到app安装目录,一旦该架构目录下so库不完全,就会造成运行时崩溃。
具体见android官方文档

解决办法

解决办法是app中尽量使用一个目录库(选择通用的abi库),并保证该目录下so库完整。具体办法:

在build.gradle文件中增加设置(使用armeabi-v7a 和 armeabi,保证应用中这两个库是完备的):

android{
 defaultConfig{
       ...
        ndk {
          abiFilters "armeabi-v7a","armeabi"
       }
  }
}

在gradle.properties中增加一条设置

android.useDeprecatedNdk=true

业界方案

研究过微信、qq的lib目录,发现它们的app内只有一个armeabi目录,这样就避免了这个问题。
但在这个目录中会通过后缀_v7a这种方式区分出armeabi-v7a库,预计会在加载时根据不同的架构动态区分,感觉这是一个即保证效率同时又规避android lib坑的办法。

你可能感兴趣的:(一个UnsatisfiedLinkError错误和它解决办法)