5

如果我有一个Class B实现Interface A并且 Proguard 不知道该接口的存在,我如何保留实现接口 A 的抽象方法的方法的名称?

请注意,我想保留方法名称,但我确实希望它们的内容被混淆。

更新: 这就是我所拥有的(请注意评论):

public class MyService extends Service {

   // an anonymous class that implements ServiceConnection 
   private ServiceConnection myConnection = new ServiceConnection()
   {
      // don't change the following method's name
      @Override
      public void onServiceConnected(ComponentName className, IBinder service)
      {
          // I want this section to be obfuscated
      }

}

我想要一个针对这类情况的通用解决方案——我不想在 ProGuard 配置中声明接口名称。

4

2 回答 2

7
  • 保留所有公共类名并保留(防止混淆)它们的公共和受保护方法。
  • 在非公共类中并保留(防止混淆)所有公共和受保护的方法。这将防止可能实现或扩展其他方法的方法被混淆。
  • 不要保留局部变量属性(确保“-keepattributes”选项中没有说明“LocalVariableTable”和“LocalVariableTypeTable”)。

所以你的 .pro 文件应该是这样的 -

#Keeping all public class names and keep (prevent obfuscation) of their public and protected methods
-keep public class * {
    public protected <methods>;
}

# Keep (prevent obfuscation) all public and protected methods in non-public classes.
# Notice that the non-public class names will still get obfuscated
-keepclassmembers !public class * {
    public protected <methods>;
}

# Don't keep the local variables attributes (LocalVariableTable and LocalVariableTypeTable are dropped).
-keepattributes Exceptions,Signature,Deprecated,SourceFile,SourceDir,LineNumberTable,Synthetic,EnclosingMethod,RuntimeVisibleAnnotations,RuntimeInvisibleAnnotations,RuntimeVisibleParameterAnnotations,RuntimeInvisibleParameterAnnotations,AnnotationDefault,InnerClasses,*Annotation*
于 2013-07-16T17:56:35.453 回答
0

我为 Progaurding Android 应用程序写了一篇博客。请检查下面的链接

http://techspreadwithshraddha.wordpress.com/2013/03/26/android-progaurd/

ProGuard 可以做你描述的事情。如果您不希望它重命名类和方法,请尝试以下方法:

-keep,allowshrinking,allowoptimization class * { <methods>; }

希望这可以帮助

于 2013-07-16T12:29:22.523 回答