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