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

Другие вопросы по тегам