Android项目生成签名App Bundle时R8混淆报错求助
构建流程在minifyReleaseWithR8阶段报错,具体信息如下:
Task :app:minifyReleaseWithR8
AGPBI: {"kind":"warning","text":"Unexpected reference to missing service implementation class in META-INF/services/org.xmlpull.v1.XmlPullParserFactory: org.kxml2.io.KXmlParser,org.kxml2.io.KXmlSerializer.","sources":[{"file":"D:\Projects\AndroidStudioProjects\MyAndroidApp\app\build\intermediates\merged_java_res\release\mergeReleaseJavaResource\base.jar"}],"tool":"R8"}
AGPBI: {"kind":"error","text":"Library class android.content.res.XmlResourceParser implements program class org.xmlpull.v1.XmlPullParser","sources":[{}],"tool":"R8"}
Library class android.content.res.XmlResourceParser implements program class org.xmlpull.v1.XmlPullParser
Task :app:minifyReleaseWithR8 FAILED
已尝试添加以下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 Patch 1
- Gradle版本:8.6
- R8版本:8.4.1
核心原因分析
错误提示Library class android.content.res.XmlResourceParser implements program class org.xmlpull.v1.XmlPullParser的本质是:Android系统库中的XmlResourceParser实现了项目中引入的第三方程序包类org.xmlpull.v1.XmlPullParser,违反了R8的类归属规则,导致类加载冲突。同时警告信息说明项目缺少XmlPullParserFactory的默认服务实现类。
方案1:移除重复的xmlpull依赖
执行Gradle命令查看项目依赖树,定位重复引入的xmlpull库:
./gradlew app:dependencies
在Module级别的build.gradle中,通过exclude移除第三方库中的xmlpull依赖,保留系统内置版本:
implementation('第三方库坐标') { exclude group: 'xmlpull', module: 'xmlpull' }
方案2:调整R8规则明确类归属
添加以下R8规则,将org.xmlpull.v1包标记为系统库类,并保留服务配置文件:
-dontwarn org.xmlpull.v1.** -keep class org.xmlpull.v1.** { *; } -keep interface org.xmlpull.v1.** { *; } -libraryjars android.jar # 保留META-INF中的服务配置 -keepresourcefiles META-INF/services/org.xmlpull.v1.XmlPullParserFactory
方案3:强制使用系统内置XmlPullParser
在Module级别的build.gradle中添加配置,优先使用系统库的实现并处理服务配置冲突:
android { compileOptions { coreLibraryDesugaringEnabled = true } packagingOptions { pickFirst 'META-INF/services/org.xmlpull.v1.XmlPullParserFactory' } }
若启用了coreLibraryDesugaring,需添加对应依赖:
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
方案4:升级R8版本
Gradle 8.6推荐搭配AGP 8.6.x(对应R8 8.6.x版本),在Project级别的build.gradle中更新AGP版本:
plugins { id 'com.android.application' version '8.6.0' apply false }
AGP会自动匹配兼容的R8版本,无需单独指定。
内容的提问来源于stack exchange,提问作者MGB

