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 に答える