美文网首页
每次吃一点AndroidのProguard

每次吃一点AndroidのProguard

作者: 耑意儿 | 来源:发表于2017-02-22 14:51 被阅读61次
    目录:
    1、Proguard初识
    2、Proguard使用
    

    Android小仙

    1. Proguard初识

    1.0. 引入

    我们知道,程序包的生成过程是先将Java文件编译成.class字节码文件然后再打包生成程序包。而程序包很容易被解压回字节码文件,字节码文件中又包含几乎所有的程序信息,因此很容易被反编译获取到Java源代码。
    那为了避免程序包被反编译使源代码泄露造成不必要的损失,有必要对字节码文件进行混淆。ProGuard(官网似乎要翻墙哦!)就可以做到代码混淆,让逆向工程师更难理解和复制,此外ProGuard还可以减小代码的体积,对代码进行优化。
    如果你要做更为深层的代码安全性保护,可以考虑了解下DexGuard

    Paste_Image.png

    1.1. 功能

    ProGuard可以对Java文件进行压缩、优化、混淆和预校验,可以检查和移除无用代码,减少程序包的体积。可以对文件内容进行混淆,防止被反编译。

    1.2. 优点

    • 模板化配置
    • 简单的命令行选项
    • 快速的处理过程

    1.3. 工作过程

    ProGuard就做四件事:
    压缩(Shrink)、优化(Optimize)、混淆(Obfuscate)、预校验(Preverify)
    先来看看这几个过程涉及的一个关键词:
    入口点(EntryPoint),这里简称EP,EP指的是被保持的代码,它决定了哪些代码不被移除或者混淆。

    1.3.1. 压缩

    压缩是发现没有使用的类、方法、字段和特性,然后将其移除以减少代码量。
    压缩时从EP开始递归遍历,搜索被使用的类和类成员,将未被使用到的移除。

    1.3.2. 优化

    优化是对字节码进行优化,移除无用的指令,这个功能默认是不开启的.
    优化时用private、static、final等修饰符修饰非EP的类和方法,移除无用的参数,将一些方法变成内联方法。

    1.3.3. 混淆

    混淆是通过使用简短的名称如a,b,c来命名类,方法和变量名。
    混淆时保留作为EP的类和类成员名,重命名非EP的类和类成员名。

    1.3.4. 预校验

    预校验是确保加载的class文件是可执行的,这个功能也是默认不开启的

    1.4. 关闭四大功能

    # 关闭压缩功能
    -dontshrink
    # 关闭优化功能
    -dontoptimize
    # 关闭混淆功能
    -dontobfuscate
    # 关闭预校验功能
    -dontpreverify
    

    2. Proguard使用

    2.1. 基础语法

    • proguard以一行为一条语句,以空格为分隔符
    • #是注释符
    • 文件名有空格等特殊符号的用单引号、双引号标记

    2.2. ProGuard有七种指令选项:

    • I/O选项
    • Keep选项
    • 压缩选项
    • 优化选项
    • 混淆选项
    • 预校验选项
    • 通用选项

    详细可参考Proguard选项

    2.3. 通配符

    ? 单个字符
    * 多个字符
    **任意多个字符
    %基本类型
    ***任意类型
    ···多个参数
    <init>构造方法
    <fields>字段
    <methods>方法

    2.4. Android ProGuard 的使用

    在proguard-rules.pro文件中添加需要的规则,在AndroidStudio中的build.gradle文件中进行配置,如下:

    android {
        buildTypes {
            debug {
                buildConfigField "boolean", "LOG_DEBUG", "true"
                // VersionName后缀
                versionNameSuffix "-debug"
                minifyEnabled false
                zipAlignEnabled false
                shrinkResources false
            }
            release {
                // 不显示log
                buildConfigField "boolean", "LOG_DEBUG", "false"
                // 混淆
                minifyEnabled true
                // Zipalign优化
                zipAlignEnabled true
                // 移除无用的resource
                shrinkResources true
                // 混淆配置
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    

    <a>注意:</a>

    • ProGuard做处理需要占用一定的时间,因此在调试过程中不建议开启,如上,debug时的minifyEnabled false
    • 由于android sdk 的 /sdk/tools/proguard/proguard-android.txt 中已经提供了基本的混淆配置,不需要在 proguard-rules.pro 中重复配置。

    2.5. AndroidSdk中的Proguard工具

    Paste_Image.png
    • ant文件夹存放构建Ant工具的配置文件
    • bin文件夹放的是运行ProGuard程序的批处理脚本,.bat文件
    • docs文件夹是ProGuard的文档
    • examples文件夹是配置文件的栗子
    • lib文件夹里面是三个jar包
    • 三个.txt文件是默认的配置文件

    2.6. ProGuard使用注意事项

    • 反射用到的类不能混淆,JNI(Java Native Interface)方法不混淆
    • 清单文件AndroidManifest中的类不混淆
    • 四大组件、Application的子类、Framework层下所有的类默认不进行混淆
    • Parcelable的子类和Creator静态成员变量不混淆
    • 使用GSON、fastjson等框架时,JSON对象类不混淆,否则无法将JSON解析成对应的对象
    • 使用第三方开源库或者引用其他第三方的SDK包时,需要在混淆文件中加入对应的混淆规则
    • 有用到WebView的JS调用也需要保证写的接口方法不混淆

    参考资料:
    Android Studio:ProGuard 混淆配置
    ProGuard系列 - Android ProGuard

    相关文章

      网友评论

          本文标题:每次吃一点AndroidのProguard

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