2012-12-27 19 views
38

Mój program na Androida ma class A, który ma dwa static inner class. Zostały one usunięte z .dex po zastosowaniu proguard.Android proguard, utrzymuj wewnętrzną klasę

public class A{ 

    ... 
    static class B{ 
    ... 
    } 

    static class C{ 
    ... 
    } 
} 

Umieściłem następujące linie w proguard.flags, ale wydaje się, że nie ma szczęścia.

-keep class com.xxx.A 
-keep class com.xxx.A$* 

Dowolna podpowiedź?

+0

Dla mnie to się dzieje, ponieważ moja klasa wewnętrzna została wdrożenie interfejs, który został wprowadzony w API 16+. Jak tylko usunąłem ten interfejs z 'implements', moja wewnętrzna klasa zaczęła działać poprawnie w pre-API 16. – Sufian

Odpowiedz

44

Spróbuj dodać InnerClasses do atrybutów keep. np:

-keepattributes Exceptions, InnerClasses, ... 

Spróbuj też dodanie ciało do "utrzymania" call gwiazdką, tak:

-keep class com.xxx.A$* { 
    *; 
} 
+1

Już dodałem te linie, ale nadal nie działa ... –

+0

Czy możesz umieścić więcej pliku proguard.flags, następnie? Nie chcę zgadywać, co już tam jest :) –

+0

Cześć, modyfikuję system Android, więc jest taki sam jak https://github.com/owity/build/blob/master/core/proguard.flags , plus -keepattributes i moja powyższa modyfikacja. –

3

Konfiguracja wygląda poprawnie. Powinieneś dokładnie sprawdzić, czy nie wpisałeś błędnie nazw klas. Jeśli pisownia jest nieprawidłowa, ProGuard powinien wydrukować notatkę na ten temat. Możesz również określić -printseeds seeds.txt i sprawdzić, czy twoje klasy znajdują się w wynikowym pliku. Jeśli są wymienione, klasy są również w przetworzonym kodzie.

Jak wspomniał Alexander Lucas, możesz również zachować pola i metody tych zajęć - to zależy od Twoich wymagań.

+0

Co to znaczy, jeśli moja wewnętrzna klasa nie znajduje się w pliku seeds.txt? http://stackoverflow.com/questions/19368053/proper-proguard-configuration-to-keep-static-inner-class-fields – TacB0sS

29

To co miałem zrobić dla mojego config

-keep class com.xxx.A { *; } 
-keep class com.xxx.A$B { *; } 
-keep class com.xxx.A$C { *; } 
+0

To zadziałało dla mnie. Miałem prawie to rozwiązanie, ale musiałem usunąć słowo "public" z tego oświadczenia, mimo że zarówno klasy zewnętrzne, jak i wewnętrzne są publiczne. Dziwne i mylące. – Gi0rgi0s

5

To załatwiło sprawę dla mnie

-keepattributes InnerClasses 
-keep class com.yourpackage.YourClass** 
-keepclassmembers class com.yourpackage.YourClass** { 
    *; 
} 

To może być przesadą nieco z symboli wieloznacznych, ale chciałem się upewnić, że niczego nie przeoczyłem. Najważniejsze, że potrzebujesz klas InnerClasses na klasie i klasach keepclass na klasie.

+1

ten wiersz "-keepclassmembers com.yourpackage.YourClass **" należy zmienić na ten "-keepclassmembers class com.yourpackage.YourClass **" –

+1

Możesz połączyć dwa ostatnie wiersze.keepclassmembers ma sens tylko wtedy, gdy nie klasy samej w sobie jako punktu wejścia – Matthias

5

jeśli nie chcesz cały wewnętrzny i członkowie klasy w jakimś pakiecie być ukrywane można dodać linie w proguard-rules.pro

-keep class com.xxx.task.*$* { 
     *; 
    } 
Powiązane problemy