Proguard не будет хранить списки учеников - PullRequest
21 голосов
/ 09 июня 2011

Я работаю над библиотекой, которая распространяется как java jar, и я запускаю proguard на ней таким образом, чтобы оставить только нужные интерфейсы открытыми. У меня есть класс конфигурации с кучей переменных-членов и определением enum. Мой скрипт proguard прекрасно сохраняет переменные-члены, однако определения 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'"

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

1 Ответ

37 голосов
/ 09 июня 2011

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

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

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

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


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

Например, при обработке библиотеки вы должны как минимум сохранять атрибуты Exceptions, InnerClasses и Signature.

...