混淆规则

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\adt-bundle-windows-x86-20140702\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# 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 *;
#}
-optimizationpasses 5  #指定代码的压缩级别 0 - 7,一般都是5,无需改变
-dontusemixedcaseclassnames #不使用大小写混合
#告诉Proguard 不要跳过对非公开类的处理,默认是跳过
-dontskipnonpubliclibraryclasses #如果应用程序引入的有jar包,并且混淆jar包里面的class
-verbose #混淆时记录日志(混淆后生产映射文件 map 类名 -> 转化后类名的映射
#指定混淆时的算法,后面的参数是一个过滤器
#这个过滤器是谷歌推荐的算法,一般也不会改变
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#类型转换错误 添加如下代码以便过滤泛型(不写可能会出现类型转换错误,一般情况把这个加上就是了),即避免泛型被混淆
-keepattributes Signature
#假如项目中有用到注解,应加入这行配置,对JSON实体映射也很重要,eg:fastjson
-keepattributes *Annotation*
#抛出异常时保留代码行数
-keepattributes SourceFile,LineNumberTable
#保持 native 的方法不去混淆
-keepclasseswithmembernames class * {
    native <methods>;
}
#第三方开源框架以及第三方jar包中的代码不是我们的目标和关心的对象,因此我们全部忽略不进行混淆。
#EventBus的代码没必要混合
-keep class com.XXX.eventbus.** { *; }
-keep class com.XXX.event.** { *; }
-keep class com.XXX.eventbus.util.** { *; }
-keep class android.os.**{*;}
-keepclassmembers class ** {
    public void onEvent*(**);
}
#百度地图API不混淆
-keep class com.baidu.** { *; }
-keep class vi.com.gdi.bgl.android.**{*;}
#友盟统计
-keepclassmembers class * {
   public <init>(org.json.JSONObject);
}
#litepal 数据库框架
-dontwarn org.litepal.*
-keep class org.litepal.** { *; }
-keep enum org.litepal.**
-keep interface org.litepal.** { *; }
-keep public class * extends org.litepal.**
-keepclassmembers class * extends org.litepal.crud.DataSupport{*;}
#ShareSDK
-keep class cn.sharesdk.**{*;}
-keep class com.sina.**{*;}
-keep class **.R$* {*;}
-keep class **.R{*;}
-dontwarn cn.sharesdk.**
-dontwarn **.R$*
-keep class m.framework.**{*;}
#个推
-dontwarn com.igexin.**
-dontwarn android.support.**
-keep class com.igexin.**{*;}
-keep class com.igexin.push.extension.distribution.basic.headsup.**{*;}
#v4包下的文件都不要混淆 -dontwarn   如果有警告也不终止
-dontwarn android.support.v4.**
-keep class android.support.v4.app.**{*;}
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment  #所有fragment的子类不要去混淆
-keep public class * extends android.app.Activity  #所有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.view.View
-keep public class com.android.vending.licensing.ILicensingService
#保持指定规则的方法不被混淆(Android layout 布局文件中为控件配置的onClick方法不能混淆)
-keepclassmembers class * extends android.app.Activity {
    public void *(android.view.View);
}
#保持自定义控件指定规则的方法不被混淆
-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}
#保持枚举 enum 不被混淆
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
#保持 Parcelable 不被混淆(aidl文件不能去混淆)
-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}
#需要序列化和反序列化的类不能被混淆(注:Java反射用到的类也不能被混淆)
-keepnames class * implements java.io.Serializable
#保护实现接口Serializable的类中,指定规则的类成员不被混淆
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
#保持R文件不被混淆,否则,你的反射是获取不到资源id的
-keep class **.R$* { *; }
#以下针对App本身设置
#保护WebView对HTML页面的API不被混淆
-keep class **.Webview2JsInterface { *; }
#如果你的项目中用到了webview的复杂操作,最好加入
-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.WebChromeClient {
  public void *(android.webkit.WebView,java.lang.String);
}
#对WebView的简单说明下:经过实战检验,做腾讯QQ登录,如果引用他们提供的jar,
#若不加防止WebChromeClient混淆的代码,oauth认证无法回调,反编译基代码后可看到他们有用到WebChromeClient,加入此代码即可。
#转换JSON的JavaBean,类成员名称保护,使其不被混淆
-keepclassmembernames class com.cgv.cn.movie.common.bean.** { *; }
#保证自定义类不被混淆 XXX换成你自己的包名
-keep class com.XXX.view.** {*;}
# 保持实体数据结构接口不被混淆(也就是被GSON注解的实体结构)此处是自己接口的包名 XXX换成你自己的包名
-keep class com.XXX.model.** { *; }
#使用gson包解析数据时,出现 missing type parameter 异常,添加如下代码
-dontobfuscate #不混淆输入的类文件
-dontoptimize  #不优化输入的类文件
# 不混淆 GSON
-keep class com.google.gson.** { *; }
-keep class com.google.gson.JsonObject {*;}
-keep class org.json.** {*;}
-keep class com.badlogic.** { *;}
-keep class * extends com.badlogic.gdx.utils.Json*
-keep class com.google.** {*;}
-keep class sun.misc.Unsafe { *; }
-keep class com.futurice.project.models.pojo.** { *; }
#volley
-keep class com.android.volley.**{*;}
-keep class com.android.volley.** {*;}
-keep class com.android.volley.toolbox.** {*;}
-keep class com.android.volley.Response$* { *; }
-keep class com.android.volley.Request$* { *; }
-keep class com.android.volley.RequestQueue$* { *; }
-keep class com.android.volley.toolbox.HurlStack$* { *; }
-keep class com.android.volley.toolbox.ImageLoader$* { *; }
#fresco 防止该包下native类别优化时处理掉,运行奔溃
-keep class com.facebook.imagepipeline.nativecode.**{*;}
-keep class android.os.**{*;}
#第3方即时通信:环信不混淆
-keep class com.easemob.** {*;}
-keep class org.jivesoftware.** {*;}
-keep class org.apache.** {*;}
-dontwarn  com.easemob.**
#2.0.9后的不需要加下面这个keep
#-keep class org.xbill.DNS.** {*;}
#另外,demo中发送表情的时候使用到反射,需要keep SmileUtils
-keep class com.easemob.chatuidemo.utils.SmileUtils {*;}
#注意前面的包名,如果把这个类复制到自己的项目底下,比如放在com.example.utils底下,应该这么写(实际要去掉#)
#-keep class com.example.utils.SmileUtils {*;}
#如果使用easeui库,需要这么写
-keep class com.easemob.easeui.utils.EaseSmileUtils {*;}
#2.0.9后加入语音通话功能,如需使用此功能的api,加入以下keep
-dontwarn ch.imvs.**
-dontwarn org.slf4j.**
-keep class org.ice4j.** {*;}
-keep class net.java.sip.** {*;}
-keep class org.webrtc.voiceengine.** {*;}
-keep class org.bitlet.** {*;}
-keep class org.slf4j.** {*;}
-keep class ch.imvs.** {*;}
 

