Android 代码混淆基础与三方库规则详解
在 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 原生组件保持规则
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);
}


