Сохранить аннотированный класс в Proguard

У меня есть куча классов, которые используют, например. такая аннотация @Singleton

@Singleton
public class ImageCache

что я хотел бы сохранить. Как настроить оператор proguard -keep, чтобы он применялся ко всем классам, имеющим эту аннотацию.

Кстати, с точки зрения контекста, мне нужно это для приложения, использующего Roboguice на Android, поэтому я добавил теги. Может помочь другим.


person Manfred Moser    schedule 23.07.2012    source источник


Ответы (2)


ProGuard основан на java-подобной конфигурации с подстановочными знаками. Для этого требуются полные имена классов. Это должно работать:

-keep @com.google.inject.Singleton public class *
person Eric Lafortune    schedule 24.07.2012
comment
Этот кусок золота. Чертовски полезно хранить аннотированные классы jackson 1, jackson 2 и gson. ;) Эрик, я считаю, что руководство proguard должно быть более подробным в отношении сохранения аннотированных классов, методов, полей и т. д. - person Snicolas; 07.06.2013
comment
Мне также пришлось добавить keepclassmembers. Но вы подали хорошую идею, так что +1 - person Display Name; 10.05.2015
comment
Кроме того, если вы используете пользовательские аннотации, убедитесь, что RetentionPolicy имеет значение CLASS или RUNTIME, иначе proguard не сможет их найти. - person Someone; 10.03.2017

Сначала определите аннотацию

public @interface DoNotStrip {}

Затем поместите это в proguard.cfg:

-keep,allowobfuscation @interface com.something.DoNotStrip

# Do not strip any method/class that is annotated with @DoNotStrip
-keep @com.something.DoNotStrip class *
-keepclassmembers class * {
    @com.something.DoNotStrip *;
}
person Sahil Jain    schedule 10.09.2017
comment
Привет, для тех, кто считает этот ответ применимым к своим делам, есть предопределенная аннотация @androidx.annotation.Keep - person Inliner; 09.12.2020
comment
@Inliner Аннотация Keep относится к предотвращению удаления класса во время минимизации, если к нему нет доступа. - person Didi; 05.04.2021
comment
@Didi Спасибо, это действительно правда. То же, что правило proguard. Разница заключается в количестве настроек, доступных при их использовании. В следующей статье есть описание того, когда использовать каждый из них. medium.com/androiddevelopers/ Также вы можете посмотреть предопределенные правила proguard от Android Studio и узнайте, как создать собственную аннотацию. - person Inliner; 07.04.2021