Proguard keep Inner Class

本文详细介绍了如何使用ProGuard进行特定类和内部类的保留配置。通过具体的代码示例,展示了如何确保应用程序中指定的类及其内部类不被混淆工具移除。

stackoverflow上找到了答案:

-keepattributes Exceptions,InnerClasses,... 
-keep class [packagename].A{ 
    *; 

-keep class [packagename].A$* { 
    *; 



其中 A$* 表示所有A的内部类都保留下来,也可以如下使用:


[html] view plaincopy在CODE上查看代码片派生到我的代码片
-keepattributes Exceptions,InnerClasses,... 
-keep class com.xxx.A{ *; } 
-keep class com.xxx.A$

 

<think>我们正在讨论ProGuard混淆类名的配置方法。根据用户的问题,他想要配置ProGuard以混淆类名。在ProGuard中,混淆类名是通过使用-obfuscation指令和指定混淆字典来实现的,但默认情况下,ProGuard会混淆类名(除了被keep的类)。因此,我们可能需要关注如何确保类名被混淆,以及如何排除某些类不被混淆。 首先,回顾一下ProGuard的基本配置: - 默认情况下,ProGuard会混淆类名、字段名、方法名等,但有一些类会被排除,比如主活动、服务等,因为它们在AndroidManifest.xml中被引用,需要保留原名。因此,我们需要通过配置来指定哪些类需要保留,哪些类需要被混淆。 用户特别关注类名的混淆,那么我们需要: 1. 确保没有使用`-keep`指令保留类名(除了必要的类)。 2. 使用`-keepnames`或`-keepattributes`来保留某些属性,但不会阻止类名被混淆(除非这些属性与类名相关)。 但是,有时候我们可能希望保留某些类的类名(例如,被反射使用的类),那么就需要使用`-keep`指令来保留它们。如果不保留,这些类名会被混淆。 因此,混淆类名的基本配置就是:不要保留那些你希望混淆的类。 例如,如果我们想要混淆所有类名,除了主活动(因为它在AndroidManifest.xml中声明),我们可以这样配置: ``` -keep public class com.example.MainActivity ``` 这样,只有MainActivity的类名会被保留,其他类都会被混淆。 但是,如果我们想要混淆所有类,包括主活动,那么我们可以不保留主活动,但这样会导致应用启动失败,因为Android系统需要根据AndroidManifest.xml中的类名来启动活动。因此,我们必须保留在AndroidManifest.xml中声明的组件的类名。 所以,通常的做法是使用Android SDK提供的默认proguard-android.txt文件,它已经包含了一些保留规则,然后我们可以在自己的proguard-rules.pro文件中添加额外的规则。 为了混淆类名,我们不需要特别配置,因为这是ProGuard默认的行为。但是,如果我们发现某些类没有被混淆,那可能是因为它们被keep了。我们需要检查我们的配置,移除不必要的keep规则。 另外,ProGuard还提供了重命名类的选项,我们可以使用`-obfuscationdictionary`来指定一个字典文件,这样混淆后的类名将使用字典中的单词,而不是默认的a,b,c等。 例如: ``` -obfuscationdictionary dictionary.txt ``` 其中dictionary.txt是一个包含单词列表的文本文件(每行一个单词)。 我们还可以使用`-classobfuscationdictionary`来指定类名的混淆字典。 另外,如果我们想要保留包名(即不混淆包名,只混淆类名),我们可以使用`-keeppackagenames`选项。但是,默认情况下,包名也会被混淆。如果我们想保留某个包名,可以使用: ``` -keep class com.example.mypackage.** { *; } ``` 这样,整个包下的类名都不会被混淆。 所以,总结一下混淆类名的配置步骤: 1. 确保在build.gradle中启用ProGuard(或R8,因为R8也兼容ProGuard规则)。 2. 在proguard-rules.pro文件中,不要对需要混淆的类使用`-keep`。只保留那些必须保留的类(如Android组件、JNI接口、反射使用的类等)。 3. 如果需要,可以通过`-obfuscationdictionary`或`-classobfuscationdictionary`指定混淆字典。 4. 通过`-dontobfuscate`可以禁用混淆(包括类名混淆),确保没有使用这个选项。 例如,一个典型的配置可能如下(在proguard-rules.pro文件中): ``` # 保留AndroidManifest中声明的类 -keep public class * extends android.app.Activity -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 # 保留带有本地方法的类和它们的类名(因为JNI调用需要类名) -keepclasseswithmembernames class * { native <methods>; } # 保留自定义视图(在XML布局中使用) -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*(...); } ``` 这样,除了以上保留的类,其他类名都会被混淆。 如果用户想要混淆所有类,包括上述保留的类,那么需要移除这些保留规则,但这样可能会导致运行时错误(如活动无法启动)。因此,不建议混淆Android组件。 另外,对于使用反射的类,我们需要保留类名,否则反射会失败。例如: ``` -keep class com.example.MyClassThatUsesReflection { *; } ``` 所以,用户需要根据自己项目的情况,确定哪些类需要保留,哪些类可以混淆。 最后,生成相关问题。</think>### ProGuard 混淆类名的配置方法 在 ProGuard 中混淆类名主要通过以下配置实现: 1. **基础混淆规则**(默认启用) ProGuard 默认会混淆所有非保留的类名,将类名替换为短随机字符(如 `a`, `b`, `c`): ```pro # 默认启用混淆(无需显式声明) -dontobfuscate false # 默认值,可省略 ``` 2. **排除特定类不被混淆** 使用 `-keep` 保留需排除的类名(如主 Activity/JNI 类): ```pro -keep public class com.example.MainActivity # 保留主活动 -keep class com.example.jni.** # 保留 JNI 相关类 ``` 3. **自定义混淆字典**(可选) 用字典替换默认的随机字符: ```pro -obfuscationdictionary dictionary.txt # 字典文件(每行一个单词) ``` *示例字典文件 `dictionary.txt`:* ``` Alpha Beta Gamma ``` 4. **保留类属性** 确保混淆后仍能调试(保留行号/源文件名): ```pro -keepattributes SourceFile,LineNumberTable # 关键调试属性[^2] ``` 5. **完整配置示例**: ```pro # 混淆所有类名(默认行为) -optimizationpasses 5 -allowaccessmodification # 保留 Android 组件 -keep public class * extends android.app.Activity -keep public class * extends android.app.Service # 使用自定义混淆字典 -obfuscationdictionary obfuscation_dict.txt # 保留关键调试信息 -keepattributes Exceptions,InnerClasses,Signature,Deprecated ``` > ⚠️ **注意事项** > - 混淆后需通过 `mapping.txt` 反解堆栈跟踪(路径:`app/build/outputs/mapping/release/mapping.txt`) > - 反射调用的类必须手动保留(否则会引发 `ClassNotFoundException`) > - 使用 `-dontwarn` 忽略第三方库的警告 [^1]: ProGuard 最全混淆规则说明 [^2]: ProGuard混淆代码学习笔记 之 代码混淆指令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值