Как сказать ProGuard хранить все в определенной упаковке? - PullRequest
48 голосов
/ 18 сентября 2011

Мое приложение имеет много действий и использует нативную библиотеку.При стандартной конфигурации ProGuard, которую Eclipse генерирует, ProGuard удаляет многие вещи - методы OnClick, статические члены, методы обратного вызова, которые использует моя нативная библиотека ... Есть ли простой способ указать ProGuard НЕ удалять что-либо из моего пакета?Удаление вещей экономит только около 2,5% размера приложения, но полностью разрушает мое приложение.Конфигурирование, тестирование и поддержание этого класса за классом в конфигурации ProGuard было бы проблемой.

Ответы [ 2 ]

50 голосов
/ 19 сентября 2011

Я думаю, вам нужно как минимум добавить эти флаги (изменить для вас индивидуальные имена пакетов):

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

Также добавьте эти флаги:

-dontshrink
-dontoptimize
-dontpreverify

Вот весь мой конфигурационный файл: моего 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 *;
}
21 голосов
/ 19 сентября 2011

В итоге я обнаружил, что просто держать всех учеников недостаточно для правильной работы моего приложения и не нужно.Я добавил в файл настроек это:

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

Случай с onClick * относится ко всем методам, к которым я обращаюсь в Android: атрибут onClick в файлах макета .xml (имена всех таких методов начинаю с 'onClick ').

Случай с * Callback предназначен для всех методов обратного вызова, которые я вызываю из собственного кода (через JNI).Я добавляю суффикс 'Callback' к имени каждого такого метода.

Также я добавил несколько строк для некоторых особых случаев с переменными, которые я использую из собственного кода, например:

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

(для переменной с именем 'position' в классе с именем 'SomeMyClass' из пакета com.myapp.mypackage)

Все это потому, что эти onClick, callback и т. д. должны не только присутствовать, но и храниться сих оригинальные имена.Другие вещи, которые ProGuard может свободно оптимизировать.

Важен также случай с нативными методами, но для него было объявление в сгенерированном из Eclipse файле:

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