前提:
软件的视频模块以海康萤石云SDK为基础开发。
之前开发时虽然配置 targetSdkVersion=28 ,但是一直是使用Android 6.0/7.0的系统进行调试。最近在使用9.0系统测试时发现视频模块一点击进入播放就会发生闪退,于是对这个模块进行修复。

经过调试发现,发生闪退是因为:缺少libstlport_shared.so(具体报错信息就不粘贴了)。好吧,自己对so库完全不了解,不知从何下手,只能去网上搜索一下看看这个so库有没有可以下载。经过搜索发现,这个so库是armeabi-v7a架构特有的,因为模拟器是x86系统,不能应用arm架构下的so库文件,所以发生报错。

模拟器不行,就只能拿自己的手机测试了。首先看一下自己的手机是不是armeabi-v7a架构(使用adb shell getprop ro.product.cpu.abi命令查看)

android 后台 打开闪退 android闪退是因为什么原因_闪退


自己的手机比模拟器好的一点是不用转架构(根本转不了,Genymotion-ARM-Transaction包根本没用),但也不是armeabi-v7a架构。到萤石云的开发平台看了一下最新的SDK,支持Android 9.0 、支持arm64-v8a,真是一个好消息。

android 后台 打开闪退 android闪退是因为什么原因_android 后台 打开闪退_02


android 后台 打开闪退 android闪退是因为什么原因_海康萤石云视频_03

进入app的build.gradle将原来的依赖包版本替换为最新的2.1和4.8.8

android 后台 打开闪退 android闪退是因为什么原因_Android_04


编译发生报错:程序包javax.validation.constraints不存在,原来的 ezviz-sdk:4.8.4 版本中是包含了 javax.validation.constraints 包的,在两个类中引用的 @NonNull 注解属于这个包。但这个错误不是大问题,我们将 @NonNull 的引用包改为 org.jetbrains.annotations.NotNull 即可。

android 后台 打开闪退 android闪退是因为什么原因_闪退_05

再次编译,发生报错:

android 后台 打开闪退 android闪退是因为什么原因_海康萤石云视频_06

这个错误问题可就大了,用了各种方法均不行,看到别人的博客说考虑是否为依赖冲突,自己看了一下导入的依赖,没有重复的。好吧,试着去看一看依赖树(使用gradlew -q app:dependencies命令查看),看了半天也没看出啥问题,试着去统一引用包的版本号,也不行。

最后看了别人的一篇文章,说是因为其中一个依赖A会引用另一个依赖B,但是自己引用的依赖B的版本和依赖A中的版本不一致,导致冲突。回头看了一下记录的依赖的版本,ezuikit:2.1 会用到 ezviz-sdk:4.8.3 ,和自己引用的 ezviz-sdk:4.8.8 的版本发生了冲突。看来是找到了原因。

既然冲突,则试着删除 ezviz-sdk:4.8.8 (不可行,删除后仍然闪退)、删除 ezuikit:2.1 (,不可行,删除后EZUIPlayer类不可用)、回退 ezuikit至2.0版本(不可行,仍然使用 ezviz-sdk:4.8.3)。既然都不行,那就试着直接下载SDK安装吧,不让APP自动下载了。

在萤石云开发平台下载EZUIKit_Andnroid_v2.1.build20190617.zipAndroid_v4.8.8.build20190723.zip两个包,按照说明文档将lib目录下的jar包以及armeabi-v7a、arm64-v8a目录下的内容均拷贝至app下的libs目录

android 后台 打开闪退 android闪退是因为什么原因_Android_07


在build.gradle中删除对萤石云SDK的引用,按照说明文档开启NDK过滤:

android 后台 打开闪退 android闪退是因为什么原因_Android_08


编译通过,调试时发生闪退,原因为NoClassDefFoundError: Failed resolution of: Lorg/apache/http/impl/client/DefaultHttpClient,这个在萤石云的SDK接入文档中有写,在AndroidMenifest.xml中加入如下代码:

<uses-library
    android:name="org.apache.http.legacy"
    android:required="false" />

编译执行,成功修复该BUG。