小米手机混淆升级崩溃记录与解决

⼩⽶⼿机混淆升级崩溃记录与解决
⾸先介绍⼀下出现问题的背景:
最近在做应⽤升级的时候由于在新版本中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_: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/SuperviseConnectIn    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、/
/databases下⾯保存的db数据库⽂件,/shared_prefs下⾯保存的是SharePreference数据,这两个⽂件下⾯的⽂件保存着⽤户数据,可
寻星计算程序以不⽤删除或者选择性删除,删除代码如下:
public static void deleteFolder(File file) {
if (!ists())
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]);
}
巨磁阻传感器}
AbsolutePath().endsWith("/shared_prefs/l") ){
Log.i("保存⽤户数据SharePreference,不清除");
}else{
堵漏工具file.delete();
}
SharePreferenceUtil.saveOrUpdateAttribute(context,MyConstants.USER_INFO, "dataCleared", true);  //保存已清除缓存状态
}
在Application 的onCreate()⽅法中调⽤删除
@Override
public void onCreate() {
ccenterif(!AttributeByKey(this,MyConstants.USER_INFO, "dataCleared",SharePreferenceUtil.VALUE_IS_BOOLEAN)){
deleteFolder(new File(getFilesDir().getParent()));
}
}
在删除SharePreference数据的时候,我只保留了⾃⼰创建的l,其他的都删除了,因为在测试过程中发现如果保留整
个/shared_prefs⽂件夹的话还是会报错,⾥⾯有⼀些友盟或者其他的三⽅库写进去的数据如果不清除的话也会报错,所已在这⾥我只保留了⾃⼰的数据。
这么⼀来由于混淆配置导致的新版本升级问题解决。
如有不同观点或⽂中错误,欢迎⼤神指正。

本文发布于:2024-09-23 01:20:02,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/233682.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:版本   系统   问题   导致   缓存
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议