8

我希望 proguard 混淆类名。我在 Proguard.cfg 中有这一行

-keepclasseswithmembers class * {
public static <fields>;
}

-keepnames class * implements java.io.Serializable
-keep public class com.google.**

我注意到没有混淆的是类名。所以运行 jdgui 我看到 com/test/abcd/ActualClass.java public class ActualClassName extends Activity 等

此外,我看到返回真实类名的方法。喜欢

 ActualClassname aa();

并导入语句,如

 import com.abcd.ActualClassName

如何让 Proguard 混淆类名本身。我看到的不仅仅是活动,我的适配器没有被混淆。好吧,有混淆,但没有类名。

上面的规则是否可以防止类名被混淆?

更新:我已经删除了上面的规则,并且没有从 Android 扩展任何东西的实用程序类没有被混淆。我现在想知道是否有一些关于保留类的类名的隐含规则,这些类的类名是从像 Activity 派生类一样保留的类中引用的?名称未被混淆的类有一些共同点:

1) 静态方法 2) 导入其他类型,这些类型与从活动派生或可序列化的类型一样。3) 它们具有带有其他类参数的方法(其中一些可能需要保留)。

但是,我没有特别要求保留这些实用程序类的地方。

4

2 回答 2

2

您的代码中出现了几个类,它们必须保留相同的完全限定类名,以便能够找到它们。上面的一个示例是所有Activity类,因为它们在清单中通过它们的全名作为字符串定义。如果要重命名该类,那么 Android 将无法再找到它们。

典型的 Proguard 配置将引用 Android SDK 中的 Proguard 配置,其中包括如下几行重要的行:

-keep public class * extends android.app.Activity
于 2012-05-08T06:55:42.980 回答
1

我认为您的问题来自您的第一行:'-keepclasseswithmembers' 包含类名,因此在您的情况下,任何具有静态字段的类都将保留其名称。将其更改为简单的“-keepclassmembers”将混淆类名,同时保持静态字段不变(我假设您想要这样做)。

也就是说,我不确定你为什么要这样做。如果您尝试保留静态变量名称,您是否也想保留类名称,看看您将如何访问静态字段?为什么要保留所有静态变量名称?

于 2012-05-08T06:40:12.470 回答