我在尝试为我的 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 中使用了不适合 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”。