Подтвердить что ты не робот

Как сказать ProGuard хранить все в определенном пакете?

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

4b9b3361

Ответ 1

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

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

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

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

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

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

(для varible с именем "position" в классе с именем "SomeMyClass" из пакета com.myapp.mypackage)

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

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

-keepclasseswithmembernames class * {
    native <methods>;
}

Ответ 2

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

-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 *;
}