JacksonParser,包括:
- Jackson-all.1.6.4.jar
- Joda-time.1.6.2.jar
- jsr311-api-1.0.jar
- stax2-api-3.0.0.jar
XStream,包括:
- xpp3_min-1.1.4c.jar
- xstream-for-android-1.0.0.jar
还有其他一些库,但它们不是问题的关键。这些库似乎是导致问题的源头。
具体而言,出现以下问题:
优化
如果进行优化,会显示"conversion to dalvik failed with 1"。关于这个问题有一个专门的帖子,链接为:"Conversion to Dalvik format failed with error 1" on external JAR,它指向了方向:重复的XmlPullParser类。这很有道理,因为XStream使用app3_min-1.1.4c.jar,其中包含了一个XmlPullParser,比android.jar中的那个功能更好/更多。因此,我尝试从android.jar中使用通配符xmlpull **移除:
-libraryjars <java.home>/lib/rt.jar;C:/Android/platforms/android-9/android.jar(!org/xmlpull/v1/**)
我也尝试了明确地删除它们:
-libraryjars <java.home>/lib/rt.jar;C:/Android/platforms/android-9/android.jar(!org/xmlpull/v1/XmlPullParser.class,!org/xmlpull/v1/XmlPullParserException.class,!org/xmlpull/v1/XmlPullParserFactory,!org/xmlpull/mxp1/MXParser)
但是两种修复方法都没有帮助。
但是等等,还有更多的问题(都集中在同一个问题上,所以我认为如果解决了这个问题,其他问题也会消失)。
混淆
如果我尝试混淆,就会出现以下运行时错误:
java.lang.NoSuchMethodError: android.content.res.XmlResourceParser.s
looking this up in the mapping, i get: .s = abstract int next()
所以它缺少了next()方法。那么为什么会缺少这个方法呢?我不理解。我甚至尝试过这样做:
-keep class android.content.res.XmlResourceParser { int next(); }
为了确保该方法得到保留,但我仍然遇到了相同的问题。
缩小也似乎失败了。应用程序启动后没有任何进展,它只是一直尝试启动第一个活动并给我一个无用的错误。不过我现在还不太担心这个问题,如果我能让混淆和优化工作正常,我可以不使用缩小功能。
更多信息:
作为参考,我已经尝试过两种引用库的方式,第一种是使用injars:
-injars ReferencedAssemblies/XStream/xpp3_min-1.1.4c.jar(!META-INF/MANIFEST.MF)
-injars ReferencedAssemblies/JacksonParser/jackson-all-1.6.4.jar(!META-INF/MANIFEST.MF,!META-INF/ASL2.0,!META-INF/LICENSE,!META-INF/NOTICE)
-injars ReferencedAssemblies/JacksonParser/joda-time-1.6.2.jar(!META-INF/MANIFEST.MF)
-injars ReferencedAssemblies/JacksonParser/jsr311-api-1.0.jar(!META-INF/MANIFEST.MF)
-injars ReferencedAssemblies/JacksonParser/stax2-api-3.0.0.jar(!META-INF/MANIFEST.MF)
-injars ReferencedAssemblies/XStream/xstream-for-android-1.0.0.jar(!META-INF/MANIFEST.MF)
这甚至无法构建。
我还做了这个:
-libraryjars <java.home>/lib/rt.jar
;C:/Android/platforms/android-9/android.jar(!org/xmlpull/v1/**)
#;C:/Android/platforms/android-9/android.jar(!org/xmlpull/v1/XmlPullParser.class,!org/xmlpull/v1/XmlPullParserException.class,!org/xmlpull/v1/XmlPullParserFactory,!org/xmlpull/mxp1/MXParser)
;ReferencedAssemblies/JacksonParser/jackson-all-1.6.4.jar(!META-INF/MANIFEST.MF,!META-INF/ASL2.0,!META-INF/LICENSE,!META-INF/NOTICE)
;ReferencedAssemblies/JacksonParser/joda-time-1.6.2.jar(!META-INF/MANIFEST.MF)
;ReferencedAssemblies/JacksonParser/jsr311-api-1.0.jar(!META-INF/MANIFEST.MF)
;ReferencedAssemblies/JacksonParser/stax2-api-3.0.0.jar(!META-INF/MANIFEST.MF)
;ReferencedAssemblies/XStream/xpp3_min-1.1.4c.jar(!META-INF/MANIFEST.MF)
这是我能做到的最远的进展,如果我不进行优化,我就能导出一个APK。
我还做了以下操作:
-dontwarn org.xmlpull.v1.**
由于这似乎是一个已知的问题(请参见上面的链接),有人知道发生了什么或者如何解决它吗?我有一种感觉,这可能与我同时使用XStream和JacksonParser有关,也许其中一个JacksonParser库中还有XmlPullParser?问题是,这可以解释优化错误,但不能解释混淆错误。对于后者我毫无头绪。即使我明确保留了该方法,为什么它仍然找不到呢?
谢谢大家。