Android Proguard, держать внутренний класс
Моя андроид программа имеет class A
, который имеет два static inner class
, Они признаны лишенными .dex
после применения прогвардии.
public class A{
...
static class B{
...
}
static class C{
...
}
}
Я поместил следующие строки в proguard.flags, но, похоже, не повезло.
-keep class com.xxx.A
-keep class com.xxx.A$*
Любой намек?
5 ответов
Попробуйте добавить InnerClasses
сохранить атрибуты. например:
-keepattributes Exceptions, InnerClasses, ...
Также попробуйте добавить тело к вызову keep со звездочкой, например:
-keep class com.xxx.A$* {
*;
}
Это то, что я должен был сделать для моего конфига
-keep class com.xxx.A { *; }
-keep class com.xxx.A$B { *; }
-keep class com.xxx.A$C { *; }
Это помогло мне
-keepattributes InnerClasses
-keep class com.yourpackage.YourClass**
-keepclassmembers class com.yourpackage.YourClass** {
*;
}
Это может быть немного излишне с подстановочными знаками, но я хотел убедиться, что я ничего не пропустил. Главное, чтобы вам были нужны атрибуты InnerClasses, хранящиеся в классе, и хранящиеся в нем члены.
Если вы не хотите, чтобы все внутренние классы и члены в каком-либо пакете были запутаны, вы можете добавить строки в proguard-rules.pro
-keep class com.xxx.task.*$* {
*;
}
Ваша конфигурация выглядит правильно. Вы должны перепроверить, что вы не ошиблись в именах классов. Если орфография неверна, ProGuard должна распечатать примечание об этом. Вы также можете указать -printseeds seeds.txt
и посмотрите, перечислены ли ваши классы в результирующем файле. Если они перечислены, классы также находятся в обработанном коде.
Как отметил Александр Лукас, вы также можете оставить поля и методы этих классов - это зависит от ваших требований.
Большинство популярных ответов работают, но они используют подстановочные знаки (*;)
для добавления всего, что не является точным ответом. Конфигурация ниже добавляет толькоfields
а также method
свойства для сохранения методов внутреннего класса.
-keepattributes Exceptions,InnerClasses,Signature, ...
# preserve class and nested classes' fields and methods
-keep class com.abc.package.clazzes.** {
<fields>;
<methods>;
}