org.xmlpull.v1.XmlPullParser 的 Android ProGuard 错误
Posted
技术标签:
【中文标题】org.xmlpull.v1.XmlPullParser 的 Android ProGuard 错误【英文标题】:Android ProGuard error with org.xmlpull.v1.XmlPullParser 【发布时间】:2011-07-17 01:42:21 【问题描述】:当我的应用程序使用 ProGuard 构建时,它会失败并显示以下消息。 我使用由 android SDK 生成的默认 proguard.cfg 和一些 -libraryjars。 我能为它做些什么?
[2011-03-17 09:27:04 - MyProject] Proguard returned with error code 1. See console
[2011-03-17 09:27:04 - MyProject] Note: there were 4247 duplicate class definitions.
[2011-03-17 09:27:04 - MyProject] Warning: library class android.content.res.XmlResourceParser extends or implements program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.content.Intent depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.AnimationDrawable depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.BitmapDrawable depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] You should check if you need to specify additional program jars.
[2011-03-17 09:27:04 - MyProject] Warning: there were 9 instances of library classes depending on program classes.
[2011-03-17 09:27:04 - MyProject] You must avoid such dependencies, since the program classes will
[2011-03-17 09:27:04 - MyProject] be processed, while the library classes will remain unchanged.
[2011-03-17 09:27:04 - MyProject] java.io.IOException: Please correct the above warnings first.
[2011-03-17 09:27:04 - MyProject] at proguard.Initializer.execute(Initializer.java:321)
[2011-03-17 09:27:04 - MyProject] at proguard.ProGuard.initialize(ProGuard.java:211)
[2011-03-17 09:27:04 - MyProject] at proguard.ProGuard.execute(ProGuard.java:86)
[2011-03-17 09:27:04 - MyProject] at proguard.ProGuard.main(ProGuard.java:492)
显然,org.xmlpull.v1.XmlPullParser 不是程序类。 我已将 ProGuard 更新到最新版本 (4.6),但有相同的警告。
【问题讨论】:
【参考方案1】:将此行添加到 proguard-project.txt
-dontwarn org.xmlpull.v1.**
这一行到 project.properties
proguard.config=proguard-project.txt
【讨论】:
我找不到 proguard-project.txt 和 project.properties。我有两个 .properties 文件:- 1. local.properties 2. gradle.properties 。 proguard-rules.pro 文件在应用模块中可用 非常感谢您的回答。就我而言,我必须同时使用您的答案和 -keep class org.xmlpull.v1.** *; 添加此行后应用仍然崩溃【参考方案2】:我使用 proguard 文件中的设置解决了这个问题:
-dontwarn org.kobjects.**
-dontwarn org.ksoap2.**
-dontwarn org.kxml2.**
-dontwarn org.xmlpull.v1.**
-keep class org.kobjects.** *;
-keep class org.ksoap2.** *;
-keep class org.kxml2.** *;
-keep class org.xmlpull.** *;
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontoptimize
-dontpreverify
【讨论】:
请避免从您的相同答案共享链接复制粘贴@Ton 我必须添加以下 2 行才能使其正常工作 -dontwarn org.codehaus.** 和 -keep class org.codehaus.** *; @Ton 我应该在哪里添加? proguard-project.txt 文件 你保留了很多你不需要的东西。您也没有明确表示您实际上需要保留任何东西。 OP 没有 NoSuchMethod 或 ClassNotFound 异常。【参考方案3】:我还没有通过 android 的 eclipse 运行 proguard 的解决方案,但是如果您从命令行手动运行 proguard,您可以将以下内容放入您的 proguard.cfg
:
-basedirectory /home/pjv/workspace/collectionista-repo/collectionista-main
-injars /tmp/android_4500371803543847111.jar
-injars libs/joda-time-1.6.jar(!META-INF/MANIFEST.MF)
-injars libs/FlurryAgent.jar(!META-INF/MANIFEST.MF)
-injars libs/veecheck-2.0.jar(!META-INF/MANIFEST.MF)
-injars libs/commons-lang-2.4.jar(!META-INF/MANIFEST.MF,!META-INF/NOTICE.txt,!META-INF/LICENSE.txt)
-injars libs/OIAbout-lib-temporary.jar(!META-INF/MANIFEST.MF)
-injars libs/libGoogleAnalytics.jar(!META-INF/MANIFEST.MF)
-injars libs/xstream-1.3.1.jar(!META-INF/MANIFEST.MF)
-injars libs/ZQL_custom.jar(!META-INF/MANIFEST.MF)
-injars libs/xpp3_min-1.1.4c.jar(!META-INF/MANIFEST.MF)
-injars libs/GoogleAdMobAdsSdk-4.1.0.jar(!META-INF/MANIFEST.MF)
-injars libs/bugsense-trace.jar(!META-INF/MANIFEST.MF)
-outjars /tmp/android_1348923171424559204.jar
-libraryjars /opt/android-sdk/android-sdk-linux_x86-1.6_r1/platforms/android-12/android.jar(!org/xmlpull/v1/XmlPullParser.class,!org/xmlpull/v1/XmlPullParserException.class)
注意XmlPullParser.class
是如何从 android API jar 中过滤出来的。
暂时不要担心与XmlPullParser
相关的警告。首先修复错误和其他警告,如果必须,请在 proguard.cfg
中使用 -ignorewarnings
。
【讨论】:
与此同时,我转向了更优雅的东西。见***.com/questions/6780902/…【参考方案4】:我认为你的jar包包含XmlPullParser
类,android.jar也包含这个。
所以你可以把jar包中的org.xmlpull.*
类去掉,重新构建。
【讨论】:
您能否详细说明这意味着什么?以及可能如何做到这一点。 “jar包”是什么意思? 如何删除? implementation('com.thoughtworks.xstream:xstream:1.4.10-java7') exclude(group: "xmlpull") 不起作用 实现(“com.squareup.retrofit2:converter-simplexml:2.6.0”)排除模块:“simple-xml”【参考方案5】:根据您提供的部分日志,Android 运行时类 org.xmlpull.v1.XmlPullParser 已在您的程序代码中结束。您应该确保它不存在于 bin/classes 或 lib 的某个 jar 中,因为它已经存在于库 jar android.jar 中。
此外,您有 4247 个重复的类定义。这可能是由于您提到的指定“一些-libraryjars”。我猜这些库 jar 已经被构建脚本自动包含了,所以你不应该再次指定它们。
【讨论】:
Eric,他(或者无论如何,我)在他的库中的一个 jar 中拥有 XmlPullParser 类的原因是它会覆盖 Android 内置的 XmlPullParser 类,该类在某些用途上是有缺陷的.由于我们在 Android 上制定 proguard.cfg 的方式,不可能过滤掉内置的,我们也不想过滤掉更好的,AFAIK。如果可能的话,滚动我们自己的 Android jar 似乎也不明智。我们应该如何处理?谢谢 如果你的程序 jars 包含更好的实现,你真的应该尝试过滤掉库版本,使用“-libraryjars android.jar(!org/xmlpull/v1/**)”,所以 ProGuard 得到干净的输入。如果这不可能,您可以指定类似“-dontwarn org.xmlpull.v1.**”的内容。它应该在这种情况下工作,因为 ProGuard 使程序类优先于库类。【参考方案6】:您的文件夹中已存在依赖项,
像下面这样排除它:
dependencies
configurations
all*.exclude group: 'xmlpull', module: 'xmlpull'
【讨论】:
【参考方案7】:当您将其中一个测试库作为常规模块依赖项包含时,有时会发生这种情况。例如不要这样做:
implementation 'com.android.support.test:runner:1.0.2' //wrong!!
做:
androidTestImplementation 'com.android.support.test:runner:1.0.2' //right (:
【讨论】:
【参考方案8】:对我来说,我可以通过删除我之前修改的 build.gradle 来解决它
我删除了:
minifyEnabled true
shrinkResources true
又回到原来的设置
minifyEnabled false
【讨论】:
你解决proguard问题的方法是关闭proguard?以上是关于org.xmlpull.v1.XmlPullParser 的 Android ProGuard 错误的主要内容,如果未能解决你的问题,请参考以下文章