问题

近期在开发过程中,突然出现混淆后程序出现运行时异常,编译是正常的,不混淆也是正常的, 错误信息如下提示

12-07 14:10:27.056 10603-10603/? E/AndroidRuntime: FATAL EXCEPTION: mainjava.lang.RuntimeException: Unable to instantiate application com.xzxj.frame.base.BaseApplication: java.lang.ClassCastException: com.xzxj.frame.base.BaseApplication cannot be cast to android.app.Applicationat android.app.LoadedApk.makeApplication(LoadedApk.java:587)at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4891)at android.app.ActivityThread.-wrap1(ActivityThread.java)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1530)at android.os.Handler.dispatchMessage(Handler.java:111)at android.os.Looper.loop(Looper.java:207)at android.app.ActivityThread.main(ActivityThread.java:5692)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)Caused by: java.lang.ClassCastException: com.xzxj.frame.base.BaseApplication cannot be cast to android.app.Applicationat android.app.Instrumentation.newApplication(Instrumentation.java:1001)at android.app.Instrumentation.newApplication(Instrumentation.java:986)at android.app.LoadedApk.makeApplication(LoadedApk.java:582)at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4891) at android.app.ActivityThread.-wrap1(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1530) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:5692) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)

思路

1、通过上面的错误信息首先会去排查AndroidManifest.xml文件是否注册了Appliction,发现都是注册好的。 2、考虑到关闭混淆正常,开启混淆异常,那么就定位到时混淆的问题 3、既然是混淆问题那就查看混淆配置文件proguard-rules.pro,基本的配置都已经防混淆了 4、接下来的思路就是通过反编译来查看BaseApplication到底出了啥额问题

过程

第一步

我们看到下面反编译的代码

我们的BaseApplication继承的application被混淆了 那么在’proguard-rules.pro’中加入一句-keep class android.app.**{*;}

运行后报错如下:

12-10 15:16:07.442 15939-15939/? E/AndroidRuntime: FATAL EXCEPTION: mainjava.lang.VerifyError: Rejecting class com.xzxj.frame.base.BaseApplication because it failed compile-time verification (declaration of 'com.xzxj.frame.base.BaseApplication' appears in /data/app/com.xzxj-1/base.apk:classes2.dex)at java.lang.Class.newInstance(Native Method)at android.app.Instrumentation.newApplication(Instrumentation.java:1001)at android.app.Instrumentation.newApplication(Instrumentation.java:986)at android.app.LoadedApk.makeApplication(LoadedApk.java:582)at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4891)at android.app.ActivityThread.-wrap1(ActivityThread.java)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1530)at android.os.Handler.dispatchMessage(Handler.java:111)at android.os.Looper.loop(Looper.java:207)at android.app.ActivityThread.main(ActivityThread.java:5692)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)

看到错误信息变化了,心里应该开心,看来离解决问题更近一步了。

第二步

我们继续反编译,看到继承的接口还是有问题的,虽然感觉不是这个引起的但是强迫症,把接口防混淆,加入如下代码: -keep interface com.xzxj.frame.** { *; }

第三步

运行后依然是同样的错误信息,反编译后代码如下:

此时对比代码分析,应该是如下问题造成的, 混淆前:

public static Context getBaseApplication() {return instance;
}

混淆后:

public static j a()
{return b;
}

看来Context也被混淆了,接下来在’proguard-rules.pro’中加入一句-keep class android.content.**{*;}

第四步:

接下来就是见证奇迹的时刻,果然运行正常,我们看一下混淆后的代码

结论

综上,我们可以分析出来是我们的android包下面的文件都被混淆了,于是我们把-keep class android.content.**{*;}-keep class android.app.**{*;}合二为一-keep class android.**{*;} 不过按照道理来讲这个不应该被混淆,系统会做处理,猜测可能是某个配置导致系统的一些配置失效,至于该工程为啥这么奇葩待后续分析。

所以以后遇到混淆的问题就按照提示一步一步排查,一定要反编译文件来分析问题,不然无法定位原因。

还有第一次混淆后建议反编译查看一下包里面的代码,有没有需要混淆的核心代码被keep掉了。

加群:Android进阶群 4112676  可以免费获取下方资料哦

