Flutter应用PlayStore上线后audio_service_engine缓存引擎缺失报错排查
核心报错日志如下:
Exception java.lang.RuntimeException: at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3654) at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3806) at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:83) 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:2267) at android.os.Handler.dispatchMessage (Handler.java:107) at android.os.Looper.loop (Looper.java:237) at android.app.ActivityThread.main (ActivityThread.java:8167) at java.lang.reflect.Method.invoke (Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:496) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1100) Caused by java.lang.IllegalStateException: The requested cached FlutterEngine did not exist in the FlutterEngineCache: 'audio_service_engine' at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.setupFlutterEngine (FlutterActivityAndFragmentDelegate.java) at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onAttach (FlutterActivityAndFragmentDelegate.java) at io.flutter.embedding.android.FlutterFragment.onAttach (FlutterFragment.java) at androidx.fragment.app.Fragment.performAttach (Fragment.java) at androidx.fragment.app.FragmentStateManager.attach (FragmentStateManager.java) at androidx.fragment.app.FragmentStateManager.moveToExpectedState (FragmentStateManager.java) at androidx.fragment.app.FragmentStore.moveToExpectedState (FragmentStore.java) at androidx.fragment.app.FragmentManager.moveToState (FragmentManager.java) at androidx.fragment.app.FragmentManager.dispatchStateChange (FragmentManager.java) at androidx.fragment.app.FragmentManager.dispatchCreate (FragmentManager.java) at androidx.fragment.app.FragmentController.dispatchCreate (FragmentController.java) at androidx.fragment.app.FragmentActivity.onCreate (FragmentActivity.java) at io.flutter.embedding.android.FlutterFragmentActivity.onCreate (FlutterFragmentActivity.java) at android.app.Activity.performCreate (Activity.java:7963) at android.app.Activity.performCreate (Activity.java:7952) at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1307) at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3629)
这个报错的核心是:应用尝试从FlutterEngineCache中获取名为audio_service_engine的缓存引擎,但该引擎并未存在于缓存中。可能的触发原因如下:
音频服务引擎初始化滞后
你使用的audio_service依赖默认依赖预缓存的audio_service_engine,但在部分场景下(比如应用被系统回收后重启、通过通知栏直接唤起页面),页面启动时该引擎还未完成初始化与缓存操作,导致找不到目标引擎。系统进程回收导致缓存丢失
Android系统在内存不足时会回收后台进程,之前缓存的FlutterEngine会随进程销毁而消失。如果此时通过通知、DeepLink等方式唤起需要该引擎的页面,进程刚完成重建但还未重新缓存引擎,就会触发该异常。初始化逻辑存在竞态问题
如果代码中是异步初始化FlutterEngine并加入缓存,但触发页面启动的操作是同步执行的,就会出现页面先启动、引擎缓存还未完成的时序问题,最终导致找不到目标引擎。引擎名称配置或缓存代码错误
检查两处关键点:一是AndroidManifest中是否正确指定了要使用的缓存引擎名称(确认audio_service_engine无拼写错误);二是Flutter或Android原生代码中,是否在正确时机调用FlutterEngineCache.getInstance().put("audio_service_engine", engine)完成缓存操作。通知栏唤起的特殊场景
当用户点击音频播放通知时,系统会直接唤起关联的Flutter页面,但如果此时应用主进程还未完全初始化,缓存的引擎还未准备就绪,就会触发该报错。
内容的提问来源于stack exchange,提问作者dfassf

