2013-07-16 10 views
5

Jeśli mam Class B, który implementuje Interface A i Proguard nie jest świadomy istnienia tego interfejsu, Jak mogę zachować nazwy metod, które implementują abstrakcyjne metody interfejsu A?Jak zachować nazwy metod klas, które zastępują implementują inną metodę z zaciemniania?

Proszę zauważyć, że chcę zachować nazwy metod, ale chcę, aby ich zawartość została zaciemniona.

Aktualizacja: To, co mam (proszę zauważyć, komentarze):

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 
     } 

} 

Chcę ogólne rozwiązanie dla tego rodzaju przypadkach - nie chcę do interfejsów państwowe nazwy w Konfiguracja ProGuard.

+0

@Raghunandan komentarza, który pisał to irrelavant !! Odpowiedziałaś na czyjeś pytanie tutaj !! Proszę znaleźć mojego bloga dla Progaurd na http://techspreadwithshraddha.wordpress.com/2013/03/26/android-progaurd/ – Shraddha

+0

@ Shraddha dzięki za przypomnienie. prawdopodobnie otworzyłem niewłaściwą zakładkę przeglądarki. – Raghunandan

Odpowiedz

6
  • Utrzymanie wszystkich nazw klas publicznych i utrzymanie (zapobieganie zaciemniania) od ich publicznym i chronione metody.
  • W klasach niepublicznych i zachowaj (zapobiegnij obfuskacji) wszystkie chronione metody publiczne i . Dzięki temu metody, które mogą implementować lub rozszerzać inne metody, nie będą zaciemniane.
  • Nie przechowuj atrybutów zmiennych lokalnych (ustaw , aby upewnić się, że "LocalVariableTable" i "LocalVariableTypeTable" nie są określone w opcji "-keepattributes").

Więc .pro plik powinien wyglądać tak -

#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 To rozwiązuje problem – Shraddha

+0

@RonTesler, Jak zaciemnić tylko jedną klasę i jej publiczną metodę? –

0

Mam writtern na blogu do Progaurowania aplikacji na Androida. Proszę sprawdzić poniższy odnośnik

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

PROGUARD może robić to, co można opisać. Jeśli nie chcesz, aby zmienić nazwę klasy i metody, spróbuj wykonać następujący:

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

nadzieję, że to pomaga

+0

Przepraszam, jeśli nie miałem o tym pojęcia - nie chcę określać nazwy interfejsu. Próbuję znaleźć ogólne rozwiązanie. Czy to możliwe? –

+0

Edytowałem swoją odpowiedź. Zwróć uwagę na "*" w odpowiedzi, napisz "*", gdy chcesz zachować ogólną charakterystykę. Śledź blog, który ci pomoże. Ma przykład dla aplikacji Android – Shraddha

+0

Popraw mnie, jeśli się mylę, ale robiąc to, co sugerowałeś, zachowuje nazwę klasy i wszystkie nazwy metod, ale one również nie zostaną zaciemnione. –

Powiązane problemy