第一步 : 在build.gradle中做如下配置

注 : 可以分别配置debug与release的混淆配置

android {    buildTypes {        debug {            minifyEnabled true     //混淆            zipAlignEnabled true   //zipalign优化            shrinkResources true   //移除无用的resource文件            //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }        release {            minifyEnabled true     //混淆            zipAlignEnabled true   //zipalign优化            shrinkResources true   //移除无用的resource文件            //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}

第二步 : 配置proguard-rules.pro文件

以下是根据本人实际项目中做出的配置,可以参考

# Add project specific ProGuard rules here.# You can control the set of applied configuration files using the# proguardFiles setting in build.gradle.## For more details, see#   http://developer.android.com/guide/developing/tools/proguard.html# If your project uses WebView with JS, uncomment the following# and specify the fully qualified class name to the JavaScript interface# class:#-keepclassmembers class fqcn.of.javascript.interface.for.webview {#   public *;#}# Uncomment this to preserve the line number information for# debugging stack traces.#-keepattributes SourceFile,LineNumberTable# If you keep the line number information, uncomment this to# hide the original source file name.#-renamesourcefileattribute SourceFile# * 混淆日志生成目录:app.build.outputs.mapping下,打包时请拷贝此日志,用于错误日志还原分析.#--------------------------------------------- 公共配置 ----------------------------------------#-optimizationpasses 5 # 代码混淆压缩比-dontusemixedcaseclassnames   # 混合时不使用大小写混合,混合后的类名为小写-dontskipnonpubliclibraryclasses #  指定不去忽略非公共的库类。-dontskipnonpubliclibraryclassmembers # 指定不去忽略非公共库的类成员-dontpreverify  # 混淆时不做预校验-verbose # 使我们的项目混淆后产生映射文件 : 包含有类名->混淆后类名的映射关系-ignorewarnings # 忽略所有警告-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*# 指定混淆是采用的算法,后面的参数是一个过滤器(谷歌推荐的算法,一般不做更改)-keepattributes *Annotation*,InnerClasses #保留注解不混淆-keepattributes Signature # 避免混淆泛型-keepattributes SourceFile,LineNumberTable# 抛出异常时保留代码行号#--------------------------------------------- 公共配置 End ----------------------------------------##--------------------------------------------- Java ----------------------------------------#-keepclasseswithmembernames class * { # 保留本地native方法不被混淆    native ;}-keepclassmembers enum * {# 保留枚举类不被混淆    public static **[] values();    public static ** valueOf(java.lang.String);}-keepclassmembers class * {# 保留JsonObject不被混淆   public  (org.json.JSONObject);}-keep class * implements android.os.Parcelable {# 保留Parcelable序列化类不被混淆  public static final android.os.Parcelable$Creator *;}-keepnames class * implements java.io.Serializable-keepclassmembers class * implements java.io.Serializable {# 保留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();}#--------------------------------------------- Java End ----------------------------------------##--------------------------------------------- Android 系统 ----------------------------------------#-keep public class * extends android.view.View-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 com.android.vending.licensing.ILicensingService-keep class **.R$* { *; }# 保留R下面的资源-keep class android.support.** { *; }# 保留support下的所有类及其内部类-keep public class * extends android.support.v4.**-keep public class * extends android.support.v7.**-keep public class * extends android.support.annotation.**-keepclassmembers class * extends android.app.Activity{#保留在Activity中的方法参数是view的方法(这样以来我们在layout中写的onClick就不会被影响)    public void *(android.view.View);}-keepclasseswithmembers class * {    public (android.content.Context, android.util.AttributeSet);}-keepclasseswithmembers class * {    public (android.content.Context, android.util.AttributeSet, int);}-keepclassmembers class * {# 对于带有回调函数的**on*Event、**On*Listener 不被混淆    void *(**On*Event);    void *(**On*Listener);}#--------------------------------------------- Android 系统 End ----------------------------------------##--------------------------------------------- 继承类混淆配置 ----------------------------------------#-keep interface com.acmenxd.frame.utils.proguard.** { *; }-keep class * implements com.acmenxd.frame.utils.proguard.IKeepClass-keepnames class * implements com.acmenxd.frame.utils.proguard.IKeepClassName-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepFieldName {    ;}-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepPublicFieldName {    public ;}-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepMethodName {    ;}-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepPublicMethodName {    public ;}#--------------------------------------------- 继承类混淆配置 End ----------------------------------------##--------------------------------------------- 依赖库混淆配置 ----------------------------------------##libs#rxjava & rxandroid-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;}#okhttp3-dontwarn okio.**-dontwarn okhttp3.**-dontwarn com.squareup.okhttp3.**#retrofit2-dontwarn retrofit2.**-keep class retrofit2.** { *; }-keepattributes Signature-keepattributes Exceptions#FrescoView-dontwarn okio.**-dontwarn okhttp3.**-dontwarn com.squareup.okhttp3.**-dontwarn javax.annotation.**-dontwarn com.android.volley.toolbox.**-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip-keep @com.facebook.common.internal.DoNotStrip class *-keepclassmembers class * {    @com.facebook.common.internal.DoNotStrip *;}-keepclassmembers class * {    native ;}#Glide-keep public class * implements com.bumptech.glide.module.GlideModule-keep class com.bumptech.glide.** {    *;}#greenDAO 3.2.0#-keep class * extends org.greenrobot.greendao.AbstractDao{ *; }-keep class org.greenrobot.greendao.**{*;}-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {    public static java.lang.String TABLENAME;}-keep class **$Properties#eventbus 3.0.0-keepattributes *Annotation*-keepclassmembers class ** {    @org.greenrobot.eventbus.Subscribe ;}-keep enum org.greenrobot.eventbus.ThreadMode { *; }-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {    (java.lang.Throwable);}#--------------------------------------------- 项目混淆 处理 ----------------------------------------#-keep class com.acmenxd.core.model.**{ *; } # 实体类-keep class com.acmenxd.mvp.model.**{ *; } # 实体类#--------------------------------------------- 反射类 处理 ----------------------------------------##--------------------------------------------- WebView 处理 ----------------------------------------##--------------------------------------------- js交互 处理 ----------------------------------------#

解释部分 -> 继承混淆类配置

其作用是避免 在实际项目中N多个类或包 需要做混淆配置, 导致proguard-rules.pro文件过于混乱
其实现方式是 :
一. 在项目中定义接口,如下 :

/** * @author AcmenXD * @version v1.0 * @github https://github.com/AcmenXD * @date 2017/2/21 18:00 * @detail 实现此接口的类 -> 将保持整个类都不混淆 */public interface IKeepClass extends IKeepFieldName, IKeepMethodName {}
/** * @author AcmenXD * @version v1.0 * @github https://github.com/AcmenXD * @date 2017/2/21 18:00 * @detail 实现此接口的类 -> 将保持类名不混淆 */public interface IKeepClassName {}
/** * @author AcmenXD * @version v1.0 * @github https://github.com/AcmenXD * @date 2017/2/21 18:00 * @detail 实现此接口的类 -> 将保持类名和成员变量都不混淆 */public interface IKeepFieldName extends IKeepClassName {}
/** * @author AcmenXD * @version v1.0 * @github https://github.com/AcmenXD * @date 2017/2/21 18:00 * @detail 实现此接口的类 -> 将保持类名和方法名都不混淆 */public interface IKeepMethodName extends IKeepClassName {}
/** * @author AcmenXD * @version v1.0 * @github https://github.com/AcmenXD * @date 2017/2/21 18:00 * @detail 实现此接口的类 -> 将保持类名和public成员变量都不混淆 */public interface IKeepPublicFieldName extends IKeepClassName {}
/** * @author AcmenXD * @version v1.0 * @github https://github.com/AcmenXD * @date 2017/2/21 18:00 * @detail 实现此接口的类 -> 将保持类名和public方法名都不混淆 */public interface IKeepPublicMethodName extends IKeepClassName {}

二. 在proguard-rules.pro文件添加如下内容

#--------------------------------------------- 继承类混淆配置 ----------------------------------------#-keep interface com.acmenxd.frame.utils.proguard.** { *; }-keep class * implements com.acmenxd.frame.utils.proguard.IKeepClass-keepnames class * implements com.acmenxd.frame.utils.proguard.IKeepClassName-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepFieldName {    ;}-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepPublicFieldName {    public ;}-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepMethodName {    ;}-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepPublicMethodName {    public ;}#--------------------------------------------- 继承类混淆配置 End ----------------------------------------#

三. 使用

/** 实现IKeepClass类,所以TestA整个类都不混淆,并且无需再proguard-rules.pro配置 */public class TestA implements IKeepClass{}
/** 实现IKeepClassName类,所以TestA类名不混淆,并且无需再proguard-rules.pro配置 */public class TestA implements IKeepClassName{}
/** 实现IKeepFieldName类,所以TestA类名和成员变量都不混淆,并且无需再proguard-rules.pro配置 */public class TestA implements IKeepFieldName{}
/** 实现IKeepMethodName类,所以TestA类名和方法名都不混淆,并且无需再proguard-rules.pro配置 */public class TestA implements IKeepMethodName{}

End

更多相关文章

  1. 1. NDK Android(安卓)jni开发 2种so库编译 cmake(相机图片美化)
  2. Android积累之《Android(安卓)strings.xml文件定义字符串中的标
  3. Android应用开发相关下载资源(2014/12/14更新) 【转】
  4. Android(安卓)NDK r8b 和 FFmpeg 0.11.2 移植
  5. android去权限反编译,签名,zipalign优化
  6. android使用ant自动打包(更改java文件中的属性值,批量自动生成)
  7. Android(安卓)将Activity设为Dialog样式,并铺满全屏
  8. uevent拔插事件分析--基于imx8
  9. fragment和radiobutton做出类tabhost效果

随机推荐

  1. Android(安卓)Java调用.so和.a、Unity C#
  2. android中onKeyDown()事件的分析
  3. android TabLayout添加点击事件
  4. Android(安卓)Studio Cannot find local
  5. [Android]getevent,sendevent,input命令
  6. PC安卓模拟器 PANIC: Could not open: C:
  7. OPhone 2.0的2D动画实践(三)
  8. Test Android(安卓)with QTP
  9. OkHttp源码解析
  10. Android(安卓)ANR 分析学习总结(转)