1.debug和release版本都可以混淆
2.配置minifyEnabled为true即为开启混淆
buildTypes { release { signingConfig signingConfigs.release minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug{ minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
3.proguard-android.txt是系统默认的混淆配置文件,已经为我们配置了常用的配置项,proguard-rules.pro中可以补充配置其他选项,也可以不加任何配置
/Users/zhouyi/Library/Android/sdk/tools/proguard/proguard-android.txt
4.常见不能混淆的
系统接口
Jni接口
其他如四大组件、View
第三方类库如android-support
等等
混淆配置:
保持某个指定类不被混淆,记得带包名,只是类名不混淆,里面方法如果没有其他配置,还是会混淆
-keep public class com.qianfeng.zhouyi.proguardsignpack.TestA
保持类中指定方法不混淆,类名如果没有其他配置,会混淆
-keepclassmembers class * {
public static void msgB();
}
保持指定方法和它所在类的类名不混淆,这些类中其他方法如果没有其他配置,还是混淆
-keepclasseswithmembers class * {
public void funC();
}
5.
一些常用包的Proguard配置
下面再写一些我在项目中使用到的一些第三方包需要单独配置的混淆配置
sharesdk混淆注意
-keep class android.net.http.SslError
-keep class android.webkit.**{*;}
-keep class cn.sharesdk.**{*;}
-keep class com.sina.**{*;}
-keep class m.framework.**{*;}
Gson混淆配置
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.idea.fifaalarmclock.entity.***
-keep class com.google.gson.stream.** { *; }
6.demo实例:
-ignorewarnings # 忽略警告,避免打包时某些警告出现 -optimizationpasses 5 # 指定代码的压缩级别 -dontusemixedcaseclassnames # 是否使用大小写混合 -dontskipnonpubliclibraryclasses # 是否混淆第三方jar -dontpreverify # 混淆时是否做预校验 -verbose # 混淆时是否记录日志 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法 -libraryjars libs/treecore.jar -dontwarn android.support.v4.** #缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。 -dontwarn android.os.** -keep class android.support.v4.** { *; } # 保持哪些类不被混淆 -keep class com.baidu.** { *; } -keep class vi.com.gdi.bgl.android.**{*;} -keep class android.os.**{*;} -keep interface android.support.v4.app.** { *; } -keep public class * extends android.support.v4.** -keep public class * extends android.app.Fragment -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.support.v4.widget -keep public class * extends com.sqlcrypt.database -keep public class * extends com.sqlcrypt.database.sqlite -keep public class * extends com.treecore.** -keep public class * extends de.greenrobot.dao.** -keepclasseswithmembernames class * { # 保持 native 方法不被混淆 native <methods>; } -keepclasseswithmembers class * { # 保持自定义控件类不被混淆 public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { # 保持自定义控件类不被混淆 public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { //保持类成员 public void *(android.view.View); } -keepclassmembers enum * { # 保持枚举 enum 类不被混淆 public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆 public static final android.os.Parcelable$Creator *; } -keep public class com.qianfeng.zhouyi.proguardsignpack.TestA # 保持自己定义的类不被混淆,记得带包名
7.详细的混淆用法见文档:http://proguard.sourceforge.net/index.html#manual/usage.html
8.混淆后就没法调试(模拟器也没法调试),debug版本如果开启混淆,也没法调试