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

19

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

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

    
задан Jesse 08.06.2011 в 23:41
источник

1 ответ

33

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

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

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

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

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

  

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

    
ответ дан Kevin K 09.06.2011 в 01:39
  • Спасибо, что мне стало намного ближе! Однако полученный .jar немного странный. Файлы классов для перечислений есть, и все выглядит нормально, но в Eclipse ни один из участников не может использоваться. Завершение кода показывает их правильно, но компиляция не срабатывает, поскольку «MyEnum не может быть разрешен или не является полем». Я использую proguard 4.4. –  Jesse 09.06.2011 в 16:24
  • Я обнаружил, что если вы добавите -keepAttributes **, это сработает. Не уверен, какой конкретный атрибут должен храниться, но с помощью ссылки Proguard и некоторых экспериментов, я уверен, вы могли бы понять это. –  Kevin K 09.06.2011 в 22:47
  • Спасибо @Kevin K, вы спасатель жизни. Работает как шарм! –  Jesse 13.06.2011 в 16:29
  • Спасибо за лидерство, я нашел это в документах для -keepattributes: «Например, вы должны хотя бы сохранить атрибуты« Исключения, InnerClasses »и« Подпись »при обработке библиотеки». –  Jesse 13.06.2011 в 16:34
  • Ах, я пропустил это предложение. Хорошо знать. –  Kevin K 14.06.2011 в 02:40