Я пытаюсь удержать proguard от переименования / оптимизации классов, которые имеют определенные аннотации. Есть немало примеров, и это должно быть прямо, но proguard не ведет себя так, как я ожидал.
Issue
Proguard v6.2.2
запутывает классы, отмеченные @KeepClass
, хотя -whyareyoukeeping
показывает test.KeepMe is kept by a directive in the configuration
. Я могу воспроизвести проблему с помощью простого трехфайлового проекта.
Конфигурация Proguard:
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 3
-allowaccessmodification
-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
-keep public class test.Entry {
public static void main(java.lang.String[]);
}
-keep @proguard.annotation.KeepClass public class * {
*;
}
-whyareyoukeeping class test.KeepMe
Класс, который следует сохранить:
import proguard.annotation.KeepClass;
@KeepClass
public class KeepMe
{
}
Журнал Proguard:
Explaining why classes and class members are being kept...
Printing usage to [D:\Development\Projects\ProguardTest\build\usage.txt]...
test.KeepMe
is kept by a directive in the configuration.
Removing unused program classes and class elements...
Original number of program classes: 3
Final number of program classes: 2
И, наконец, файлы в обработанном jar-файле:
- test
|- Entry.class
|- a.class (Obfuscated KeepMe class)
Если, однако, я явно перечислю класс в конфигурации proguard, используя
-keep class test.KeepMe{*;}
, proguard сообщает тот же вывод журнала, но класс не тронут (как и ожидалось)
Я что-то упустил или это ошибка в proguard?