Подтвердить что ты не робот

Proguard не будет содержать перечисления членов класса

Я работаю над библиотекой, которая распределяется как java-банка, и я запускаю proguard на ней таким образом, чтобы оставлять только открытые интерфейсы. У меня есть класс конфигурации с кучей переменных-членов и некоторые перечисления. Моя proguard script сохраняет мелкие переменные-члены, однако определения enum запутываются. Я пробовал все, что мог, чтобы заставить proguard сохранить эти внутренне определенные и публичные перечисления, но я не могу заставить его работать.

Сейчас я использую:

-keep public class com.stuff.MyConfigObject {
    public *;
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

Если я попробую:

-keep public enum com.stuff.MyConfigObject.MyEnum

Я получаю неоднозначную ошибку: "Примечание: конфигурация относится к неизвестному классу" com.stuff.MyConfigObject.MyEnum "

Спасибо за помощь!

4b9b3361

Ответ 1

Попробуйте com.stuff.MyConfigObject$MyEnum. Спецификация класса Proguard ожидает $ как разделитель для внутренних классов.

Собственно, для того, что вы хотите, возможно, лучший вариант - это что-то вроде этого:

-keep public enum com.stuff.MyConfigObject$** {
    **[] $VALUES;
    public *;
}

Это будет содержать только требуемые члены для всех enum, вложенных в MyConfigObject - требуемые члены, являющиеся массивом $VALUES[] (см. этот вопрос для объяснение) и любые public члены перечисления. Любые другие члены (например, методы частных полей) не будут сохранены.


Как отметил Джесси и я в комментариях - поскольку вы обрабатываете библиотеку, вы также должны добавить опцию -keepAttributes. Из справочного руководства:

Например, вы должны по крайней мере сохранять атрибуты Исключения, Внутренние Классы и Подписи при обработке библиотеки.