2011-09-18 16 views
40

Moja aplikacja ma wiele działań i korzysta z biblioteki natywnej. Z domyślną konfiguracją ProGuard, którą Eclipse generuje ProGuard, usuwa wiele rzeczy - metody OnClick, elementy statyczne, metody wywołania zwrotnego, z których korzysta moja natywna biblioteka ... Czy istnieje prosty sposób, aby ProGuard nakazał NIE usuwać niczego z mojej paczki? Usunięcie elementów zapisuje tylko około 2,5% rozmiaru aplikacji, ale całkowicie niszczy moją aplikację. Konfigurowanie, testowanie i utrzymywanie klasy w klasie w konfiguracji ProGuard byłoby uciążliwe.Jak powiedzieć ProGuardowi, aby trzymał wszystko w określonej paczce?

+2

masz na myśli, na przykład, jak po prostu nie używając ProGuard? – mah

+5

Nie, chcę zaciemniania, po prostu nie chcę usunąć żadnych klas i członków klasy z mojej paczki. – ggurov

+0

Miałem ten sam problem. To powinno ci pomóc. http://stackoverflow.com/questions/6633411/android-proguard-only-obfuscation – Vinoth

Odpowiedz

17

W wyniku końcowym stwierdziłem, że utrzymanie wszystkich członków klasy nie wystarczy poprawne działanie mojego wniosku, ani konieczne. I addded złożyć ustawienia to:

-keepclasseswithmembers class * { 
    void onClick*(...); 
} 
-keepclasseswithmembers class * { 
    *** *Callback(...); 
} 

Sprawa z onClick * jest dla wszystkich metod, które kieruję w Androidzie: onClick atribute w plikach .xml układ (zacznę nazwy wszystkich tych metod z „onClick”).

Sprawa z * Callback dotyczy wszystkich metod wywołania zwrotnego, które wywołuję z mojego natywnego kodu (przez JNI). Umieszczam sufiks "Callback" na nazwie każdej takiej metody.

także dodałem kilka wierszy dla niektórych szczególnych przypadkach ze zmiennych, które używam od natywnego kodu, takich jak:

-keep class com.myapp.mypackage.SomeMyClass { 
    *** position; 
} 

(dla varible z nazwą „pozycja” w klasie o nazwie „SomeMyClass” z pakietu com.myapp.mypackage)

Wszystko to dlatego, że te wpisy onClick, oddzwanianie itp. muszą być nie tylko obecne, ale również przechowywane z ich oryginalnymi nazwami. Inne rzeczy, które ProGuard może zoptymalizować swobodnie.

Sprawa z metod natywnych ważne jest również, ale za to było oświadczenie w wygenerowany z pliku Eclipse:

-keepclasseswithmembernames class * { 
    native <methods>; 
} 
44

myślę, że trzeba dodać te flagi przynajmniej (modyfikować dla Ciebie indywidualne nazwy pakietów):

-keep class javax.** { *; } 
-keep class org.** { *; } 
-keep class twitter4j.** { *; } 

także dodać te flagi:

-dontshrink 
-dontoptimize 
-dontpreverify 

Oto cały mój plik konfiguracyjny : od mojego Proguard.cfg:

-dontshrink 
-dontoptimize 
-dontpreverify 
-verbose 

-dontwarn javax.management.** 
-dontwarn java.lang.management.** 
-dontwarn org.apache.log4j.** 
-dontwarn org.apache.commons.logging.** 
-dontwarn org.slf4j.** 
-dontwarn org.json.** 


-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService 
-keep class javax.** { *; } 
-keep class org.** { *; } 
-keep class twitter4j.** { *; } 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclasseswithmembernames class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembernames class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 


-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 
+1

Dziękuję, użyłem "-dontshrink" z cytowanych opcji. – ggurov

+1

Moje ostateczne rozwiązanie nie wykorzystuje niczego z twojej odpowiedzi (sprawdź moją ostatnią edycję), ponieważ moje zrozumienie ewoluowało, ale w każdym razie zasłużyłeś na mój upominek i masz go - ponieważ odpowiedź jest dobra na temat początkowego pytania. – ggurov

+0

Wystarczająco fair. Dzięki i tak. –

Powiązane problemy