Flutter Release模式调用Smack框架触发XmlPullParserException异常
问题场景
Flutter应用调用Java框架Smack时,debug和profile编译模式运行完全正常,但切换到release模式时触发异常,推测问题与构建流程细节相关。
关键报错信息
Caused by: org.xmlpull.v1.XmlPullParserException: unsupported feature: XMLPULL FAQ (position:START_DOCUMENT null@1:1) at org.kxml2.io.KXmlParser.setFeature(KXmlParser.java:2102)
完整调用栈
java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:353) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383) at java.util.concurrent.FutureTask.setException(FutureTask.java:252) at java.util.concurrent.FutureTask.run(FutureTask.java:271) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) Caused by: java.util.ServiceConfigurationError: h8.e: Provider i8.b could not be instantiated at java.util.ServiceLoader.fail(ServiceLoader.java:233) at java.util.ServiceLoader.-wrap1(Unknown Source:0) at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:392) at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:416) at java.util.ServiceLoader$1.next(ServiceLoader.java:494) at h8.a.a(Unknown Source:17) at h8.a.b(Unknown Source:0) at d8.a0.d(Unknown Source:7) at a7.z.d(Unknown Source:0) at a7.z.c(Unknown Source:6) at a7.z.(Unknown Source:97) at a7.u.b(Unknown Source:0) at a7.u.a(Unknown Source:7) at a7.k.(Unknown Source:26) at p4.b.a(Unknown Source:5) at p4.b.doInBackground(Unknown Source:2) at android.os.AsyncTask$2.call(AsyncTask.java:333) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) Caused by: java.lang.ExceptionInInitializerError at java.lang.Class.newInstance(Native Method) at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:388) at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:416) at java.util.ServiceLoader$1.next(ServiceLoader.java:494) at h8.a.a(Unknown Source:17) at h8.a.b(Unknown Source:0) at d8.a0.d(Unknown Source:7) at a7.z.d(Unknown Source:0) at a7.z.c(Unknown Source:6) at a7.z.(Unknown Source:97) at a7.u.b(Unknown Source:0) at a7.u.a(Unknown Source:7) at a7.k.(Unknown Source:26) at p4.b.a(Unknown Source:5) at p4.b.doInBackground(Unknown Source:2) at android.os.AsyncTask$2.call(AsyncTask.java:333) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) Caused by: org.xmlpull.v1.XmlPullParserException: unsupported feature: XMLPULL FAQ (position:START_DOCUMENT null@1:1) at org.kxml2.io.KXmlParser.setFeature(KXmlParser.java:2102) at i8.b.(Unknown Source:25) at java.lang.Class.newInstance(Native Method) at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:388) at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:416) at java.util.ServiceLoader$1.next(ServiceLoader.java:494) at h8.a.a(Unknown Source:17) at h8.a.b(Unknown Source:0) at d8.a0.d(Unknown Source:7) at a7.z.d(Unknown Source:0) at a7.z.c(Unknown Source:6) at a7.z.(Unknown Source:97) at a7.u.b(Unknown Source:0) at a7.u.a(Unknown Source:7) at a7.k.(Unknown Source:26) at p4.b.a(Unknown Source:5) at p4.b.doInBackground(Unknown Source:2) at android.os.AsyncTask$2.call(AsyncTask.java:333) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764)
解决思路
- 修复ProGuard/R8混淆问题:Release模式默认开启代码混淆,可能误删了Smack依赖的XML解析相关类。在
android/app/proguard-rules.pro中添加以下规则:-keep class org.xmlpull.v1.** { *; } -keep class org.kxml2.** { *; } -keep class org.jivesoftware.smack.** { *; } -keep class org.jivesoftware.smackx.** { *; } - 排查依赖冲突:执行
./gradlew app:dependencies查看依赖树,检查是否存在多个XML Pull Parser版本,排除冲突版本,确保仅保留Smack兼容的kxml2实现。 - 保留ServiceLoader配置文件:Smack通过ServiceLoader加载组件,Release构建可能移除
META-INF/services下的配置。在android/app/build.gradle的android块中添加:packagingOptions { pickFirst 'META-INF/services/org.xmlpull.v1.XmlPullParserFactory' merge 'META-INF/services/**' } - 手动指定XmlPullParser实现:在Smack初始化前,在Flutter的Android原生代码中手动设置解析器工厂:
XmlPullParserFactory factory = XmlPullParserFactory.newInstance("org.kxml2.io.KXmlParser", null); factory.setNamespaceAware(true);
内容的提问来源于stack exchange,提问作者Wolfgang Schneider
相关产品推荐
相关产品推荐

