Как сохранить поля и методы внутреннего класса в Proguard (не только сам класс)

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

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

-keep @com.my.project.annotations.ProguardKeepEverything class * { *; }

Таким образом, следующий класс и его члены (включая имена) будут сохранены:

@ProguardKeepEverything
public class APublicModel {
    private String aField;
}

Но теперь у меня есть внутренние классы, такие как:

@ProguardKeepEverything
public class APublicModel {
    private String aField;

    public static class InnerPublicClass {
        private String innerAField; 
    }
}

поэтому я добавляю следующее правило:

-keep @com.my.project.annotations.ProguardKeepEverything class *$* { *; }

а также попробовал

-keep @com.my.project.annotations.ProguardKeepEverything class *$** { *; }

Но теперь он сохраняет только внутренний класс (и имя), но его поля и методы запутаны. Как сохранить методы и поля внутренних классов от запутывания (т. Е. Имена не повреждены)?

Я проверяю, запутаны ли занятия seed.txt и apktool.


Следующие вопросы касаются только сохранения класса, а не его методов:

2 ответа

Решение

С точки зрения байт-кода внутренние классы являются обычными классами; у них есть только ...$... имена (и атрибуты InnerClasses, ради размышлений и компиляторов). ProGuard не относится к ним по-другому. Поэтому ваши дополнительные правила будут соответствовать только внутренним классам с аннотацией. Лучшее решение, которое я вижу на данный момент, - это указать основное правило, а затем аннотировать внутренние классы.

Фон: шаблоны в правилах ProGuard определяют элементы, которые сопоставляются, и элементы, которые сохраняются в результате (с небольшими различиями между -keep, -keepclassmembers, а также -keepclasseswithmembers). Следовательно, вы не можете указать, "ЕСЛИ какой-то класс соответствует, тогда оставьте другой класс". Это очень редко необходимо, и правила уже могут быть сложными, но я рассматриваю более общее расширение.

Немного опоздал на вечеринку, но если кто-то вроде меня наткнется на это, вы можете попробовать следующий трюк

      -if @com.my.project.annotations.ProguardKeepEverything class *
-keep class <1>$** {
  *;
}
Другие вопросы по тегам