首页 文章

如何告诉Proguard混淆类名

提问于
浏览
7

我想用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公共类ActualClassName扩展Activity等

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

ActualClassname aa();

和导入语句一样

import com.abcd.ActualClassName

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

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

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

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

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

2 回答

  • 1

    您的代码中有几个类必须保留相同的完全限定类名,以便

    能够找到它们 . 上面的一个示例都是 Activity 类,因为它们在清单中以其全名作为String定义 . 如果proguard要重命名该类,则Android将无法再找到它们 .

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

    -keep public class * extends android.app.Activity
    
  • 3

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

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

相关问题