Android 常用三方库混淆规则整理
Android 应用开发中,代码混淆是保护知识产权和优化包体积的重要手段。本文整理了 Android 项目常用的 ProGuard/R8 混淆配置规则,涵盖基础指令、Android 组件保持、第三方库(如微信、友盟、Glide、OkHttp 等)的特定规则。通过合理配置 proguard-rules.pro 文件,可有效防止反编译并提升安全性。文中提供了各主流库的 keep 规则示例及注意事项,帮助开发者快速搭建混淆环境,避免运行时崩溃。

Android 应用开发中,代码混淆是保护知识产权和优化包体积的重要手段。本文整理了 Android 项目常用的 ProGuard/R8 混淆配置规则,涵盖基础指令、Android 组件保持、第三方库(如微信、友盟、Glide、OkHttp 等)的特定规则。通过合理配置 proguard-rules.pro 文件,可有效防止反编译并提升安全性。文中提供了各主流库的 keep 规则示例及注意事项,帮助开发者快速搭建混淆环境,避免运行时崩溃。

在 Android 应用发布前,代码混淆(Obfuscation)是保护核心逻辑、防止反编译以及减小安装包体积的关键步骤。Android Studio 默认集成 R8 编译器(基于 ProGuard),开发者需在 proguard-rules.pro 文件中配置相应的保留规则。若配置不当,可能导致应用运行崩溃或功能异常。本文将系统梳理 Android 开发中常用的混淆规则,涵盖基础指令、系统组件及主流第三方库的配置方案。
以下为基础通用配置,建议置于 proguard-rules.pro 文件头部。这些指令控制优化级别、警告处理及映射文件生成。
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-ignorewarnings
-dontpreverify
-verbose
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
说明:
-optimizationpasses 5:指定优化迭代次数,通常设为 5 即可平衡速度与效果。-printmapping:生成映射文件,用于线上崩溃堆栈还原。-dontpreverify:针对某些旧设备兼容性问题,可关闭预验证。Android 框架中的组件(Activity、Service、BroadcastReceiver 等)若被混淆,可能导致生命周期回调失效。必须显式保留其继承关系及构造方法。
-keep public class * extends android.support.v7.app.AppCompatActivity
-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
-keep class android.support.** {*;}
-keepclasseswithmembernames class * {
native <methods ;
}
-keepclassmembers class * extends android.support.v7.app AppCompatActivity{
public void *(android.view.View);
}
-keepclassmembers enum * { *; }
-keep public class * extends android.view.View{
*** get*();
void set*(***);
public <init (android.content.Context);
public <init (android.content.Context, android.util.AttributeSet);
public <init (android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
public <init (android.content.Context, android.util.AttributeSet);
public <init (android.content.Context, android.util.AttributeSet, int);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-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 class **.R$* {
*;
}
-keepclassmembers class * {
void *(**On*Event);
}
若应用内嵌 WebView 且存在 JavaScript 交互,需保留对应的接口方法,否则 JS 调用可能失败。
-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);
}
友盟 SDK 依赖反射和序列化,需保留其类结构。
-keep class com.umeng.** {*;}
-keepclassmembers class * {
public <init (org.json.JSONObject);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep public class [您的应用包名].R$*{
public static final int *;
}
微信开放平台 SDK 涉及加密通信,严禁混淆。
-keep class com.tencent.mm.opensdk.** { *; }
-keep class com.tencent.wxop.** { *; }
-keep class com.tencent.mm.sdk.** { *; }
Glide 模块和枚举值需保留以支持动态加载策略。
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
包含 JPush 和 Jiguang 两个版本,需忽略警告并保留核心类。
-dontoptimize
-dontpreverify
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
-keep class * extends cn.jpush.android.helpers.JPushMessageReceiver { *; }
-dontwarn cn.jiguang.**
-keep class cn.jiguang.** { *; }
网络库依赖反射和内部类,需保留接口实现。
-dontwarn okio.**
-keep class okio.**{*;}
-keep interface okio.**{*;}
-dontwarn okhttp3.**
-keep class okhttp3.**{*;}
-keep interface okhttp3.**{*;}
响应式编程库对队列节点敏感,需保留内部原子操作类。
-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;
}
JSON 解析与 HTTP 请求库需保留流处理器及 Converter 扩展。
-keep class com.google.gson.stream.** { *; }
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keep public class * extends retrofit2.Converter {*;}
数据库 ORM 框架需保留表名常量及属性类。
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties
# If you do not use SQLCipher:
-dontwarn org.greenrobot.greendao.database.**
# If you do not use Rx:
-dontwarn rx.**
完成配置后,务必进行真机测试。开启混淆构建时,观察 Logcat 是否有 ClassNotFoundException 或 NoSuchMethodException。若出现此类错误,需根据堆栈信息补充对应的 -keep 规则。
此外,建议定期更新混淆规则库,因为第三方库版本升级可能会引入新的反射机制。对于自定义的反射调用,应遵循'最小化原则',仅保留必要的字段和方法。
本文档旨在提供通用的混淆参考,具体配置请结合项目实际依赖调整。正确配置混淆规则不仅能提升应用安全性,还能有效减少 APK 体积。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online