Ответ 1
Попробуйте добавить InnerClasses
к атрибутам keep. например:
-keepattributes Exceptions, InnerClasses, ...
Кроме того, попробуйте добавить тело к вызову "держать" со звездочкой, например:
-keep class com.xxx.A$* {
*;
}
У моей программы Android есть class A
, у которого два static inner class
. Полагают, что они были удалены из .dex
после применения proguard.
public class A{
...
static class B{
...
}
static class C{
...
}
}
Я поставил следующие строки в proguard.flags, но, похоже, не повезло.
-keep class com.xxx.A
-keep class com.xxx.A$*
Любые подсказки?
Попробуйте добавить InnerClasses
к атрибутам keep. например:
-keepattributes Exceptions, InnerClasses, ...
Кроме того, попробуйте добавить тело к вызову "держать" со звездочкой, например:
-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 сохраняли класс и класс keepclassmembers в классе.
если вы не хотите, чтобы весь внутренний класс и члены в некотором пакете были запутаны, вы можете добавлять строки в proguard-rules.pro
-keep class com.xxx.task.*$* {
*;
}
Ваша конфигурация выглядит правильно. Вы должны дважды проверить, что вы не ошибочно написали имена классов. Если орфография неверна, ProGuard должен распечатать заметку об этом. Вы также можете указать -printseeds seeds.txt
и посмотреть, указаны ли ваши классы в результирующем файле. Если они указаны, классы также находятся в обработанном коде.
Как отметил Александр Лукас, вы также можете сохранить поля и методы этих классов - это зависит от ваших требований.