迁移至Expo后Android端出现RuntimeException交付结果失败求助
问题:Expo迁移后Android端Crashlytics出现
Already resumed错误(关联expo-image-picker) 迁移应用至Expo后,仅Android端在Crashlytics中捕获到如下崩溃错误:
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1638309729, result=-1, data=Intent { flg=0x1 clip={image/* video/* U:content://media/external/file/695} }} to activity {MY-APP-SCHEME/MY-APP-SCHEME.MainAc
经排查怀疑与expo-image-picker相关,但已确认权限配置及API实现均无问题,团队在模拟器和真机上均无法复现该问题,求相关排查思路。
完整错误堆栈如下:
at android.app.ActivityThread.deliverResults(ActivityThread.java:5341) at android.app.ActivityThread.handleSendResult(ActivityThread.java:5380) at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2247) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7886) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:568) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
Caused by java.lang.IllegalStateException: Already resumed at kotlin.coroutines.SafeContinuation.resumeWith(SafeContinuationJvm.kt:44) at expo.modules.kotlin.activityresult.AppContextActivityResultLauncher$launch$2$1.onActivityResult(AppContextActivityResultLauncher.kt:26) at expo.modules.kotlin.activityresult.AppContextActivityResultRegistry.doDispatch(AppContextActivityResultRegistry.kt:317) at expo.modules.kotlin.activityresult.AppContextActivityResultRegistry.dispatchResult(AppContextActivityResultRegistry.kt:295) at expo.modules.kotlin.activityresult.ActivityResultsManager.onActivityResult(ActivityResultsManager.kt:52) at expo.modules.kotlin.AppContext.onActivityResult$expo_modules_core_release(AppContext.kt:337) at expo.modules.kotlin.ReactLifecycleDelegate.onActivityResult(ReactLifecycleDelegate.kt:33) at com.facebook.react.bridge.ReactContext.onActivityResult(ReactContext.java:375) at com.facebook.react.ReactInstanceManager.onActivityResult(ReactInstanceManager.java:809) at com.facebook.react.ReactDelegate.onActivityResult(ReactDelegate.java:148) at com.facebook.react.ReactActivityDelegate.onActivityResult(ReactActivityDelegate.java:145) at expo.modules.ReactActivityDelegateWrapper.onActivityResult(ReactActivityDelegateWrapper.kt:223) at com.facebook.react.ReactActivity.onActivityResult(ReactActivity.java:70) at android.app.Activity.dispatchActivityResult(Activity.java:8381) at android.app.ActivityThread.deliverResults(ActivityThread.java:5334) at android.app.ActivityThread.handleSendResult(ActivityThread.java:5380) at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2247) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7886) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:568) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
排查思路
- 升级依赖版本:
Already resumed异常多由Expo模块内部协程重复恢复的bug导致,优先升级expo-image-picker至最新稳定版,同步升级Expo SDK到兼容版本,旧版本的ActivityResult处理逻辑存在此类问题。 - 避免重复调用:检查是否存在快速连续触发图片选择的场景(比如重复点击按钮),未等待上一次选择结果返回就发起新请求会导致协程重复恢复。可以添加状态锁,比如用
isPickerActive变量标记请求状态,请求开始时设为true,结果返回或取消后设为false,禁止并发请求。 - 模拟后台回收场景:无法复现可能是未测试应用被系统回收后的恢复流程。开启开发者选项中的“不保留活动”,切换到相册时应用会被销毁,返回后观察是否触发崩溃——这种场景下Expo协程状态可能丢失,导致恢复时异常。
- 检查Activity配置:若自定义过MainActivity或修改了AndroidManifest中的launchMode(比如
singleInstance/singleTask),需恢复为Expo默认配置测试,特殊启动模式可能导致Activity结果传递逻辑混乱。 - 添加异常捕获与日志:在调用
expo-image-picker的代码处添加try-catch捕获IllegalStateException,避免崩溃扩散;同时在Crashlytics中添加自定义日志,记录调用时的应用状态、设备信息,定位特定触发场景。 - 确认权限申请时机:确保权限申请完成并返回允许后,再调用图片选择API,避免权限请求的回调与图片选择请求冲突,导致ActivityResult处理逻辑混乱。
内容的提问来源于stack exchange,提问作者Dean Elliott
相关产品推荐
相关产品推荐

