Android, ProGuard и хранят классы с именами членов - PullRequest
8 голосов
/ 27 апреля 2011

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

Ответы [ 2 ]

7 голосов
/ 27 апреля 2011

Конфигурация в Android SDK (по крайней мере до версии 11) не совсем корректна.

В конфигурации для Android в документации ProGuard правильно указаны «-keepclasseswithmembers», а не «-keepclasseswithnamenames».

0 голосов
/ 27 апреля 2011

Когда я впервые попробовал встроенный proguard с Ant, мое приложение продолжало падать с ошибками во время выполнения на обработчиках кликов. (Я всегда устанавливаю их в XML). Я предположил, что, должно быть, что-то делаю не так, не могу понять, что именно, поэтому добавил строку

-dontshrink

вверху proguard.cfg.

Возможно, это не оптимально, но это остановило ошибки времени выполнения!

Добавление

На самом деле я проверил это, посмотрев на use.txt. Обработчики кликов были перечислены там до того, как я добавил опцию dontshrink, после того как я добавил ее, use.txt был пуст, как и следовало ожидать.

...