前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 混淆问题排查

Android 混淆问题排查

作者头像
先知先觉
发布2019-01-21 16:07:10
2.2K0
发布2019-01-21 16:07:10
举报

问题

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

代码语言:javascript
复制
12-07 14:10:27.056 10603-10603/? E/AndroidRuntime: FATAL EXCEPTION: main
    java.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.Application
        at 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.Application
        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)

思路

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

过程

第一步

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

在这里插入图片描述
在这里插入图片描述

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

运行后报错如下:

代码语言:javascript
复制
12-10 15:16:07.442 15939-15939/? E/AndroidRuntime: FATAL EXCEPTION: main
    java.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.** { *; }

第三步

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

在这里插入图片描述
在这里插入图片描述

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

代码语言:javascript
复制
public static Context getBaseApplication() {
        return instance;
}

混淆后:

代码语言:javascript
复制
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掉了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年12月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 思路
  • 过程
    • 第一步
      • 第二步
        • 第三步
          • 第四步:
          • 结论
          相关产品与服务
          腾讯云代码分析
          腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档