ProGuard配置

保留选项(配置不进行处理的内容)

保护指定的类文件和类的成员
-keep {Modifier} {class_specification}

保护指定类的成员,如果此类受到保护他们会保护的更好
-keepclassmembers {modifier} {class_specification}

保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在
-keepclasseswithmembers {class_specification}

保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)
-keepnames {class_specification}

保护指定的类的成员的名称(如果他们不会压缩步骤中删除)
-keepclassmembernames {class_specification}

保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)
-keepclasseswithmembernames {class_specification}

列出类和类的成员-keep选项的清单,标准输出到给定的文件
-printseeds {filename}

压缩

不压缩输入的类文件
-dontshrink

-printusage {filename}

-whyareyoukeeping {class_specification}

优化

不优化输入的类文件
-dontoptimize

优化时假设指定的方法,没有任何副作用
-assumenosideeffects {class_specification}

优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification

混淆

不混淆输入的类文件
-dontobfuscate

使用给定文件中的关键字作为要混淆方法的名称
-obfuscationdictionary {filename}

混淆时应用侵入式重载
-overloadaggressively

确定统一的混淆类的成员名称来增加混淆
-useuniqueclassmembernames

重新包装所有重命名的包并放在给定的单一包中
-flattenpackagehierarchy {package_name}

重新包装所有重命名的类文件中放在给定的单一包中
-repackageclass {package_name}

混淆时不会产生形形色色的类名
-dontusemixedcaseclassnames

保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.
-keepattributes {attribute_name,...}

设置源文件中给定的字符串常量
-renamesourcefileattribute {string}

?|*后面的文件名,类名,或者包名等可以使用占位符代替

表示一个字符 可以匹配多个字符,但是如果是一个类,不会匹配其前面的包名 * 可以匹配多个字符,会匹配前面的包名。

在android中在android Manifest文件中的activity,service,provider, receviter,等都不能进行混淆。一些在xml中配置的view也不能进行混淆,android提供的默认配置中都有。

ProGuard的输出文件及用处

混淆之后,会给我们输出一些文件,在gradle方式下是在/build/proguard/目录下,ant是在/bin/proguard目录,eclipse构建在/proguard目录像。

分别有以下文件:

  • dump.txt 描述apk文件中所有类文件间的内部结构。
  • mapping.txt 列出了原始的类,方法,和字段名与混淆后代码之间的映射。
  • seeds.txt 列出了未被混淆的类和成员
  • usage.txt 列出了从apk中删除的代码

另外Proguard文件中包含retrace脚本,可以将一个被混淆过的堆栈跟踪信息还原成一个可读的信息,window下时retrace.bat,linux和mac是retrace.sh,在/tools/proguard/文件夹下。语法为:

retrace.bat retrace.sh [-verbose] mapping.txt []

例如:

retrace.bat -verbose mapping.txt obfuscated_trace.txt

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

autoload自动加载机制使用

在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来,但是这样可能会使得在...

232100
来自专栏Linyb极客之路

从Java内存模型角度理解安全初始化

如大家所知,Java代码在编译和运行的过程中会对代码有很多意想不到且不受开发人员控制的操作:

11830
来自专栏python学习路

二、路由、模板

一、路由系统 在settings.py文件中通过ROOT_URLCONF指定根级url的配置 urlpatterns是一个url()实例的列表 一个url()对...

35180
来自专栏linux驱动个人学习

Linux进程ID号--Linux进程的管理与调度(三)【转】

Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,...

32910
来自专栏我的博客

CI基础知识笔记

1.知识点 $config[‘url_suffix’] = ”;//url后缀 $config[‘enable_query_strings’] = FALS...

29130
来自专栏mwangblog

python操作文本文件

24240
来自专栏大闲人柴毛毛

Java并发编程的艺术(十二)——线程安全

1. 什么是『线程安全』? 如果一个对象构造完成后,调用者无需额外的操作,就可以在多线程环境下随意地使用,并且不发生错误,那么这个对象就是线程安全的。 2. ...

38050
来自专栏智能合约

Phalcon入门教程之Volt模板引擎

16330
来自专栏Android 研究

Android系统启动——3init.rc解析

init.rc文件是以“块”(section)为单位服务的,,一个“块”(section)可以包含多行。“块”(section)分成两大类:一类称为"动作(ac...

56020
来自专栏coder修行路

python中重要的模块--asyncio

一直对asyncio这个库比较感兴趣,毕竟这是官网也非常推荐的一个实现高并发的一个模块,python也是在python 3.4中引入了协程的概念。也通过这次整理...

55470

扫码关注云+社区

领取腾讯云代金券