如何告诉Proguard混淆类名

时间:2012-05-08 02:09:56

标签: android proguard

我想用proguard来混淆类名。我在Proguard.cfg

中有这一行
-keepclasseswithmembers class * {
public static <fields>;
}

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

我注意到没有混淆的是班级名称。所以运行jdgui我明白了 COM /测试/ ABCD / ActualClass.java public class ActualClassName扩展了Activity等

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

 ActualClassname aa();

并导入类似

的语句
 import com.abcd.ActualClassName

如何让Proguard对类名本身进行模糊处理。它不仅适用于我看到的活动,我的适配器也没有被混淆。好吧,有混淆但不是类名。

上面的规则是什么阻止了类名被混淆了?

更新:我已经删除了上面的规则,并且没有从Android扩展任何东西的Utility类没有被混淆。我现在想知道是否有一些隐含的规则来保持类的类名被保存为类派生类的类?名称未被混淆的类有一些共同点:

1)静态方法 2)导入其他类型的类型,如源自活动或可序列化的类型。 3)他们有方法与其他类的参数(其中一些可能需要保留)。

然而,我并没有特别要求保留这些实用程序类。

2 个答案:

答案 0 :(得分:3)

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

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

-keep public class * extends android.app.Activity

答案 1 :(得分:1)

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

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