Как сохранить поля и методы внутреннего класса в 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>$** {
*;
}