2012-08-28 23 views
19

Używam simplexml w moim androidowym projekcie i wszystko działa dobrze, dopóki nie zaciemniam kodu. Następnie błędy zaczynają napływaćZakłamanie Proguarda łamie simplexml

Część XML jest następująca:.

<categories success="true"> 
    <category id="102" caption="Magazin" parent="0" num_mags="114" > 
    <category id="15" caption="Kunst" parent="102" num_mags="13" > 
     <category id="17" caption="Design" parent="15" num_mags="10" ></category> 
     <category id="18" caption="Haute+Couture" parent="15" num_mags="2" > 
... 

Mam dwie klasy: CategoryItemList:

@Root(name = "categories") 
public class CategoryItemList { 

    private final List<CategoryItem> mCategoryItems; 
    /** 
    * Create a new category items list. 
    * 
    * @param categoryItems the list of category items 
    */ 
    public CategoryItemList(@ElementList(name = "category", inline = true) final List<CategoryItem> categoryItems) { 
     mCategoryItems = categoryItems; 
    } 
    @ElementList(name = "category", inline = true) 
    public List<CategoryItem> getCategoryItems() { 
     return mCategoryItems; 
    } 
} 

i CategoryItem:

@Root(name = "category") 
public class CategoryItem { 
    private final int mId; 
    private final String mCaption; 
    private final int mParent; 
    private final int mNumberOfMagazines; 
    private final ArrayList<CategoryItem> mSubCategoryItems; 
    /** 
    * Creating a new category item. 
    * 
    * @param id the category id 
    * @param caption the name of category 
    * @param parent the parent category 
    * @param numMags the number of magazines from that category 
    */ 
    public CategoryItem(@Attribute(name = "id") final int id, 
         @Attribute(name = "caption") final String caption, 
         @Attribute(name = "parent") final int parent, 
         @Attribute(name = "num_mags") final int numMags, 
         @ElementList(name = "category", inline = true, required = false) final ArrayList<CategoryItem> subCategoryItems) { 
     mId = id; 
     mCaption = caption; 
     mParent = parent; 
     mNumberOfMagazines = numMags; 
     mSubCategoryItems = subCategoryItems; 
    } 

    @Attribute(name = "id") 
    public int getId() { 
     return mId; 
    } 

    @Attribute(name = "caption") 
    public String getCaption() { 
     String categoryName = null; 

     try { 
      categoryName = URLDecoder.decode(mCaption, "UTF-8"); 
     } catch (final UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
     return categoryName; 
    } 

    @Attribute(name = "parent") 
    public int getParentId() { 
     return mParent; 
    } 

    @Attribute(name = "num_mags") 
    public int getNumbersOfMagazines() { 
     return mNumberOfMagazines; 
    } 

    @ElementList(name = "category", inline = true, required = false) 
    public ArrayList<CategoryItem> getSubCategory() { 
     return mSubCategoryItems; 
    } 
} 

Teraz, kiedy zaciemniam kod, jeśli pominę "-keepattributes Adnotacja "Otrzymuję wyjątek PersistenceException: Konstruktor nie pasuje do klasy.

Jeśli ją dodaję, otrzymuję "Nie można określić typu ogólnego dla wyjątku parametru 1 konstruktora", wszystko w czasie wykonywania.
Jak widać, są tam imiona i starałem się trzymać całą klasę trzymając je, wszystko bezskutecznie.

Jak skonfigurować program Proguard do pracy z simplexml?

EDIT: Mój plik proguard.cfg jest w następujący sposób: (to trochę nadziewane wszystkich rzeczy próbowałem, ale to jest aktualna wersja)

-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-printseeds 
-dontoptimize 
-keepattributes *Annotation* 
-keepattributes EnclosingMethod 

-libraryjars <java.home>/lib/rt.jar (javax/xml/stream/**) 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 

-keepclasseswithmembers class * { 
    native <methods>; 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

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

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

-dontwarn android.support.**,de.greenrobot.**,org.simpleframework.xml.** 
-keep class com.crittercism.**{ *; } 
-keepclassmembernames class com.crittercism.**{ *; } 
-keepclasseswithmembers class com.crittercism.**{ *; } 

-keep class org.simpleframework.**{ *; } 
-keepclassmembernames class org.simpleframework.**{ *; } 
-keepclasseswithmembers class org.simpleframework.**{ *; } 

-keep class crittercism.android.** 
-keepclassmembers public class com.crittercism.*{ *;} 

-keep public class database.** { 
    public static <fields>; 
} 

-keep class android.support.** 
-keepclasseswithmembers class android.support.** { *;} 

-keep class org.simpleframeork.** 
-keepclasseswithmembers class org.simpleframeork.** { *;} 

-keep class javax.** 
-keepclasseswithmembers class javax.** { *;} 

-keep class com.test.category.** 
-keepclassmembernames class com.test.category.** { *; } 
-keepclasseswithmembers class com.test.category.** { *;} 

-keep class com.test.download.** 
-keepclassmembernames class com.test.download.** { *; } 
-keepclasseswithmembers class com.test.download.** { *;} 

-keep class org.simpleframework.**{ *; } 
-keep class org.simpleframework.xml.**{ *; } 
-keep class org.simpleframework.xml.core.**{ *; } 
-keep class org.simpleframework.xml.util.**{ *; } 
-keep class org.simpleframework.xml.stream.**{ *; } 

-keepclassmembers class * implements java.io.Serializable { 
    private static final java.io.ObjectStreamField[] serialPersistentFields; 
    private void writeObject(java.io.ObjectOutputStream); 
    private void readObject(java.io.ObjectInputStream); 
    java.lang.Object writeReplace(); 
    java.lang.Object readResolve(); 
} 
+1

Wyślij swoje proguard.cfg –

Odpowiedz

2

prawym przyciskiem myszy projekt w Eclipse . Idź do androida -> uruchom Lint.

Lint ma możliwość sprawdzenia błędnych konfiguracji proguard i może wykryć i wyjaśnić swój błąd.

+0

I fo und a Proguard ostrzeżenie, ale usunięcie go nie pomogło w moim problemie. – Janusz

6

Już wiesz, że utrzymywanie adnotacji jest dobrym pomysłem. Możesz również spróbować dodać parametr type do adnotacji @ElementList - najwyraźniej występuje problem z wymazywaniem typu ogólnego, a simplexml wymaga dodatkowej wskazówki o typie elementów na liście

możesz również odtwarzać za pomocą -keepattributes Podpis, * Adnotacja *:

Atrybut "Podpis" jest wymagany, aby móc uzyskać dostęp do ogólnych typów podczas kompilacji w JDK 5.0 i nowszych.

+0

Początkowo starałem się zrozumieć, co masz na myśli, ale teraz w pełni rozumiem i mój problem został rozwiązany przez tę odpowiedź. –

+0

Rzeczywiście działa. Na końcu moja deklaracja wygląda następująco: '@ElementList (inline = true, type = Myclass.class)' –

4

Problemy podczas korzystania z biblioteki SimpleXML i zaciemniać kodu są następne:

  1. Musisz zachować „adnotacje” i „Podpisy” swoich jednostek

    @Attribute (name = "retcode", required = true) private String _retcode;

  2. Trzeba zachować SimpleXML Biblioteka

  3. Trzeba zapobiec pewne bloki kodu będzie usunąć, na przykład, jeśli konstruktor podmiotu nie jest używany, PROGUARD będzie go usunąć, ale ta metoda może być używana wewnętrznie przez Bibliotekę Proste XML

plik proguard.cfg może być coś takiego:

# The following line may be different 
-libraryjars <java.home>/lib/rt.jar(java/**,javax/**) 

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
# (3)Not remove unused code 
-dontshrink 

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService 
# (2)Simple XML 
-keep public class org.simpleframework.**{ *; } 
-keep class org.simpleframework.xml.**{ *; } 
-keep class org.simpleframework.xml.core.**{ *; } 
-keep class org.simpleframework.xml.util.**{ *; } 
# (1)Annotations and signatures 
-keepattributes *Annotation* 
-keepattributes Signature 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 

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

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

używam go w moim projekcie i to działa;)

1

warto dodać to do pliku PROGUARD:

-keep public class org.simpleframework.** { *; } 
-keep class org.simpleframework.xml.** { *; } 
-keep class org.simpleframework.xml.core.** { *; } 
-keep class org.simpleframework.xml.util.** { *; } 

-keepattributes ElementList, Root 

-keepclassmembers class * { 
    @org.simpleframework.xml.* *; 
} 

to ustalone to dla mnie.

2

Ciągle się następujące błędy:

can't find referenced class javax.xml.stream.XMLEventReader

can't find referenced class javax.xml.stream.events.XMLEvent

To dlatego, że te są częścią środowiska wykonawczego Java (rt.jar), ale nie jest częścią wykonywania Android (android.jar), tak ProGuard ostrzega, że ​​coś może zostać złamane. Nie jest to rzeczywiście problem, więc możemy wykonać następujące czynności:

-dontwarn javax.xml.stream.events.** 

Source

połączeniu z odpowiedzią zmicer, mam następujący

-dontwarn javax.xml.stream.events.** 

-keep public class org.simpleframework.** { *; } 
-keep class org.simpleframework.xml.** { *; } 
-keep class org.simpleframework.xml.core.** { *; } 
-keep class org.simpleframework.xml.util.** { *; } 

-keepattributes ElementList, Root 

-keepclassmembers class * { 
    @org.simpleframework.xml.* *; 
} 
+0

99%, ale trochę inaczej dla "dontwarn" i "keepattributes". -dontwarn javax.xml.stream. ** -keepattributes ElementList, Root, * Adnotacja * –

0

to dokładna dodatek do Plik proguard pracował dla mnie:

-dontwarn javax.xml.stream.** 

-keep public class org.simpleframework.** { *; } 
-keep class org.simpleframework.xml.** { *; } 
-keep class org.simpleframework.xml.core.** { *; } 
-keep class org.simpleframework.xml.util.** { *; } 

-keepattributes ElementList, Root 

-keepclassmembers class * { 
    @org.simpleframework.xml.* *; 
}