2013-04-08 3 views
2

Когда я поставил следующее «держать» правило в моей конфигурации Proguard:Proguard фактически не сохраняет мое классное имя, в чем причина?

-keepclasseswithmembernames class ** implements com.my.package.MyInterfaceName { <fields>; } 

Во-первых, кажется, что все мои классы, которые реализуют MyInterfaceName получить их имена классов и полей сохраняется неизменными.

Но на самом деле при запуске эти классы возвращают разные простые имена с помощью getSimpleName().

Возьмите это, например:

public class Foo { 
    public enum Bar implements MyInterfaceName { X, Y, Z } 
} 

X.getClass().getSimpleName() возвращается Foo$Bar вместо только Bar, который возвращается без обработки ProGuard.

ответ

2

Внутренние классы так же, как другие классы. ProGuard рассматривает их как таковые, например. при запутывании их имен. Если вы хотите сохранить вложенные структуры, вы должны сохранить соответствующий необязательный атрибут:

-keepattributes InnerClasses 
0

Proguard является очень агрессивным и стирает больше информации, чем необходимо. К счастью, полное имя не изменяется благодаря вашей конфигурации, но не является хорошей новостью для простого имени. Для полной обработки перечислений (у них есть какие-то магические методы также, что должны быть сохранены) вы должны проконсультироваться раздел Processing enumeration classes на http://proguard.sourceforge.net/index.html#manual/examples.html

Если приложение, апплет, сервлет, библиотека и т.д., содержит классы перечисления, вам нужно будет сохранить некоторые специальные методы. Перечисления были введены в Java 5. Компилятор java переводит перечисления в классы со специальной структурой. Примечательно, что классы содержат реализации некоторых статических методов, к которым обратная среда обращается к интроспекции (не так ли?) Introspection - это самомодифицирующийся код нового поколения). Вы должны указать это в явном виде, чтобы убедиться, что они не будут удалены или затемненный:

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

После некоторых тестов я боюсь, что это не решит мою проблему. Но другое решение, предоставленное Эриком Лафортунтом, действительно работает. –