Proguard混淆导致dex compliation抛出异常

时间:2014-07-11 00:13:18

标签: android obfuscation proguard dex

我有一个Android应用程序,我只是试图与Proguard混淆(因此,我有-dontoptimize -dontshrink -dontpreverify标志)。当我使用Proguard构建时,proguard本身不会抛出任何错误,但是dex抛出以下异常:

Exception in thread "pool-1-thread-1" com.android.dx.cf.code.SimException: com.android.dx.rop.cst.CstMethodRef cannot be cast to com.android.dx.rop.cst.CstInterfaceMethodRef
at com.android.dx.cf.code.BytecodeArray.parseInstruction(BytecodeArray.java:810)
... 
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassCastException: com.android.dx.rop.cst.CstMethodRef cannot be     cast to com.android.dx.rop.cst.CstInterfaceMethodRef

并且应用程序立即从NullPointerException崩溃。

我在Android Studio中使用最新版本的Proguard,在默认的proguard文件和一些额外的-keep选项和-dontwarn选项上构建。是什么原因引起了这个?谢谢!

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题Android Studio。在做“dex”将外部Jar转换为dalvik时会遇到麻烦:

Error:Android Pre Dex: [SOX.jar]
com.android.dx.rop.cst.CstInterfaceMethodRef cannot
be cast to com.android.dx.rop.cst.CstMethodRef

然后对正在处理的字符串进行一些模糊的引用。升级一切都无济于事。

我最终发现,被调用来进行一些小的字符串处理的方法之一已被放置在一个接口中。哪个适合主流java,但显然不适合dex。当方法移出界面并返回到众多类中的一个时,dex没有barf。

我的建议是仔细查看代码,寻找dex可能会关注的新功能或高级语言功能。我知道,没有太多的帮助,这个错误使我的Android开发工作停滞了2个月。

答案 1 :(得分:0)

如果您在Android Studio中使用Java 1.8+级别API和/或:

,则会发生这种情况
  1. 使用不兼容的gradle配置构建(sourceVersion / targetVersion无效)
  2. 使用目前在Android上无法使用的1.8 API进行构建
  3. 您正在使用非法的类型转换或在dex时间之前未检测到的反射(此帖子未解析)
  4. 你可以用1.7和1.8代替"更老的"和"更新",确切的API版本不应该真的重要。

    我建议剥离库和可疑代码,直到成功构建。在我的例子中,它正在转向像这样的类:

    Class<E> klass = (Class<E>) Class.forname(...).asSubclass(...) ... ;
    

    哪个建好了(偶尔会有警告 - 另一个错误),但抛出了你在dex时收到的模糊错误。删除它解决了这个问题。

    我还注意到,将语言级别降低到版本然后返回(1.8 - > 1.7 - > 1.8)并在每次更改后应用和退出设置会生成一组先前丢失的新警告。