首先介绍一下出现问题的背景:

最近在做应用升级的时候由于在新版本中proguard-rules.pro新增了一些混淆配置,在旧版本升级到新版本进入应用的时候小米手机就会报如下错误:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'xiaomi/cactus/cactus:8.1.0/O11019/9.1.17:user/release-keys'
Revision: '0'
ABI: 'arm'
pid: 396, tid: 510, name: AWCN Scheduler1  >>> 此处为应用包名 <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'java_vm_ext.cc:534] JNI DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception java.lang.NoSuchMethodError: no non-static method "Lorg/android/spdy/SpdyAgent;.spdySessionConnectCB(Lorg/android/spdy/SpdySession;Lorg/android/spdy/SuperviseConnectInfo;)V"'
    r0 00000000  r1 000001fe  r2 00000006  r3 00000008
    r4 0000018c  r5 000001fe  r6 89219074  r7 0000010c
    r8 00000000  r9 a4319368  sl 0000000a  fp 892190c0
    ip 972e59e0  sp 89219060  lr a4ec18bd  pc a4ebb40e  cpsr 200b0030

backtrace:
    #00 pc 0001a40e  /system/lib/libc.so (abort+63)
    #01 pc 0035ca45  /system/lib/libart.so (art::Runtime::Abort(char const*)+392)
    #02 pc 0041fe2d  /system/lib/libart.so (android::base::LogMessage::~LogMessage()+452)
    #03 pc 0024e545  /system/lib/libart.so (art::JavaVMExt::JniAbort(char const*, char const*)+1212)
    #04 pc 0024e6c7  /system/lib/libart.so (art::JavaVMExt::JniAbortV(char const*, char const*, std::__va_list)+58)
    #05 pc 000d6403  /system/lib/libart.so (art::ScopedCheck::AbortF(char const*, ...)+42)
    #06 pc 000d5f83  /system/lib/libart.so (art::ScopedCheck::CheckThread(_JNIEnv*)+274)
    #07 pc 000d492d  /system/lib/libart.so (art::ScopedCheck::Check(art::ScopedObjectAccess&, bool, char const*, art::JniValueType*)+596)
    #08 pc 000d79e9  /system/lib/libart.so (art::CheckJNI::GetMethodIDInternal(char const*, _JNIEnv*, _jclass*, char const*, char const*, bool)+464)
    #09 pc 000c9365  /system/lib/libart.so (art::CheckJNI::GetMethodID(_JNIEnv*, _jclass*, char const*, char const*)+20)
    #10 pc 00003657  /data/app/此处为应用包名-K2pKM3UWvCbPitz1xjJr7A==/lib/arm/libtnet-3.1.11.so
    #11 pc 00004a0d  /data/app/此处为应用包名-K2pKM3UWvCbPitz1xjJr7A==/lib/arm/libtnet-3.1.11.so
    #12 pc 0003d0cd  /data/app/此处为应用包名-K2pKM3UWvCbPitz1xjJr7A==/oat/arm/base.odex (offset 0x3b000)

这个崩溃日志是小米系统直接捕获的,但是我应用里通过实现 UncaughtExceptionHandler 确不能捕获这个异常,通过上面日志exception java.lang.NoSuchMethodError能看出这个确实是由于混淆导致的无法找到应用方法出现的问题,但是这个问题在其他手机上(华为、oppo、nubia)并不会出现。

