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

Android proguard, сохранить внутренний класс

У моей программы 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$*

Любые подсказки?

4b9b3361

Ответ 1

Попробуйте добавить InnerClasses к атрибутам keep. например:

-keepattributes Exceptions, InnerClasses, ...

Кроме того, попробуйте добавить тело к вызову "держать" со звездочкой, например:

-keep class com.xxx.A$* {
    *;
}

Ответ 2

Это то, что я должен был сделать для своей конфигурации

-keep class com.xxx.A { *; }
-keep class com.xxx.A$B { *; }
-keep class com.xxx.A$C { *; }

Ответ 3

Это сделало трюк для меня

-keepattributes InnerClasses
 -keep class com.yourpackage.YourClass**
 -keepclassmembers class com.yourpackage.YourClass** {
    *;
 }

Это может быть немного переполнено с помощью подстановочных знаков, но я хотел убедиться, что ничего не пропустил. Главное, что вам нужно, чтобы атрибуты InnerClasses сохраняли класс и класс keepclassmembers в классе.

Ответ 4

если вы не хотите, чтобы весь внутренний класс и члены в некотором пакете были запутаны, вы можете добавлять строки в proguard-rules.pro

    -keep class com.xxx.task.*$* {
        *;
    }

Ответ 5

Ваша конфигурация выглядит правильно. Вы должны дважды проверить, что вы не ошибочно написали имена классов. Если орфография неверна, ProGuard должен распечатать заметку об этом. Вы также можете указать -printseeds seeds.txt и посмотреть, указаны ли ваши классы в результирующем файле. Если они указаны, классы также находятся в обработанном коде.

Как отметил Александр Лукас, вы также можете сохранить поля и методы этих классов - это зависит от ваших требований.