【发布时间】:2011-07-21 18:31:42
【问题描述】:
我在使用带有一些库的 Proguard 的 Android 项目上遇到了一些麻烦。具体来说,我遇到了 XmlPullParser 冲突,无论我做什么,我似乎都无法解决它。以下是我正在使用的库:
JacksonParser,包括:
- 杰克逊-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
还有其他的,但它们不是问题。这些似乎是我们问题的罪魁祸首。
具体来说,问题是:
优化
如果我进行优化,我会得到“转换为 dalvik 失败,结果为 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?问题是,这可以解释优化错误,但不能解释混淆错误。我不知道那个。为什么它不会找到那个方法,即使如果我明确地保留了它?
谢谢大家。
【问题讨论】: