在bulid.gradle文件中:

设置如下

buildTypes {


        release {

            minifyEnabled true

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }

    }


在proguard-rules.pro文件中加入以下代码:



#使用butterknife注入会导致ProGuard 认为变量未被使用,因此,需要在ProGuard 中加入如下字段

-dontwarn butterknife.internal.**

-keep class **$$ViewInjector { *; }

-keepnames class * { @butterknife.InjectView *;}


#==================gson==========================

-dontwarn com.google.**

-keep class com.google.gson.**{*;}

#==================protobuf======================-

-dontwarn com.google.**

-keep class com.google.protobuf.** {*;}


#集成百度地图SDK的应用,在打包混淆的时候,需要注意与地图SDK相关的方法不可被混淆,否则会出现网络不可用等运行时异常。混淆方法如下:

-keep class com.baidu.** {*;}

-keep class vi.com.** {*;}

-dontwarn com.baidu.**

-dontwarn com.baidu.mapapi.**

-keep class com.baidu.mapapi.** {*; }

-keep class assets.** {*; }

-keep class vi.com.gdi.bgl.** {*; }


#下面是常见的proguard.cfg配置项

#指定代码的压缩级别

-optimizationpasses 5

#包名不混合大小写

-dontusemixedcaseclassnames

#不去忽略非公共的库类

-dontskipnonpubliclibraryclasses

#优化  不优化输入的类文件

-dontoptimize

#预校验

-dontpreverify

#混淆时是否记录日志

-verbose

# 混淆时所采用的算法

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

#保护注解

-keepattributes *Annotation*

# 保持哪些类不被混淆

-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.app.backup.BackupAgentHelper

-keep public class * extends android.preference.Preference

-keep public class * extends android.support.v4.**

-keep public class com.android.vending.licensing.ILicensingService


#如果有引用v4包可以添加下面这行

-keep public class * extends android.support.v4.app.Fragment


##########JS接口类不混淆,否则执行不了

-dontwarn com.android.JsInterface.**

-keep class com.android.JsInterface.** {*; }


#极光推送和百度lbs android sdk一起使用proguard 混淆的问题#http的类被混淆后,导致apk定位失败,保持apache 的http类不被混淆就好了

-dontwarn org.apache.**

-keep class org.apache.**{ *; }


#忽略警告

-ignorewarning


##记录生成的日志数据,gradle build时在本项目根目录输出##

#apk 包内所有 class 的内部结构

-dump class_files.txt

#未混淆的类和成员-printseeds seeds.txt

#列出从 apk 中删除的代码

-printusage unused.txt

#混淆前后的映射-printmapping mapping.txt

########记录生成的日志数据,gradle build时 在本项目根目录输出-end#####


######混淆保护自己项目的部分代码以及引用的第三方jar包library########

#如果引用了v4或者v7包

-dontwarn android.support.**

####混淆保护自己项目的部分代码以及引用的第三方jar包library-end####


-keep public class * extends android.view.View {

  public (android.content.Context);

  public (android.content.Context, android.util.AttributeSet);

  public (android.content.Context, android.util.AttributeSet, int);

  public void set*(...);

 }


#保持 native 方法不被混淆

-keepclasseswithmembernames class * {

  native ;

}


#保持自定义控件类不被混淆

-keepclasseswithmembers class * {

  public (android.content.Context, android.util.AttributeSet);

}


#保持自定义控件类不被混淆

-keepclassmembers class * extends android.app.Activity {

  public void *(android.view.View);

}


#保持 Parcelable 不被混淆

-keep class * implements android.os.Parcelable {

  public static final android.os.Parcelable$Creator *;

}


#保持 Serializable 不被混淆

-keepnames class * implements java.io.Serializable


#保持 Serializable 不被混淆并且enum 类也不被混淆

-keepclassmembers class * implements java.io.Serializable {

    static final long serialVersionUID;

    private static final java.io.ObjectStreamField[] serialPersistentFields;

    !static !transient ;

    !private ;

    !private ;

    private void writeObject(java.io.ObjectOutputStream);

    private void readObject(java.io.ObjectInputStream);

    java.lang.Object writeReplace();

    java.lang.Object readResolve();

}


#保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可

-keepclassmembers enum * {

      public static **[] values();

      public static ** valueOf(java.lang.String);

}


-keepclassmembers class * {

      public void *ButtonClicked(android.view.View);

}


#不混淆资源类

-keepclassmembers class **.R$* {

      public static ;

}


#避免混淆泛型 如果混淆报错建议关掉

#–keepattributes Signature


#如果用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错

#gson

#-libraryjars libs/gson-2.2.2.jar

-keepattributes Signature

# Gson specific classes

-keep class sun.misc.Unsafe { *; }

# Application classes that will be serialized/deserialized over Gson

-keep class com.google.gson.examples.android.model.** { *; }

#客户端代码中的JavaBean(实体类)的类名与其字段名称全部变成了a、b、c、d等等字符串,这与服务端返回的json字符串中的不一致,导致解析失败。所以,解决的办法是:在进行混淆编译进行打包apk的时候,过滤掉存放所有JavaBean(实体类)的包不进行混淆编译

-keep class com.android.model.** {*;}