Proguard和XmlPullParser的问题

bry*_*ich 4 android proguard

我在使用Proguard和一些库的Android项目上遇到了一些麻烦.具体来说,我有一个XmlPullParser碰撞,无论我做什么,我似乎无法解决它.这是我正在使用的库:

JacksonParser,包括:

  • 杰克逊all.1.6.4.jar
  • 乔达-time.1.6.2.jar
  • JSR311的API-1.0.jar
  • stax2-API-3.0.0.jar

XStream,包括:

  • xpp3_min-1.1.4c.jar
  • 西河星汇换Android的1.0.0.jar

还有其他人,但他们不是问题.这些似乎是我们问题的罪魁祸首.

具体来说,问题是:

优化

如果我进行优化,我会"转换为dalvik失败1".在外部JAR的"转换为Dalvik格式失败并出现错误1"中有一篇专门的帖子,这使我指出了重复的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/**)
Run Code Online (Sandbox Code Playgroud)

我也试过明确删除它们:

-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)
Run Code Online (Sandbox Code Playgroud)

但这两种方法都没有帮助.

但等等,还有更多(尽管所有问题都集中在同一个问题上,所以我想如果我解决了这个问题,那么其他问题就会消失).

困惑

如果我尝试混淆,我得到以下运行时错误:

java.lang.NoSuchMethodError: android.content.res.XmlResourceParser.s
looking this up in the mapping, i get: .s = abstract int next()
Run Code Online (Sandbox Code Playgroud)

所以它缺少next()方法.那么为什么这种方法丢失了?我不明白.我甚至试过这样做:

-keep class android.content.res.XmlResourceParser { int next(); }
Run Code Online (Sandbox Code Playgroud)

确保方法得到保留,但我仍然遇到同样的问题.

收缩

萎缩似乎也失败了.应用程序启动但永远不会到达任何地方,它只是不断尝试一遍又一遍地启动第一个活动并给我一个无用的错误.我不是很担心这个,但是,如果我可以进行模糊处理和优化工作,我可以不受畏缩地生活.

更多信息

作为参考,我试图以两种方式引用我的库,第一种是使用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)
Run Code Online (Sandbox Code Playgroud)

这甚至不会建立.

我也这样做了:

-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)
Run Code Online (Sandbox Code Playgroud)

这让我走得最远,如果我不优化,我可以导出APK.

我也这样做了:

-dontwarn org.xmlpull.v1.**
Run Code Online (Sandbox Code Playgroud)

因为这似乎是一个已知问题(见前面的链接)

任何人都知道这里发生了什么或我如何解决它?我有一种感觉,这与我使用XStream和JacksonParser的事实有关,也许其中一个JacksonParser库中也有一个XmlPullParser?问题是,这可以解释优化错误,但不能解释混淆错误.我不知道那个.为什么不找到那种方法,即使我明确地保留了它?

谢谢大家.

ste*_*fan 9

这对我有用:

-dontwarn org.xmlpull.v1.**
-dontnote org.xmlpull.v1.**
-keep class org.xmlpull.** { *; }
Run Code Online (Sandbox Code Playgroud)


Eri*_*une 2

您的 ProGuard 配置和构建过程似乎混淆了程序 jar 和库 jar。

对于 ProGuard,您可以将所有列出的 jar 指定为输入 jar(使用 -injars)。它们的处理版本最终将出现在输出 jar (-outjars) 中。

您确实可以通过从 android.jar 中过滤掉重复的 xmlpull 类来避免有关重复的 xmlpull 类的警告。如果输入 jar 中有任何重复项,ProGuard 还会打印出警告。然后您也可以过滤掉这些重复项。

您不应指定<java.home>/lib/rt.jar为库 jar,因为此 jar 也不作为 Android 设备上的库存在。不过,列出的一些 jar 依赖于它,因此至少其中一部分与 Android 运行时不完全兼容。避免有关违规类的警告的最干净的解决方案是将它们从相应的输入 jar 中过滤出来(例如过滤器!com/thoughtworks/xstream/converters/extended/ColorConverter.class)。或者,您可以直接关闭这些警告(例如-dontwarn com.thoughtworks.xstream.converters.extended.ColorConverter)。

对于 Dalvik 编译器,您应该只指定处理后的输出 jar,而不是任何进入其中的程序 jar。否则,您将得到重复的类:一些未处理的副本和一些部分混淆的副本。它们不会混合并导致 Error1 和 NoSuchMethodErrors。