proguard 踩坑之路

作者: APR_killer | 来源:发表于2017-09-08 14:56 被阅读75次

    背景:

    最近项目中引入了一个三方的库,然后在打包的时候发现一些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的时候检查是否添加了不必要的混淆

    相关文章

      网友评论

        本文标题:proguard 踩坑之路

        本文链接:https://www.haomeiwen.com/subject/nangjxtx.html