每次吃一点AndroidのProguard

目录:
1、Proguard初识
2、Proguard使用

Android小仙

1. Proguard初识

1.0. 引入

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

每次吃一点AndroidのProguard_第1张图片
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. 通配符

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

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'
        }
    }
}

注意:

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

2.5. AndroidSdk中的Proguard工具

每次吃一点AndroidのProguard_第2张图片
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)