通过测试发现在小米手机上出现此问题之后,到设置-应用管理里面找到该应用清除应用数据,之后应用又神奇般的能正常使用了,再结合上面日志里面出现的data/app/应用包名/lib/***.so,由此推断小米系统在覆盖安装或升级新版本应用的时候如果老版本和新版本存在相同库文件并不会重新加载进系统导致新版本安装之后用的还是老版本加载的库文件,然而新版本由于新增了混淆而与老版本的缓存文件之间没有必要的关联,从而导致找不到方法名而报错。至于为什么只有小米系统出现这个问题,这个也许是小米手机系统应用安装的机制跟其他厂商不一样。

解决方法:

根据上面分析,在新版本进入应用初始化的时候对应用缓存进行一次清理,在系统检测到没有缓存之后就会重新加载新的文件;
主要清除的缓存文件路径就是:getFilesDir().getParent(); 在这个路径下有一些文件夹如:/lib、/databases、/shared_prefs...
/databases下面保存的db数据库文件,/shared_prefs下面保存的是SharePreference数据,这两个文件下面的文件保存着用户数据,可以不用删除或者选择性删除,删除代码如下:

public static void deleteFolder(File file) {if (!file.exists())return;if (file.isDirectory()) {File files[] = file.listFiles();for (int i = 0; i < files.length; i++) {if(files[i].getAbsolutePath().endsWith("/databases")){ //保存用户数据,不清除continue;}deleteFolder(files[i]);}}if(file.getAbsolutePath().endsWith("/shared_prefs/user_info.xml") ){Log.i("保存用户数据SharePreference,不清除");}else{file.delete();}SharePreferenceUtil.saveOrUpdateAttribute(context,MyConstants.USER_INFO, "dataCleared", true);  //保存已清除缓存状态
}

在Application 的onCreate()方法中调用删除

@Override
public void onCreate() {super.onCreate();if(!SharePreferenceUtil.getAttributeByKey(this,MyConstants.USER_INFO, "dataCleared",SharePreferenceUtil.VALUE_IS_BOOLEAN)){deleteFolder(new File(getFilesDir().getParent()));}
}

在删除SharePreference数据的时候,我只保留了自己创建的user_info.xml,其他的都删除了,因为在测试过程中发现如果保留整个/shared_prefs文件夹的话还是会报错,里面有一些友盟或者其他的三方库写进去的数据如果不清除的话也会报错,所已在这里我只保留了自己的数据。
这么一来由于混淆配置导致的新版本升级问题解决。

如有不同观点或文中错误,欢迎大神指正。

小米手机混淆升级崩溃记录与解决相关推荐

  1. 小米手机调试总是出现INSTALL_CANCELED_BY_USER的解决办法

    小米手机调试总是出现INSTALL_CANCELED_BY_USER的解决办法 出现原因 后续问题 出现原因 1.开发者选项未勾选usb安装以上完成后可正常使用usb调试,必须打开usb调试 后续问题 ...

  2. 小米5x显示连接不上服务器怎么办,MIUI8/小米手机连不上网怎么办?解决办法介绍...

    原标题:MIUI8/小米手机连不上网怎么办?解决办法介绍 []处于同一个网络环境下,别人的手机有网,自己的MIUI8/小米手机连不上网,那么碰到这种情况该怎么办呢,为了帮助大家,下面小编就给大介绍下M ...

  3. MIUI9开发版提前完成全系机型适配,近50款小米手机可升级

    9月8日,MIUI官方微博公布:"第三批MIUI 9开发版升级正式开始推送,比原计划提前两周!已累计支持近 50 款小米机型升级,包括:小米6.小米5X.红米Note4X(高通版).小米5. ...

  4. miui10.2.2 或以上的小米手机上照片旋转问题及解决

    问题描述 在miui10.2.2 或以上的小米手机上出现的问题:调用手机相册选取使用手机拍摄的照片时,对照片进行压缩处理后图片会出现旋转. 解决方法: 然后获取到旋转的角度,然后将图片旋转回来. 获取 ...

  5. 小米收到鸿蒙,小米手机收到升级“鸿蒙”提示,小米高管霸气回应

    阅读本文前,请您先点击上面的蓝色字体"小李聊科技",再点击"关注",这样您就可以免费收到最新内容了.每天都有分享,完全是免费订阅,请放心关注. 近几年的 国产手 ...

  6. 小米手机如何升级Android版本,MIUI官方公布小米手机升级Android Q计划

    原标题:MIUI官方公布小米手机升级Android Q计划 6月14日消息,谷歌在上个月的I/O大会向外界介绍了Android Q,首批适配Android Q beta 3的机型就包括小米MIX 3 ...

  7. 关于应用logo在小米手机上不显示新logo解决方式

    遇到这样的问题项目应用logo改变了,使用的是新的logo,别的手机上都没有问题,就是小米手机会存在问题:最后发现是这样的,小米手机上应用安装的时候先去小米应用商店上去获取商店中旧的图标然后替换掉清单 ...

  8. 小米手机无法打开USB调试,解决办法

    小米手机无法打开USB调试 今天拿小米做软件测试,发现明明已经安装了驱动,也打开了USB调试但是怎么也不能连接到电脑.(无法认证设备),试了很多办法都没解决问题,最后面瞎碰运气,把小米的MIUI优化关 ...

  9. 解决小米手机裁剪图片崩溃问题

    这里写自定义目录标题 github地址 https://github.com/JI577/ChoosePicture 调用方式 基本配置 权限 provider file_path 封装 BasePh ...

最新文章

  1. C语言新手写扫雷攻略3
  2. lstm原理_Mamp;DL | LSTM:遗忘门、记忆门、输出门
  3. 《Linux内核设计与实现》读书笔记(十七)- 设备与模块
  4. MyBatis入门HelloWorld,注解实现
  5. js异步解决方案 --- 回调函数 vs promise vs generater/yield vs async/await
  6. 9206 1225 mybank系统 随堂笔记
  7. light task schedule的定时任务实现源码解析
  8. 如何全局自动化注册异步组件?
  9. python热力图美化_python如何画热力图?
  10. 卧槽!我的IDEA中XML显示屎黄色,怎么去掉?
  11. FastJSON 简介及其Map/JSON/String 互转
  12. css垂直居中怎么设?文字上下居中和图片垂直居中
  13. 随机生成三位密码,然后穷举法破解密码
  14. 淘宝店铺运营,店铺访客增加但是浏览量减少这是为什么,应该怎样解决?
  15. 使用opencv批量裁剪保存图片
  16. Jrebel、IDEA的激活与Springloaded使用
  17. Python飞机大战(究极迫害版)
  18. 数据化管理 - 洞悉零售及电商运营【初始】
  19. linux_系统帮助propos/whatis/which/whereis/man/info/help...)/bashzsh/build-in command帮助/wildcard/regex
  20. Outlook里怎么设置网易企业邮箱【163企业邮箱注册】

热门文章

  1. 【解决方案】医院医疗安防视频监控系统搭建及集成统一管理方案介绍
  2. chrome与chromedriver版本对应关系以及官方下载页面
  3. Druid 索引服务的资源精细化调度
  4. Android第三方开发包值高德地图SDK使用介绍,android面试基础
  5. linux配置SVN,添加用户,配置用户组的各个权限教程
  6. linux服务器下搭建svn服务器仓库
  7. 今日学习在线编程题:竹鼠的白色季节
  8. python使用scrapy爬取图片
  9. 老师教我们用计算机画画就是彩虹,一年级上课文
  10. (新手向)零基础探究机器学习Crime_Prediction