2012-05-08 11 views
6

Chciałbym, aby program wyświetlał nazwy klas. Mam tę linię w Proguard.cfgJak powiedzieć Proguardowi, by zaciemnił nazwy klas?

-keepclasseswithmembers class * { 
public static <fields>; 
} 

-keepnames class * implements java.io.Serializable 
-keep public class com.google.** 

I zauważam, że to, co nie jest zaciemniane, to nazwy klas. Tak działa jdgui widzę com/test/abcd/ActualClass.java public class ActualClassName rozciąga aktywny itp

ponadto widzę metody powrocie prawdziwych classnames. jak

ActualClassname aa(); 

i importuje stwierdzenia typu

import com.abcd.ActualClassName 

Jak uzyskać Proguard do zaciemniać samej classname. Nie tylko dla działań, które widzę, moje Adaptery nie są zaciemniane. Cóż, dzieje się zaciemnianie, ale nie nazwy klas.

Czy powyższych zasad, co zapobiega nazwy klasy z czym ukrywane?

Aktualizacja: I od tego czasu usunięto reguły powyżej klasy narzędzie, które nie rozciąga się coś z Androidem nie jest ukrywane. Zastanawiam się teraz, czy istnieje jakaś niejawna reguła dotycząca utrzymywania nazw klas klas, które są przywoływane z klas, które są utrzymywane w taki sam sposób, jak klasy pochodne Activity? Klasy, których nazwy nie są zamazywane, mają kilka wspólnych cech:

1) Metody statyczne 2) Import innych typów, które są utrzymywane, jak te, które pochodzą z działalności lub można serializować. 3) Posiadają metody z parametrami innych klas (niektóre z nich mogą wymagać zachowania).

Jednak nie ma gdzie, że jestem specjalnie prośbą o tych klas użytkowych powinny być przechowywane.

+0

Używam do tego samego problemu. Czy znalazłeś rozwiązanie tego problemu? – lnreddy

Odpowiedz

1

Myślę, że problem jest pochodząca z pierwszej linii: „-keepclasseswithmembers” zawiera nazwę klasy, więc w Twoim przypadku każda klasa z polem statycznym zachowa swoją nazwę. Zmiana tego na po prostu "-keepclassmembers" zaciemni nazwy klas, pozostawiając nietknięte pola statyczne (co zakładam, że chcesz zrobić).

To powiedziawszy, nie jestem pewien, dlaczego chcesz to zrobić, choć. Jeśli próbujesz zachować nazwy zmiennych statycznych, czy nie powinieneś również zachować nazw klas, widząc, w jaki sposób uzyskujesz dostęp do pól statycznych? Dlaczego starasz się zachować wszystkie swoje nazwy zmiennych statycznych?

+0

Usunąłem tę linię. Teraz widzę, że przechowywana jest klasa Utility, która nie obejmuje niczego, co jest przechowywane. Jest po prostu używany przez klasy, które są przechowywane i importowane itp. –

+1

Hmm, czy możesz umieścić swój pełny plik .cfg? – alexc

3

Istnieje kilka klasa, która pojawia się w kodzie, które należy zachować taką samą pełną nazwę klasy w celu aby móc je odnaleźć. Jeden przykład jak wyżej to wszystkie klasy Activity, ponieważ są zdefiniowane w manifeście przez ich pełną nazwę jako String. Jeśli zmieni nazwę klasy, to Android nie będzie mógł ich znaleźć.

Typowa Proguard config skieruje do config PROGUARD w Android SDK, który obejmie kilka ważnych linii takich jak ten:

-keep public class * extends android.app.Activity 
+0

Widzę, że wszystkie nazwy klas są przechowywane. Od tego czasu usunąłem -keepclasseswithmembers, ale wciąż ten sam wynik? –

+0

Na przykład mam klasę narzędzi i jest ona przechowywana. Więc być może istnieje domniemana zasada dotycząca utrzymywania nazw klas, które odwołują się do innych klas lub są przywoływane przez inne klasy –

+0

(tylko sprawdzanie pierwszych zasad) w projekcie Android, czy odkomentowałeś definicję 'proguard.config' w' project.properties' i jaka jest wartość? –

Powiązane problemy