混淆规则

本文详细介绍了ProGuard的四个功能:压缩、优化、混淆和预检,并提供了各种混淆指令的示例,如-keep、-keepnames等。重点讨论了如何保护类和成员不被混淆,并给出了Android开发中常用的混淆配置,包括保留特定类、方法和成员,以及处理反射、序列化和本地方法。此外,还提到了混淆过程中遇到的问题和解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ProGuard一共包括四个功能
1.压缩(Shrink) 2.优化(Optimize) 3.混淆(Obfuscate) 4.预检(Preveirfy)
ProGuard是一个开源项目,在SourceForge上进行维护
http://ProGuard.sourceforge.net  可以下载查看官方文档和示例
一、基本指令
防止被移除或者重命名
防止被重命名
类和类成员
-keep
-keepnames
仅类成员
-keepclassmembers
-keepclassmembernames
如果拥有某成员,保留类和类成员
-keepclasseswithmembers
-keepclasswithmembernames
<init>; 匹配所有构造器
<fields>; 匹配所有域
<methods>; 匹配所有方法
-keep class 包名.**{*;}  两星表示本包和所含子包下的类名都保持一星表示本包保持,包下子类还是会被混淆,大括号中*表示内容也不混

-keep {Modifier} {class_specification} 保护指定的类文件和类的成员
-keepclassmembers {Modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护得更好
-keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类的成员是要存在的
-keepnams {class_specification} 保护指定的类的成员和名称(如果他们不会在压缩的过程中被删除)
-keepclassmembernames {class_specification} 保护指定类的成员的名称(如果他们不会在压缩的过程中被删除)
-keepclasseswithmembersnams {class_specification} 保护指定的类和类成员的名称,如果所有指定的类成员出席(在压缩之后)
-printseeds {filename} 列出类和类成员-keep选项的清单,标准输出到给定的文件
例如:
# 指定Keep类名不被混淆,类中的方法和成员仍然会被混淆
-keep class 类名
# 指定Keep类名不被混淆,且Keep的sayHello方法和成员helloStr不被混淆
-keep class 类名{
      public void 方法名();
      private static final java.lang.String 属性名;
}
# 指定Keepclassmembers的sayHello方法不被混淆,注意Keepclassmembers的类名仍然会被混淆
-keepclassmembers class 类名 {
    public void 方法名();
}
# 通过成员来指定哪些类的类名和成员不被混淆,没有被指定的方法还是会被混淆
-keepclasseswithmembers public class 类名 {
    public static void main(java.lang.String[]);
}
# 指定 keepnames 类名以及 sayHello 方法不被混淆,但需要注意的是,若 sayHello 方法未被使用,会在压缩阶段被移除掉
-keepnames public class site.hanschen.proguard.keepnames {
    public void sayHello();
}

#========================基本不动区域=========================
# 指定代码的压缩级别 0 - 7(指定代码进行迭代优化的次数,在Android里面默认是5,这条指令也只有在可以优化时起作用。)
# -optimizationpasses 5
# 混淆时不使用大小写混合类名,混淆后的类名为小写
-dontusemixedcaseclassnames
# 指定不去忽略非公共的库的类(不跳过library中的非public的类)
-dontskipnonpubliclibraryclasses
# 指定不

### 关于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、付费专栏及课程。

余额充值