Proguard混淆打破simplexml

我在我的android项目中使用simplexml,一切正常,直到我混淆代码。 然后,错误开始涌入。

部分XML如下:

     ... 

我有两个类:CategoryItemList:

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

和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 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 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 getSubCategory() { return mSubCategoryItems; } } 

现在,当我对代码进行模糊处理时,如果我省略“-keepattributes Annotation ”,我会得到一个PersistenceException:构造函数与类不匹配。

如果我包含它,我得到一个“无法确定构造函数的参数1的genericstypes”exception,所有这些都在运行时。
正如你所看到的,名字就在那里,我试图保持整个class级拿着它们,但都无济于事。

如何配置Proguard以使用simplexml?

编辑:我的proguard.cfg文件如下:(它有点塞满了我尝试过的所有东西,但这是当前版本)

 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -printseeds -dontoptimize -keepattributes *Annotation* -keepattributes EnclosingMethod -libraryjars /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 ; } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public (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 ; } -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(); } 

Solutions Collecting From Web of "Proguard混淆打破simplexml"

你已经发现保持注释是一个好主意。 您也可以尝试将types参数添加到@ElementList注释 – 显然,genericstypes擦除存在问题,而simplexml需要有关列表中元素types的其他提示

你也可以玩-keepattributes签名,*注释*:

在JDK 5.0及更高版本中进行编译时,需要“签名”属性才能访问genericstypes。

使用SimpleXML库并对代码进行模糊处理时出现的问题如下:

  1. 您必须保留实体的“注释”和“签名”

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

  2. 您必须保留SimpleXML库

  3. 您必须防止删除某些代码块,例如,如果未使用实体的构造函数,proguard将删除它,但该方法可由Simple XML Library在内部使用

proguard.cfg文件可能是这样的:

 # The following line may be different -libraryjars /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 ; } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public (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 *; } 

我在我自己的项目中使用它并且它有效;)

在eclipse中右键单击您的项目。 转到android – >运行Lint。

Lint能够检查proguard配置错误,并可能接收并解释您的错误。

我一直收到以下错误:

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

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

这是因为它们是Java运行时( rt.jar )的一部分,但不是Android运行时( android.jar )的一部分,因此ProGuard警告某些内容可能会被破坏。 这实际上不是问题,所以我们可以做到以下几点:

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

资源

结合zmicer的答案,我得到以下结论

 -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.* *; } 

尝试将此添加到您的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.* *; } 

这为我修好了。

对proguard文件的这一确切添加对我有用:

 -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.* *; }