做者 :CoderThcjava
Proguard是一个Java类文件压缩器、优化器、混淆器、预校验器。压缩环节会检测以及移除没有用到的类、字段、方法以及属性。优化环节会分析以及优化方法的字节码。混淆环节会用无心义的短变量去重命名类、变量、方法。这些步骤让代码更精简,更高效,也更难被逆向(破解)。android
混淆后默认会在工程目录app/build/outputs/mapping/release(debug)下生成一个mapping.txt文件,这就是混淆规则,咱们能够根据这个文件把混淆后的代码反推回源本的代码,因此这个文件很重要,注意保护好。原则上,代码混淆后越乱越无规律越好,但有些地方咱们是要避免混淆的,不然程序运行就会出错。面试
压缩(Shrinking):默认开启,用以减少应用体积,移除未被使用的类和成员,而且会在优化动做执行以后再次执行(由于优化后可能会再次暴露一些未被使用的类和成员)sql
-dontshrink #关闭压缩
-dontoptimize #关闭优化 -optimizationpasses n #表示proguard对代码进行迭代优化的次 数,Android通常为5
-dontobfuscate #关闭混淆
-keep class com.thc.test.*
-keep class com.thc.test.**
(上面两种方式保持类后,会发现类名虽然未混淆,但里面的具体方法和变量命名仍是变了)json
-keep class com.thc.test.*{*;}
-keep class com.thc.test.**{*;}
-keep class com.xlpay.sqlite.cache.BaseDaoImpl
-keep class com.xlpay.sqlite.cache.BaseDaoImpl{*;}
-keep class com.thc.gradlestudy.MyProguardBean{ <init>; #匹配全部构造器 <fields>;#匹配全部域 <methods>;#匹配全部方法 }
上面就保持住了MyProguardBean这个类中的全部的构造方法、变量、和方法微信
-keep class com.xlpay.sqlite.cache.BaseDaoImpl{ public <methods>;#保持该类下全部的共有方法不被混淆 public *;#保持该类下全部的共有内容不被混淆 private <methods>;#保持该类下全部的私有方法不被混淆 private *;#保持该类下全部的私有内容不被混淆 public <init>(java.lang.String);#保持该类的String类型的构造方法 }
-keep class com.thc.gradlestudy.MyProguardBean{ public <init>(String); }
#保持ProguardTest中的MyClass不被混淆 -keep class com.xlpay.sqlite.cache.ProguardTest$MyClass{*;}
-keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.view.View
#保持ProguardTest类下test(String)方法不被混淆 -keepclassmembernames class com.xlpay.sqlite.cache.ProguardTest{ public void test(java.lang.String); }
-keepclasseswithmembernames class com.xlpay.sqlite.cache.ProguardTest
#保持native方法不被混淆 -keepclasseswithmembernames class * { native <methods>; }
反射用到的类混淆时须要注意:只要保持反射用到的类名和方法便可,并不须要将整个被反射到的类都进行保持架构
-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆 public static final Android.os.Parcelable$Creator *; }
-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }
例子中使用:classA和classB,在加混淆的状况下多种结果:app
感谢你们能耐着性子看完ide
在这里小编也分享一份本身收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料帮助你们学习提高进阶,也节省你们在网上搜索资料的时间来学习,也能够分享给身边好友一块儿学习
若是你有须要的话,能够点赞+评论,关注我,而后加我VX:15388039515 我发给你
(或关注微信公众号“Android开发之家”回复【资料】免费领取)