Proguard的使用

我们使用AS新建工程的时候,都会在module的build文件中默认出现

 buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

当我们需要对项目进行混淆的时候,只需要将minifyEnabled设置为true即可。同时还可以设置shrinkResources true用于剔除项目中无用的资源文件。

proguard潜规则

proguard是有默认的规则的,这些规则都是放置在sdk/tools/proguard/proguard-android.txt中,我们自己项目中需要混淆的都写在我们自己的项目中的proguard-rules.pro文件里面

主要规则

  • -keepattributes * Annotation * 保留注解中的参数

  • keep 保留包/类

  • -keepclasseswithmembernames class * { native <methods>; }
    不混淆所有包括native方法的类。

  • -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); }不混淆任何View中的set和get方法,确保属性动画可以正常。

  • -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); }保留所有继承自Activity的类。即是所有的activity都不被混淆。

  • -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }所有枚举类型的都不混淆。

  • -keepclassmembers class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR; }所有序列化的类中的Creator方法不被混淆

  • -keepclassmembers class **.R$* { public static <fields>; }不混淆R文件中的静态字段,

  • -dontwarn android.support.**不用warn警告有关android.support包下的内容。

  • 不混淆android.support.annotation.Keep相关的类,方法,成员变量,初始化

      `-keep class android.support.annotation.Keep
    
      -keep @android.support.annotation.Keep class * {*;}
    
      -keepclasseswithmembers class * {
       @android.support.annotation.Keep <methods>;
      }
    
      -keepclasseswithmembers class * {
        @android.support.annotation.Keep <fields>;
      }
    
      -keepclasseswithmembers class * {
        @android.support.annotation.Keep <init>(...);
      }`
    
  • 关于几个关键字

    • -dontusemixedcaseclassnames 混淆时不适用大小写混淆
    • -dontskipnonpubliclibraryclasses 不跳过library中的非public类
    • -verbose 不打因详细的混淆信息
    • -dontoptimize 不对混淆文件进行大小优化,
    • -dontpreverify 不进行检验检查

<b>以上是关于android sdk中默认的proguard规则的介绍。接下来是对文档的翻译http://proguard.sourceforge.net/index.html#manual/usage.html主要是规则相关的</b>

关于proguard.pro文件的编辑规则

  1. 可以使用#来注释一整行
  2. 单词和分隔符之间的空格会自动忽略,特殊需要空格的用单引号或者双引号。
  3. 配置的参数一般顺序不分先后

Input/Output Options 输入输出相关

  1. include filename 读取制定的文件
  2. basedirectory 递归读取文件目录下的内容
  3. injars CLASS_PATH 指定读入的jar的路径
  4. outjars CLASS_PATH 指定输出的jar的路径
  5. libraryjars CLASS_PATH 指定库文件的路径
  6. skipnonpubliclibraryclasses 指定跳过的非公共类
  7. dontskipnonpubliclibraryclasses 指定不跳过的非公共类
  8. dontskipnonpubliclibraryclassmembers 指定不忽略的库类的成员变量和方法
  9. keepdirectories [directory_filter] 指定输出jars的目录,默认是删除的
  10. target version 指定处理文件的版本
  11. 比较输入,输出文件的时间戳

Keep Options 保留,不混淆

  1. <b>keep [,modifier,...] class_specification 保留指定的类和成员变量,以保存的代码为准</b>
  2. keepclassmembers [,modifier,...] class_specification 指定保留类成员
  3. keepclasseswithmembers [,modifier,...] class_specification 在类和成员都存在的情况下保留
  4. keepnames class_specification 指定要保留的类的成员
  5. keepclassmembernames class_specification 指定保留的成员如果在代码压缩的时候没有被移除
  6. keepclasseswithmembernames class_specification 指定在压缩代码的时候保留下来的类和成员
  7. printseeds [filename] 详尽的列出要匹配的类和成员到指定的输出文件

Shrinking Options 压缩

  1. dontshrink 指定不压缩的类文件
  2. printusage [filename] 无用代码(dead code)输出到指定列表
  3. whyareyoukeeping class_specification 给出指定的类和成员在指定的压缩级别中为什么别压缩

Optimization Options 优化

  1. dontoptimize 指定不优化的类文件,默认byte级优化
  2. optimizations optimization_filter 指定在详细的优化级别中优化与否
  3. assumenosideeffects class_specification 指定即使删除也对项目没有影响的方法。例如使用该配置删除日志代码
  4. allowaccessmodification 用来进一步优化,但是不建议使用,某些虚拟机将回出问题
  5. mergeinterfacesaggressively 指定接口合并,更加不建议使用,有些虚拟机不能处理所产生的代码

Obfuscation Options 混淆

  1. dontobfuscate 指定不混淆输入的类
  2. printmapping [filename] 指定对应文件的新名字
  3. applymapping filename 指定要重新使用的特定的名字
  4. applymapping filename 指定混淆文件和方法的文本文件
  5. obfuscationdictionary filename 指定用于混淆的文件,只有混淆的时候适用
  6. classobfuscationdictionary filename 类似上一条
  7. packageobfuscationdictionary filename 类似上一条
  8. overloadaggressively 指定混淆可以重名,多个字段和方法可以重名只要参数和返回值类型不同
  9. useuniqueclassmembernames 指定相同的名字适用相同的混淆名字,不同的混淆名称分配给不同的成员
  10. dontusemixedcaseclassnames 混淆不使用大小写混合的方式
  11. keeppackagenames [package_filter] 指定包不混淆
  12. flattenpackagehierarchy [package_name] 指定包移动到一个指定的父包中以减少处理后的代码。
  13. repackageclasses [package_name] 指定类移动到一个指定的包中。
  14. <b>keepattributes [attribute_filter] 指定要保留的属性</b>
  15. keepparameternames 指定不混淆的方法的参数名和类型
  16. renamesourcefileattribute [string] 指定一个常量字符放在SourceFile 中
  17. adaptclassstrings [class_filter] 指定类名字符串常量被混淆
  18. adaptresourcefilenames [ FILE_FILTER ] 指定资源文件重命名
  19. adaptresourcefilecontents [ FILE_FILTER ] 指定内容会更新的资源常量

Preverification Options 校验

  1. dontpreverify 指定不校验处理的类
  2. microedition 指定处理的文件是针对Java Micro Edition

General Options 普通

  1. verbose 打印所有信息
  2. dontnote [class_filter] 指定不打印的配置潜在的错误和遗漏
  3. <b>dontwarn [class_filter] 指定不警告未解决的参考和其他问题</b>
  4. ignorewarnings 指定打印所有未解决的参考和问题,但是继续运行
  5. printconfiguration [filename] 打印出整个解析出来的配置,包括文件和变量
  6. dump [filename] 指定输出类文件的内部结构
    dontwarn
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,095评论 25 707
  • Merit smaller APK size (20% ~ 40%) more difficult to reve...
    Wavky阅读 1,295评论 0 0
  • 混淆(Proguard)用法 最近项目中遇到一些混淆相关的问题,由于之前对proguard了解不多,所以每次都是面...
    于晓飞93阅读 56,761评论 38 230
  • 说明:本文参考(翻译)自Android SDK根目录下的proguard目录下的说明文档,是其中的一篇。,文中除了...
    一件小毛衣阅读 84,510评论 9 85
  • 1.江南水乡 深深的小巷, 穿旗袍的姑娘 怀抱琵琶来到船上, 一曲《忆江南》开唱, 火红的花儿开放, 翠绿的小草生...
    金赛月阅读 472评论 2 9