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