背景:
最近项目中引入了一个三方的库,然后在打包的时候发现一些build的一些task没有执行。原先release版本过滤的d ,v日志也在控制台那边出现了,然后就去寻找是不是某个配置导致了一些proguard的task没有执行。
介绍:
proguard提供了一种比较先进的安全组件来保证android APK和SDK被静态代码分析,所以其最主要的功能就是对我们的代码进行混淆,不让一些黑客可以通过一些静态代码的分析来攻击我们的应用。但是其实proguard还提供了一些其他的功能,那我们先来看下到底做了哪些事情。
功能和流程:
功能:shrinker(压缩),optimizer(优化),obfuscator(混淆),preverifier(预校验)
shrink: 检测并移除没有用到的类,变量,方法和属性;
optimize: 优化代码,非入口节点类会加上private/static/final,没有用到的参数会被删除,一些方法可能会变成内联代码。
obfuscate: 使用短又没有语义的名字重命名非入口类的类名,变量名,方法名。入口类的名字保持不变。
preverify: 预校验代码是否符合Java1.6或者更高的规范(唯一一个与入口类不相关的步骤)
流程:
shrink-->optimize-->obfuscate-->preverify
项目配置:
android studio会在build.gradle下配置如下信息:
buildTypes {
release {
minifyEnabled true
proguard FilesgetDefaultProguardFile('proguard-android-optimize.txt') proguard-rules.pro
}
}
其中proguard-android.txt这个文件是 android sdk提供的一个默认的produard的默认配置项存放在{ANDROID_SDK_ROOT}/tools/proguard/ 但是我们对于发布的release版本应使用proguard-android-optimize.txt,此文件主要配置的是一些默认的proguard配置,而和‘proguard-android’的最大区别在与‘proguard-android-optimize.txt’中开启了Proguard optimize的选项(optimize是Proguard的一项功能)
问题原因:
由于proguard-android配置如下导致主功能optimize,preverify没执行
-dontoptimize
-dontpreverify
注意点:
1.三方库已经混淆的库,需要在主项目添加keep不再进行二次混淆
2.反射获取对象和方法要保证不被混淆。
3.反射三方库的混淆方法和对象存在风险不建议这么使用
4.aar和添加独立module的时候检查是否添加了不必要的混淆