今天来讲一下Proguard中关于optimize的问题。先上一张异常图片android
最近项目重构,从新调整了各个组件之间的依赖关系。过程当中,在项目Proguard这块卡住了,最开始还好,Proguard只是提示警告,项目构建失败。因而我根据提示的警告信息,把先关的一些依赖所了混淆的一些配置处理。从新触发构建,日志再也不有警告,但此时却出现了一个error!算法
如上图所示,这是我项目中完整的错误日志。下面是我proguard-project.txt文档中所配置的optimize相关内容。优化
# 指定混淆时采用的算法,后面的参数是一个过滤器 -optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* # 代码混淆压缩比,在0~7之间,默认为5,通常不须要更改 -optimizationpasses 5
若是你也出现了图片中所描述的异常,若是你的proguard-project.txt文件中的配置也跟我上面所列举的一致。那么,请你继续往下看,或许我能帮到你。日志
我再网上扒拉的内容,大多都是说要加上-dontoptimize
就行了。可是-dontoptimize
的含义是“不优化输入的类文件”,这样一来,所谓的-optimizations
和-optimizationpasses
就没有意义了 。这种作法,我这边表示不认同。最终在stackoverflow上找到了我想要的解决方案。code
没错!在-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
的基础上添加!code/allocation/variable
,我在本身的项目中加上了这个内容以后,项目终于构建成功!图片
以上是我此次所遇到的问题。下面,我想把Proguard相关的其余内容也补充到这篇博客中,但愿可以方便你们去回顾这些内容。ip
Proguard由shrink、optimize、obfuscate和preverify四个步骤组成,其中每一个步骤都是可选的。如图所示。
文档
这里,引入Entry Point的概念。Entry Point是在Proguard过程当中不会被处理的类或方法,反之,非Entry Point的类和方法会被重命名。博客
经常使用的混淆指令有it
# 代码混淆压缩比,在0~7之间,默认为5,通常不须要更改 -optimizationpasses 5 # 混淆时不适用大小写混合,混淆后的类名为小写 -dontusemixedcaseclassnames # 指定不去忽略非公共的库的类 -dontskipnonpubliclibraryclasses # 指定不去忽略非公共的库的类的成员 -dontskipnonpubliclibraryclassmembers # 不作预校验,preverify是proguard的4个步骤之一,android不须要作预校验,去除这一步能够加快混淆速度 -dontpreverify # 有了verbose这句话,混淆后就会生成映射文件 -verbose # 指定混淆时采用的算法,后面的参数是一个过滤器 -optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* # 保护代码中的Annotation不被混淆 -keepattributes *Annotation* # 保护代码中的泛型被混淆 -keepattributes Signature # 抛出异常时保留代码行号 -keepattributes SourceFile,LineNumberTable