2013-07-16 5 views
5

Wenn ich eine Class B habe, die Interface A implementiert und Proguard die Existenz dieser Schnittstelle nicht bekannt ist, Wie kann ich die Namen der Methoden beibehalten, die die abstrakten Methoden der Schnittstelle A implementieren?Wie behält man Klassenmethoden, die überschreiben, um eine andere Methode zu verbergen?

Bitte beachten Sie, dass ich die Methodennamen behalten möchte, aber ich möchte, dass ihr Inhalt verschleiert wird.

Update: Das ist, was ich habe (beachten Sie bitte die Kommentare):

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 
     } 

} 

ich eine allgemeine Lösung für diese Art von Fällen wollen - ich will nicht in den Zustand Schnittstellen Namen in der ProGuard Konfiguration.

+0

@Raghunandan der Kommentar geschrieben Sie ist irrelavant !! Du hast hier die Frage eines anderen beantwortet !! Finden Sie mein Blog für Progaurd bei http://techspreadwithshraddha.wordpress.com/2013/03/26/android-progaurd/ – Shraddha

+0

@Shraddha danke für die Erinnerung. hat wahrscheinlich eine falsche Registerkarte meines Browsers geöffnet. – Raghunandan

Antwort

6
  • alle öffentlichen Klassennamen zu halten und halten (verhindern Verschleierung) von ihre öffentlichen und geschützte Methoden.
  • In nicht-öffentlichen Klassen und behalten (Verhütung Verschleierung) alle öffentlichen und geschützten Methoden. Dadurch werden die Methoden, die andere Methoden implementieren oder erweitern könnten, davon abgehalten, verschleiert zu werden.
  • Behalten Sie nicht die lokalen Variablenattribute (machen Sie sicher, dass "LocalVariableTable" und "LocalVariableTypeTable" nicht sind, die in der Option "-keepattributes" angegeben werden).

So Ihre .proDatei sollte wie folgt aussehen -

#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* 
+0

+1 Dies löst das Problem – Shraddha

+0

@RonTesler, Wie nur eine Klasse und seine öffentliche Methode zu verschleiern? –

0

Ich habe einen Blog geschrieben für Progaurding die Android-Anwendung. Überprüfen Sie bitte den unten stehenden Link

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

ProGuard können tun, was Sie beschreiben. Wenn Sie nicht wollen, es Klassen und Methoden benennen, Bitte versuchen Sie folgendes ein:

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

this helps

+0

Tut mir leid, wenn ich nicht klar darüber war - ich möchte den Namen der Schnittstelle nicht angeben. Ich versuche eine allgemeine Lösung zu finden. Ist es möglich? –

+0

Ich habe meine Antwort bearbeitet. Beachten Sie das '*' in der Antwort, schreiben Sie '*', wann immer Sie es generisch behalten möchten. Bitte folgen Sie dem Blog, es wird Ihnen helfen. Es hat ein Beispiel für Android-Anwendung – Shraddha

+0

Korrigieren Sie mich, wenn ich falsch liege, aber tun, wie Sie vorgeschlagen, behält den Namen der Klasse und alle Namen der Methode, aber sie werden auch nicht verschleiert werden. –

Verwandte Themen