38.Android 运行崩溃找不到so包解决方案

场景

在开发过程中,领导要求更新项目中的OCR相关的SDK;遇到了以下问题:
新建了一个空项目,按照sdk集成文档,一步一步集成,OCR可以正常使用。
在自己公司项目中,按照sdk集成文档,一步一步集成,OCR可以打开闪退,报错:couldn't find "libAndroidIDCard.so
详细错误信息如下:

2019-01-15 10:57:40.199 18471-18471/com.ceshi E/AndroidRuntime: FATAL EXCEPTION: main
    Process: , PID: 18471
    java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.ceshi-2/base.apk", zip file "/data/app/com.ceshi-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.ceshi-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.ceshi-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.ceshi-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.ceshi-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.ceshi-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.ceshi-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.ceshi-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.ceshi-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.ceshi-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.ceshi-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.ceshi-2/lib/arm64, /data/app/com.ceshi-2/base.apk!/lib/arm64-v8a, /data/app/com.ceshi-2/split_lib_dependencies_apk.apk!/lib/arm64-v8a, /data/app/com.ceshi-2/split_lib_slice_0_apk.apk!/lib/arm64-v8a, /data/app/com.ceshi-2/split_lib_slice_1_apk.apk!/lib/arm64-v8a, /data/app/com.ceshi-2/split_lib_slice_2_apk.apk!/lib/arm64-v8a, /data/app/com.ceshi-2/split_lib_slice_3_apk.apk!/lib/arm64-v8a, /data/app/com.ceshi-2/split_lib_slice_4_apk.apk!/lib/arm64-v8a, /data/app/com.ceshi-2/split_lib_slice_5_apk.apk!/lib/arm64-v8a, /data/app/com.ceshi-2/split_lib_slice_6_apk.apk!/lib/arm64-v8a, /data/app/com.ceshi-2/split_lib_slice_7_apk.apk!/lib/arm64-v8a, /data/app/com.ceshi-2/split_lib_slice_8_apk.apk!/lib/arm64-v8a, /data/app/com.ceshi-2/split_lib_slice_9_apk.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]] couldn't find "libAndroidIDCard.so"
        at java.lang.Runtime.loadLibrary0(Runtime.java:984)
        at java.lang.System.loadLibrary(System.java:1554)
        at kernal.idcard.android.IDCardAPI.(IDCardAPI.java:10)
        at kernal.idcard.android.RecogService$recogBinder.(RecogService.java:92)
        at kernal.idcard.android.RecogService.onCreate(RecogService.java:1016)
        at android.app.ActivityThread.handleCreateService(ActivityThread.java:3392)
        at android.app.ActivityThread.-wrap5(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1740)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:159)
        at android.app.ActivityThread.main(ActivityThread.java:6364)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1096)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:883)

原因分析

在这个里面发现2个关键词:arm64-v8acouldn't find "libAndroidIDCard.so",当然,我没有在libs文件夹下面创建这个文件夹,因为集成所按照的官方SDK中并没有给出相应的so包。
当前库文件目录结构:

相关的目录结构

库文件目录的组织和官方给定的完全一致,不仅如此,当重新创建一个Project,新建Library与Module,完全按照现在的方式竟然是可以正常运行的,所以现在出错的原因就在于这两种方式的差异。

差异就是新建的工程里面只有OCR相关的so包,而公司当前的工程中则包含一些其他的so包,其中也加了有so文件。

公司项目中:多了arm64-v8a,且里面没有libAndroidIDCard.so包:
公司项目中:多了arm64-v8a,且里面没有libAndroidIDCard.so包

新建空项目中,有libAndroidIDCard.so包:
新建空项目中

可见,比我工程中多了几个文件夹,我想这就是问题的所在,根据查找顺序,64位处理器会优先查找arm64-v8a,里面如果没有相应的so文件就会报错。

解决方案

毕竟自己项目中自动生成的库文件夹中没有我们所需的so文件,所以按照上面的逻辑,就应该是阻止自动生成我们不需要的文件夹或者下载相关的so文件放到对应的文件夹下面。

鉴于实际情况,因此解决方案如下:
在Module(注意不是Library)的build.gradle文件中添加如下内容:

defaultConfig {
    ...
    ndk {
        abiFilters 'armeabi', 'x86'//, 'armeabi-v7a', 'x86_64', 'arm64-v8a', mips, mips64...加入需要生成的文件夹
    }
}

从新编译,程序就可正常使用了。解压缩后,就看不到arm64-v8a了。

公司项目中

补充

这句话的意思就是指定ndk需要兼容的架构,把除了armeabi和x86以外的兼容包都过滤掉。

你可能感兴趣的:(38.Android 运行崩溃找不到so包解决方案)