У меня есть методы, которые используются экземплярами Android framework ObjectAnimator
. Следовательно, они кажутся неиспользуемыми (они используются через отражение), и я добавляю аннотацию SuppressWarnings("unused")
, поэтому IntelliJ не показывает для них предупреждения. Однако ProGuard по-прежнему удаляет их, и мне нужно прямо сказать ему, чтобы он этого не делал. Это утомительно и кажется излишним (нарушает DRY). Можно ли настроить ProGuard так, чтобы методы с SuppressWarnings("unused")
не удалялись?
Как настроить ProGuard для пропуска методов с SuppressWarnings (не используется)
Ответы (3)
Параметры, которые указывают ProGuard сохранять некоторые классы и члены (поля и методы), описаны в официальной документации: http://proguard.sourceforge.net/manual/usage.html#keepoptions.
Вы можете указать ProGuard сохранить членов класса, используя:
-keepclassmembers class_specification
Ваш class_specification
будет выглядеть так:
class * {
@java.lang.SuppressWarnings <methods>;
}
Итак, в вашем proguard.cfg
у вас должно быть что-то вроде этого:
-keepclassmembers class * {
@java.lang.SuppressWarnings <methods>;
}
Извините, что затронул мертвую тему, но недавно я столкнулся с этим и обнаружил, что это невозможно. Поскольку SuppressWarnings
имеет уровень сохранения SOURCE
, его нет в файле класса, обрабатываемом Proguard (как описано в этом сообщении SO). Вместо этого я использовал аннотацию @Keep
поддержки Android и настроил ее с помощью правила, аналогичного правилу Адама:
-keepclassmembers class * {
@proguard.annotation.Keep <methods>;
}
@android.support.annotation.Keep
вместо @proguard.annotation.Keep
.
- person Jim; 29.12.2017
@androidx.annotation.Keep
- person fillobotto; 30.01.2020
Я столкнулся с подобной проблемой зачистки с Dexguard. Я решил очень грязным способом, разместив это где-то:
if(System.currentTimeMillis() < 0 ){ //never happens
//..
//TODO directly invoke stripped methods
//..
}