Обычный шаблон в конфигах ProGuard для приложений Android - сохранение пользовательских классов View
, поскольку на них, вероятно, ссылаются только из XML-макета, а не кода приложения.
После создания проекта ADT добавляет этиправила для proguard.cfg проекта:
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
Я предполагаю, что идея состоит в том, чтобы сказать, что всякий раз, когда класс определяет конструктор, который может быть вызван инфлятором макета, сохраните его.Однако, согласно документам ProGuard, квалификатор keepclasseswithmembernames
является сокращением для keepclasseswithmembers
и allowshrinking
, что, если я правильно понимаю, означает: разрешено удалять эти классы, но если они сохранены, не запутывайте ихимена членов (возможно, чтобы не нарушать привязки между именами атрибутов XML и установщиками классов).
Но не значит ли это, что эти классы все равно будут удалены во время фазы сжатия (allowhrinking = true), если на них нет ссылокпрямо в коде?Действительно, именно это и произошло с пользовательским виджетом, который мы используем в нашем приложении, и я мог бы решить эту проблему, установив правило равным keepclasseswithmembers
, поскольку это просто полностью сохранит соответствующие классы (стоит отметить, что это то, чтоофициальный пример ProGuard Android тоже).
Я неправильно читаю документы ProGuard или это ошибка в мастере проекта ADT?