2011-06-22 67 views
0

我有一个项目使用jdom SAXBuilder在我的Android应用程序中从我的xml创建文档。如何防止Proguard混淆破坏jdom.jar

如果我只是打包我的应用程序一切正常,内容被加载,并没有例外。如果我使用ProGuard的混淆代码中,我得到以下异常:

06-22 10:07:26.210: ERROR/b(21255): Error 
06-22 10:07:26.210: ERROR/b(21255): org.jdom.JDOMException: Could not load default SAX parser: org.apache.xerces.parsers.SAXParser: SAX2 driver class org.apache.xerces.parsers.SAXParser not found: org.apache.xerces.parsers.SAXParser in loader dalvik.system.PathClassLoader[/data/app/...news.activities-2.apk] 
06-22 10:07:26.210: ERROR/b(21255):  at org.jdom.input.SAXBuilder.createParser(Unknown Source) 
06-22 10:07:26.210: ERROR/b(21255):  at org.jdom.input.SAXBuilder.build(Unknown Source) 
06-22 10:07:26.210: ERROR/b(21255):  at org.jdom.input.SAXBuilder.build(Unknown Source) 
06-22 10:07:26.210: ERROR/b(21255):  at ....Utils.b.run(Unknown Source) 
06-22 10:07:26.210: ERROR/b(21255):  at java.lang.Thread.run(Thread.java:1096) 
06-22 10:07:26.210: ERROR/b(21255): Caused by: java.lang.ClassNotFoundException: org.apache.xerces.parsers.SAXParser in loader dalvik.system.PathClassLoader[....news.activities-2.apk] 
06-22 10:07:26.210: ERROR/b(21255):  at org.xml.sax.helpers.XMLReaderFactory.loadClass(XMLReaderFactory.java:192) 
06-22 10:07:26.210: ERROR/b(21255):  at org.xml.sax.helpers.XMLReaderFactory.createXMLReader(XMLReaderFactory.java:183) 
06-22 10:07:26.210: ERROR/b(21255):  ... 5 more 
06-22 10:07:26.210: ERROR/b(21255): Caused by: java.lang.ClassNotFoundException: org.apache.xerces.parsers.SAXParser in loader dalvik.system.PathClassLoader[/data/app/....news.activities-2.apk] 
06-22 10:07:26.210: ERROR/b(21255):  at org.xml.sax.helpers.XMLReaderFactory.loadClass(XMLReaderFactory.java:192) 
06-22 10:07:26.210: ERROR/b(21255):  at org.xml.sax.helpers.XMLReaderFactory.createXMLReader(XMLReaderFactory.java:183) 
06-22 10:07:26.210: ERROR/b(21255):  at org.jdom.input.SAXBuilder.createParser(Unknown Source) 
06-22 10:07:26.210: ERROR/b(21255):  at org.jdom.input.SAXBuilder.build(Unknown Source) 
06-22 10:07:26.210: ERROR/b(21255):  at org.jdom.input.SAXBuilder.build(Unknown Source) 
06-22 10:07:26.210: ERROR/b(21255):  at ....Utils.b.run(Unknown Source) 
06-22 10:07:26.210: ERROR/b(21255):  at java.lang.Thread.run(Thread.java:1096) 
06-22 10:07:26.210: ERROR/b(21255): Caused by: java.lang.ClassNotFoundException: org.apache.xerces.parsers.SAXParser in loader dalvik.system.PathClassLoader[/data/app/....news.activities-2.apk] 
06-22 10:07:26.210: ERROR/b(21255):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243) 
06-22 10:07:26.210: ERROR/b(21255):  at java.lang.ClassLoader.loadClass(ClassLoader.java:573) 
06-22 10:07:26.210: ERROR/b(21255):  at java.lang.ClassLoader.loadClass(ClassLoader.java:532) 
06-22 10:07:26.210: ERROR/b(21255):  at org.xml.sax.helpers.NewInstance.newInstance(NewInstance.java:49) 
06-22 10:07:26.210: ERROR/b(21255):  at org.xml.sax.helpers.XMLReaderFactory.loadClass(XMLReaderFactory.java:190) 
06-22 10:07:26.210: ERROR/b(21255):  at org.xml.sax.helpers.XMLReaderFactory.createXMLReader(XMLReaderFactory.java:183) 
06-22 10:07:26.210: ERROR/b(21255):  at org.jdom.input.SAXBuilder.createParser(Unknown Source) 
06-22 10:07:26.210: ERROR/b(21255):  at org.jdom.input.SAXBuilder.build(Unknown Source) 
06-22 10:07:26.210: ERROR/b(21255):  at org.jdom.input.SAXBuilder.build(Unknown Source) 
06-22 10:07:26.210: ERROR/b(21255):  at ....Utils.b.run(Unknown Source) 
06-22 10:07:26.210: ERROR/b(21255):  at java.lang.Thread.run(Thread.java:1096) 

抛出此异常的代码是:

SAXBuilder builder = new SAXBuilder(); 
xmlDocument = builder.build(inputStream); 

我模糊的项目,具有以下配置的ProGuard:

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-libraryjars ./libs/commons-compress-1.0-SNAPSHOT.jar 
-libraryjars ./libs/hoptoad-android.jar 
-libraryjars ./libs/httpmime-4.1.jar 
-libraryjars ./libs/javabase64-1.3.1.jar 
-libraryjars ./libs/jdom-1.1.1-android-fork.jar 
-libraryjars ./libs/OmnitureAppMeasurement-Android.jar 

-ignorewarnings 

-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 

-keep public class * extends ....news.activities.SuperActivity 
-keep public class ....news.xmlparser.VotingParser 

-keep public class ....** { 
    public protected private *; 
} 
//my package name removed for the question only 

-keep public class....** { 
    public protected private *; 
} 
//my package name removed for the question only 

-keep public class org.jdom.** { 
    public protected private *; 
} 

-keep public class org.apache.** { 
    public protected private *; 
} 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

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

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

任何想法如何改变我的proguard配置,以允许混淆?

回答

3

与尝试的-skipnonpubliclibraryclasses代替-dontskipnonpubliclibraryclasses

跳过非公共类,而读库罐,以加快处理速度,并降低ProGuard的内存使用。

4

CFR ProGuard manual>Troubleshooting在运行时>问题> ClassNotFoundException的

的ProGuard不知道它有保持类,因为它只能通过内省创建。因此,您必须在您的配置中指定它:

-keep class org.apache.xerces.parsers.SAXParser 
+0

此答案解决了我的问题,这与原始问题类似。 – raider33