Как настроить ProGuard для пропуска методов с SuppressWarnings (не используется)

У меня есть методы, которые используются экземплярами Android framework ObjectAnimator. Следовательно, они кажутся неиспользуемыми (они используются через отражение), и я добавляю аннотацию SuppressWarnings("unused"), поэтому IntelliJ не показывает для них предупреждения. Однако ProGuard по-прежнему удаляет их, и мне нужно прямо сказать ему, чтобы он этого не делал. Это утомительно и кажется излишним (нарушает DRY). Можно ли настроить ProGuard так, чтобы методы с SuppressWarnings("unused") не удалялись?


person gruszczy    schedule 15.03.2014    source источник


Ответы (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>;
}
person Adam Stelmaszczyk    schedule 15.03.2014
comment
Итак, меня беспокоит то, что я не могу указать SupressWarning(unused), а только SupressWarning. Proguard теперь будет сохранять все, независимо от типа предупреждения. - person gruszczy; 16.03.2014
comment
@gruszczy Вы абсолютно правы. Насколько я знаю, в ProGuard мы не можем этого указать. - person Adam Stelmaszczyk; 16.03.2014

Извините, что затронул мертвую тему, но недавно я столкнулся с этим и обнаружил, что это невозможно. Поскольку SuppressWarnings имеет уровень сохранения SOURCE, его нет в файле класса, обрабатываемом Proguard (как описано в этом сообщении SO). Вместо этого я использовал аннотацию @Keep поддержки Android и настроил ее с помощью правила, аналогичного правилу Адама:

-keepclassmembers class * {
  @proguard.annotation.Keep <methods>;
}
person Dr. Nitpick    schedule 18.07.2017
comment
У меня это сработало, используя @android.support.annotation.Keep вместо @proguard.annotation.Keep. - person Jim; 29.12.2017
comment
Для тех, кто перешел на AndroidX, не забудьте использовать @androidx.annotation.Keep - person fillobotto; 30.01.2020

Я столкнулся с подобной проблемой зачистки с Dexguard. Я решил очень грязным способом, разместив это где-то:

if(System.currentTimeMillis() < 0 ){ //never happens
   //..
   //TODO directly invoke stripped methods
   //..
}
person bonnyz    schedule 15.03.2014
comment
Это заботится о ProGuard, а также о компиляторе, особенно о частных/защищенных методах, которые вызываются только отражением. В моих классах есть метод registerMethods, в котором методы только для отражения добавляются с помощью специального процессора аннотаций. - person Atorian; 27.12.2014