Android, ProGuard и keepclasseswithmembernames

Обычным шаблоном в конфигурациях 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?

8
задан Matthias 26 April 2011 в 20:45
поделиться