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?
Odpowiedz
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>;
}
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 *;
}
Dziękuję, użyłem "-dontshrink" z cytowanych opcji. – ggurov
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
Wystarczająco fair. Dzięki i tak. –
- 1. Jak powiedzieć proguardowi, aby utrzymywał stałe i stałe enum
- 2. Jak powiedzieć ProGuardowi, aby zaciemnił nazwy metod i klas?
- 3. Jak powiedzieć Proguardowi, by zaciemnił nazwy klas?
- 4. Jak powiedzieć Git, aby zignorował wszystko z wyjątkiem podkatalogu?
- 5. R nie może znaleźć określonej funkcji w paczce
- 6. JUnit4 uruchom wszystkie testy w określonej paczce, używając zestawu testowego
- 7. Jak powiedzieć oracle, aby sortować według określonej kolejności sortowania przekazanej z java?
- 8. Jak powiedzieć bash, aby nie rozszerzać zmiennej $ _?
- 9. Jak powiedzieć valgrind, aby zapamiętywać rozwidlone procesy?
- 10. Jak powiedzieć RadioButtonList, aby NIE generować tabeli
- 11. Jak mogę powiedzieć Operacje w Google, aby przesyłać dźwięk?
- 12. Pole Collate w paczce Opis
- 13. Jak powiedzieć CMake, aby używać Clang w systemie Windows?
- 14. Jak powiedzieć Ivy, aby umieścić pobrane słoiki w niestandardowym katalogu?
- 15. Jak powiedzieć lcov, aby zignorować linie w plikach źródłowych
- 16. Laravel 4: Używanie widoków w paczce
- 17. MySQL gdzie wszystko w
- 18. Jak powiedzieć sbt-proguard, aby dołączyć java * .jars?
- 19. Jak korzystać z writeStringArray() i readStringArray() w paczce
- 20. make: *** Brak reguły, aby cel "wszystko". Zatrzymaj
- 21. Jak mogę powiedzieć Mutt, aby nie przechowywać wysłanych wiadomości?
- 22. Jak powiedzieć git, aby ignorował pliki zaczynające się od tyldy?
- 23. Jak powiedzieć botowi google, aby pominąć część kodu HTML?
- 24. Jak powiedzieć Gradle, aby użyć --console = plain cały czas?
- 25. Regex, aby uzyskać wszystko po pierwszym polu
- 26. Jak ustawić maksymalną liczbę pracowników w paczce/matlabpool z konsoli?
- 27. Jak sprawić, aby lampka aparatu migała w określonej kolejności?
- 28. Jak splajnować tablicę, aby wstawić tablicę w określonej pozycji?
- 29. jak korzystać z sed, aby wyodrębnić linie w określonej kolejności?
- 30. Jak mogę powiedzieć podprocesowi, aby przestał uciekać od moich ofert?
masz na myśli, na przykład, jak po prostu nie używając ProGuard? – mah
Nie, chcę zaciemniania, po prostu nie chcę usunąć żadnych klas i członków klasy z mojej paczki. – ggurov
Miałem ten sam problem. To powinno ci pomóc. http://stackoverflow.com/questions/6633411/android-proguard-only-obfuscation – Vinoth