Android 混淆问题排查相关推荐

  1. Android混淆大法

    Android混淆大法 本文涉及内容: 1.混淆的基本介绍,混淆的基本配置及示例 2.如何进行多模块的混淆 3.实际项目中混淆时会遇到的问题 4.混淆后如何进行debug和日志查看 文章目录 Andr ...

  2. android命令行工具 混淆,Android 混淆代码学习以及Android加密工具--APKProtect的使用ZZ...

    一:情景分析 有时候看到其他应用App的一些效果很炫,或者是功能实现很好就想着参考参考,于是乎,下载APK----反编译APK---查看源码....,但是悲剧来了....源码都是些a,b,c...等等 ...

  3. Android混淆解析

    此文章转载来源https://www.jianshu.com/p/84114b7feb38点击打开链接 Android混淆解析 一.混淆的目的 一款发布到市场的软件原则上都应该做代码混淆. 通过代码混 ...

  4. Android混淆详解

    综述 毫无疑问,混淆是打包过程中最重要的流程之一,在没有特殊原因的情况下,所有 app 都应该开启混淆. 首先,这里说的的混淆其实是包括了代码压缩.代码混淆以及资源压缩等的优化过程.依靠 ProGua ...

  5. Android 混淆详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/69388246 本文出自[赵彦军的博客] 文章目录 混淆的基本概念 开启混淆 混淆规 ...

  6. Android混淆从入门到精通

    Android混淆从入门到精通 简介 作为Android开发者,如果你不想开源你的应用,那么在应用发布前,就需要对代码进行混淆处理,从而让我们代码即使被反编译,也难以阅读.混淆概念虽然容易,但很多初学 ...

  7. 解决android混淆编译出现Proguard returned with error code 1和文件名、目录名或卷标语法不正确错误...

    如果你在用android混淆打包的时候出现形如下面的错误: Proguard returned with error code 1. See console [2012-09-25 09:50:39 ...

  8. java还原混淆代码,android混淆 android如何将混淆代码还原?

    android studio的混淆文件是哪个曾几何时,我们做了世上那最柔情的人,为一朵花低眉,为一朵云驻足,为一滴雨感动. 关于代码混淆的作用,就不多解释了,整个过程大致如下:在app下的build. ...

  9. Android混淆那些事儿

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 博客园:追风917 Android混淆 Android混淆是Android开发者经常使用的一种用于代码防止被反编译的常见 ...

  10. Android混淆技术综述

    1. 引入 大量的恶意软件都使用了混淆技术来逃检测.查了下Android混淆技术,看了如下两篇资料: Understanding Android Obfuscation Techniques: A L ...

最新文章

  1. [唐胡璐]QTP框架 - 关键字驱动测试框架之七 - Settings管理
  2. STM32 KEIL中 负数绝对值处理
  3. 福大软工1816:项目测评
  4. 卷积神经网络CNN要点:CNN结构、采样层、全连接层、Zero-padding、激活函数及Dropout
  5. 支付宝借呗利息万3和万2.5的,都是些什么大神级的人物?
  6. IDA Pro、OllyDbg、LordPE和UltraEdit简单实用实验
  7. 易企秀手机html5场景源码,【VIP源码】六月1日最新完美版易企秀微信场景源码
  8. Win10微信打不开小程序,其他程序出现找不到HID.DLL的解决办法
  9. linux sniffer 程序使用,Linux下Sniffer程序的实现
  10. tftp服务器怎么开启linux,CentOS 6.4 tftp服务器配置--使用tftp下载并启动内核
  11. ubantu软件安装
  12. 点我—— ASP.NETCORE 安装CentOS
  13. MFC实现窗口透明,并显示一张透明PNG图片
  14. 推荐几款实用的内网穿透工具
  15. 解决VirtualBox虚拟电脑控制台严重错误
  16. Wireshark(2)-协议分析的起点
  17. elo匹配算法c语言,ELO算法教程
  18. cocoapod安装过程中的幺蛾子
  19. 程序员正确打开碎片时间的方法
  20. Google Earth Engine(GEE)——哥白尼大气监测 (CAMS) 全球气溶胶AOI近实时观测数据集

热门文章

  1. java实现开根号:牛顿迭代法
  2. 2021深度学习目标检测综述
  3. 发卡机构(POS收单行)代码表
  4. MATLAB 滤波函数的源代码
  5. 你真应该再多了解些Handler机制
  6. 铁打的春晚,流水的流量
  7. Windows无法安装到这个磁盘,选中的磁盘具有MBR分区表。在EFI系统上,Windows只能安装GPT磁盘。
  8. 如何用AltiumDesigner绘制STC89C51单片机原理图
  9. LTE时域、频域资源
  10. 数据压缩作业一:音频时域频域特性分析(Audacity)及RGB文件熵的计算