Android, ProGuard и keepclasseswithmembernames

Обычным шаблоном в конфигурациях 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 и позволяет сжать , что, если я правильно понимаю, означает: эти классы разрешено удалять, но они сохраняются, не запутывайте имена его членов (возможно, чтобы не нарушать привязки между именами атрибутов XML и установщиками классов).

Но не означает ли это, что эти классы все равно будут удалены во время фазы сжатия (allowhrinking = true), если они не упоминаются непосредственно в коде? В самом деле, именно это произошло с настраиваемым виджетом, который мы используем в нашем приложении, и я мог бы исправить эту проблему, установив правило только на keepclasseswithmembers , поскольку это просто полностью сохранит соответствующие классы (это ' res10: Boolean = false Почему Some (null) не преобразован в None?

Мне любопытно:

scala> Some(null) == None
res10: Boolean = false

Почему Some (null) не преобразован в None ?

36
задан Geo 26 April 2011 в 21:21
поделиться