### 关于Android ProGuard 混淆规则配置教程及最佳实践 #### 什么是ProGuard? ProGuard 是一种用于 Java 字节码的压缩、优化和混淆工具。它通过移除未使用的类、字段、方法以及属性,优化字节码,并使用简短且无意义的名字重命名类、字段和方法来减少 APK 文件大小并提高安全性[^2]。 --- #### ProGuard 的主要功能 ProGuard 提供了四种核心功能: 1. **压缩 (Shrink)**:检测并删除未使用的类、字段、方法和属性。 2. **优化 (Optimize)**:优化字节码以提升性能。 3. **混淆 (Obfuscate)**:将类名、方法名和变量名替换为简短且难以理解的形式。 4. **预校验 (Preverify)**:验证处理后的代码是否可以在目标环境中运行[^3]。 --- #### 配置文件结构 ProGuard 的配置通常由两个部分组成: 1. 默认配置文件 `proguard-android-optimize.txt`:这是 Android SDK 自带的标准配置文件,包含了通用的最佳实践设置[^1]。 2. 用户自定义配置文件 `proguard-rules.pro`:开发者可以根据具体需求在此文件中添加额外的规则。 默认情况下,在 Gradle 构建脚本中启用 ProGuard 后,会自动加载这两个文件的内容。 --- #### 如何启用 ProGuard? 在模块级别的 `build.gradle` 文件中,可以通过以下方式启用 ProGuard: ```gradle android { buildTypes { release { minifyEnabled true // 开启代码混淆 shrinkResources true // 移除未使用的资源 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } ``` 上述配置表示在发布版本 (`release`) 中启用代码混淆,并指定使用默认配置文件和自定义规则文件[^1]。 --- #### 常见的 ProGuard 规则 以下是几个常见的 ProGuard 规则及其作用: 1. **保留特定类或方法** 如果某些类或方法需要保持原始名称(例如对外暴露的 API 或回调接口),可以使用 `-keep` 规则: ```text -keep public class com.example.MyPublicClass { *; } // 保留整个类 -keepclassmembers class com.example.MyCallbackInterface { *; } // 仅保留成员 ``` 2. **保留注解相关的类** 对于依赖注解框架的应用程序(如 Retrofit 或 ButterKnife),需要特别注意保留注解信息: ```text -keepattributes *Annotation* // 保留所有注解 -keep @interface android.support.annotation.* { *; } // 保留支持库中的注解 ``` 3. **避免混淆第三方库** 第三方库通常有自己的混淆规则,建议直接排除这些库的混淆操作: ```text -dontwarn com.thirdparty.library.** // 忽略警告 -keep class com.thirdparty.library.** { *; } // 不混淆该库 ``` 4. **调试模式下的日志输出** 在调试阶段可能会禁用日志打印以防止敏感信息泄露: ```text -assumenosideeffects class android.util.Log { public static boolean isLoggable(java.lang.String, int); public static *** d(...); public static *** v(...); public static *** i(...); public static *** w(...); public static *** e(...); } ``` 5. **Lambda 表达式的兼容性** 如果应用程序使用了 Lambda 表达式,则需确保其正常工作: ```text -keepattributes InnerClasses,EnclosingMethod,LambdaMetafactory ``` --- #### 最佳实践总结 1. **测试覆盖率**:在启用 ProGuard 后进行全面的功能测试,尤其是涉及动态调用的部分。 2. **分层管理规则**:将公共规则放在全局配置文件中,特殊规则放入单独的子模块配置文件。 3. **文档化规则**:记录每条规则的目的,便于后续维护。 4. **监控构建过程**:关注构建过程中可能出现的警告信息,及时调整规则以解决问题。 --- #### 示例代码片段 以下是一个完整的 `proguard-rules.pro` 示例: ```text # 保留 R 类 -keepclassmembers class **.R$* { public static <fields>; } # 保留 Parcelable 实现类 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR; } # 保留枚举类型 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # 保留注解信息 -keepattributes *Annotation* # 排除 Log 输出 -assumenosideeffects class android.util.Log { public static boolean isLoggable(java.lang.String, int); public static *** d(...); public static *** v(...); public static *** i(...); public static *** w(...); public static *** e(...); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值