转载来源http://blog.csdn.net/yuhanghate/article/details/51656804
Android 工程中有时候需要混淆,减少包大小及增加反编译难度。
AS中创建工程时默认创建了proguard-android.txt文件,自己如果需要增加一些第三方库需要自己在proguard-rules.txt文件中配置混淆文件。
ProGuard简介
JAVA中默认使用ProGuard进行混淆。
ProGuard能够对Java类中的代码进行压缩(Shrink),优化(Optimize),混淆(Obfuscate),预检(Preveirfy)。
1. 压缩(Shrink):在压缩处理这一步中,用于检测和删除没有使用的类,字段,方法和属性。
2. 优化(Optimize):在优化处理这一步中,对字节码进行优化,并且移除无用指令。
3. 混淆(Obfuscate):在混淆处理这一步中,使用a,b,c等无意义的名称,对类,字段和方法进行重命名。
4. 预检(Preveirfy):在预检这一步中,主要是在Java平台上对处理后的代码进行预检。
Proguard-android使用
在Gradle.builde文件中指定混淆文件
- buildTypes {
- release {
- minifyEnabled true
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
如果需gradle.builde文件的基本配置,
请点击这里
第三方库及基本混淆配置
Glide配置:google官方出的图片加载库,流畅度目前最高
- -keep public class * implements com.bumptech.glide.module.GlideModule
- -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
- **[] $VALUES;
- public *;
- }
- </pre><h5><span style="font-family:microsoft yahei; color:#362e2b">Retrofit 2.0配置:基于Resetful api的网络库,基于支持NIO的Okhttp。性能很高并支持Rxjava</span></h5></div><div><span style="font-family:microsoft yahei; color:#362e2b"></span><pre code_snippet_id="1715182" snippet_file_name="blog_20160613_4_6756916" name="code" class="java">-dontwarn retrofit2.**
- -keep class retrofit2.** { *; }
- -keepattributes Signature
- -keepattributes Exceptions
stetho配置:Facebook出的黑科技。使用Okhttp框架支持Chrome显示app日志及数据库等数据
- -keep class com.facebook.stetho.** { *; }
- -dontwarn org.mozilla.javascript.**
- -dontwarn org.mozilla.classfile.**
- -keep class org.mozilla.javascript.** { *; }
Gson配置:Json转POJO。官方出品的Json经典库
- -keep public class com.google.gson.**
- -keep public class com.google.gson.** {public private protected *;}
- -keep class sun.misc.Unsafe { *; }
- -keepattributes Signature
- -keepattributes *Annotation*
butterknife配置:大神JakeWharton出的View注解库。简单好用性能极高,因为没有使用反射
- -keepclasseswithmembernames class * {
- @butterknife.* <fields>;
- }
- -keepclasseswithmembernames class * {
- @butterknife.* <methods>;
- }
View配置:系统自带和google支持库
- -dontwarn android.support.**
- -dontwarn com.google.android.maps.**
- -dontwarn com.slidingmenu.lib.app.SlidingMapActivity
- -keep class android.support.** { *; }
- -keep class com.actionbarsherlock.** { *; }
- -keep interface com.actionbarsherlock.** { *; }
- -keep class com.slidingmenu.** { *; }
- -keep interface com.slidingmenu.** { *; }
序列化配置:Serializable和Parcelable
- -keepclassmembers class * implements java.io.Serializable {
- static final long serialVersionUID;
- private static final java.io.ObjectStreamField[] serialPersistentFields;
- private void writeObject(java.io.ObjectOutputStream);
- private void readObject(java.io.ObjectInputStream);
- java.lang.Object writeReplace();
- java.lang.Object readResolve();
- }
- -keep public class * implements java.io.Serializable {*;}
- -keepclassmembers class * implements android.os.Parcelable {
- public <fields>;
- private <fields>;
- }
- -keep class * implements android.os.Parcelable {
- public static final android.os.Parcelable$Creator *;
- }
java8 retrolambda 配置:支持Java8的部分新特性。当然如果使用google自带的java8也可以,但不支持apt。详细说明请点击这里
- -dontwarn java.lang.invoke.*
新浪微博:很草蛋,没有官方给的混淆。自己上
- -keep class com.sina.weibo.sdk.* { *; }
- -keep class android.support.v4.* { *; }
- -keep class com.tencent.* { *; }
- -keep class com.baidu.* { *; }
- -keep class lombok.ast.ecj.* { *; }
- -dontwarn android.support.v4.**
- -dontwarn com.tencent.**s
- -dontwarn com.baidu.**
Okio:基于NIO的流。大公司出品,不解释
- -dontwarn com.squareup.**
- -dontwarn okio.**
- -keep public class org.codehaus.* { *; }
- -keep public class java.nio.* { *; }
Ormlite配置:数据库。其实不想用这个,接手的时候用这个。有空换高性能的GreenDao2库,毕竟google在接手了稳定性及支持力度第靠谱
- -keepattributes *DatabaseField*
- -keepattributes *DatabaseTable*
- -keepattributes *SerializedName*
- -keep class com.j256.**
- -keepclassmembers class com.j256.** { *; }
- -keep enum com.j256.**
- -keepclassmembers enum com.j256.** { *; }
- -keep interface com.j256.**
- -keepclassmembers interface com.j256.** { *; }
Rxjava:很好用的库。目前国内很多项目都开始用这个了。个人推荐,赞
- -dontwarn sun.misc.**
- -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
- long producerIndex;
- long consumerIndex;
- }
- -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
- rx.internal.util.atomic.LinkedQueueNode producerNode;
- }
- -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
- rx.internal.util.atomic.LinkedQueueNode consumerNode;
- }
WebView配置
- -keepclassmembers class fqcn.of.javascript.interface.for.webview {
- public *;
- }
- -keepclassmembers class * extends android.webkit.webViewClient {
- public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
- public boolean *(android.webkit.WebView, java.lang.String);
- }
- -keepclassmembers class * extends android.webkit.webViewClient {
- public void *(android.webkit.webView, jav.lang.String);
- }
自己项目配置:使用Gson时需要配置Gson的解析对象及变量都不混淆。不然Gson会找不到变量。
注意:替换成自己工程下指定目录即可。我使用的是自己工程下
指定目录下的所有文件:net.shopnc.shop.http.params.**