错误:库类 android.content.res.XmlResourceParser 在 R8 缩小期间实现程序类 org.xmlpull.v1.XmlPullParser

问题描述 投票:0回答:1

我在尝试为我的 Android 项目制作签名应用程序包时遇到错误。构建过程在 minifyReleaseWithR8 任务期间失败,并显示以下消息:

任务:app:minifyReleaseWithR8 AGPBI:{“kind”:“警告”,“text”:“意外引用 META-INF/services/org.xmlpull.v1.XmlPullParserFactory 中缺少的服务实现类:org.kxml2.io.KXmlParser,org.kxml2。 io.KXmlSerializer。","来源":[{"文件":"D:\Projects\AndroidStudioProjects\MyAndroidApp pp uild\intermediates\merged_java_res elease\mergeReleaseJavaResource ase.jar"}],"工具":"R8"} AGPBI: {"kind":"error","text":"库类 android.content.res.XmlResourceParser 实现程序类 org.xmlpull.v1.XmlPullParser","sources":[{}],"tool": “R8”} 库类 android.content.res.XmlResourceParser 实现程序类 org.xmlpull.v1.XmlPullParser 任务:app:minifyReleaseWithR8 失败

添加了以下 ProGuard 规则:

    -keep class android.content.res.XmlResourceParser { *; } -keep class org.kxml2.io.KXmlParser { *; } -keep class org.kxml2.io.KXmlSerializer { *; } -keep class org.xmlpull.v1.** { *; }

尽管做出了这些努力,错误仍然存在。我将不胜感激任何解决此问题的见解或解决方案。谢谢!

其他详细信息 Android Studio 版本:Android Studio Jellyfish | 2023.3.1 补丁1 摇篮版本:8.6 R8版本:8.4.1

android gradle xmlpullparser android-r8 kxml2
1个回答
0
投票

导致该错误的一个可能原因是在 Android 中使用了不适合 Android 的 Java XML 解析器库。常见的罪魁祸首是

org.simpleframework.simple-xml

出现此问题的原因是 Android 提供了一个内置类

org.xmlpull.v1.XmlPullParser
,该类在基础 Java 中不可用。 XML 解析器库提供了它自己的同一类的实现,因为它假定它在基本 Java 中运行,而该类不存在。这两种实现最终会发生冲突。

解决方案是尝试排除自定义实现。

首先,您需要弄清楚哪个依赖项带来了自己的 XML 解析器。您需要查看

app/build.gradle
部分内的
dependencies
。如果幸运的话,很可能嫌疑人会通过名称中包含“xml”来出现:

    implementation 'com.squareup.retrofit2:converter-simplexml:2.11.0'

用 Android 特定的库完全替换该库将是最佳选择。但这并不总是可能的。幸运的是,该库可能不会直接实现该类,而是依赖不同的库来实现。

因此,下一步是深入研究 Maven 依赖项,找出哪个依赖项实际上引入了不需要的类。

例如,如果我们在 mvnrepository.com 页面查找上述包,单击 我们正在使用的版本,然后向下滚动,我们可以看到

Compile Dependencies
列出以下工件:

com.squareup.retrofit2 » retrofit 2.11.0
org.simpleframework » simple-xml 2.7.1

再次,

simple-xml
成为可能的嫌疑人。 再次点击版本号并向下滚动,我们发现以下依赖项:

stax » stax-api 1.0.1
stax » stax 1.2.0
xpp3 » xpp3 1.1.3.3

点击每个,我们可以注意到

xpp3
的全名是
MXP1: Xml Pull Parser 3rd Edition (XPP3)
。关键字“Xml Pull Parser”与有问题的类名称非常匹配,因此很可能成为嫌疑对象。

下一步是将其从构建中排除。我们将

app/build.gradle
中的行修改如下:

    implementation('com.squareup.retrofit2:converter-simplexml:2.11.0') { exclude group: 'xpp3', module: 'xpp3' }

这将从构建中排除

xpp3 » xpp3
(即组
xpp3
、模块
xpp3
),从而允许使用内置
org.xmlpull.v1.XmlPullParser
。依赖库
org.simpleframework.simple-xml
com.squareup.retrofit2.converter-simplexml
仍将正常构建,链接到内置
org.xmlpull.v1.XmlPullParser
而不是
xpp3.xpp3
提供的库。

您的项目的具体步骤可能会有所不同,具体取决于您直接或间接使用的 XML 解析器库。在最坏的情况下,您可能必须深入了解所有依赖项。但希望任何引入自己的 XML 解析器的库都明确标记为“xml”。

© www.soinside.com 2019 - 2024. All rights reserved.