Flutter嵌入Android模块崩溃:FlutterJNI未关联Native
Flutter模块集成Android时FlutterJNI未绑定原生的崩溃解决方案
问题场景
将Flutter以模块形式集成到原生Android应用,通过继承FlutterFragment并使用Cached Engine实现自定义Flutter Fragment,该Fragment用于Tab页的ViewPager内,在Firebase Crashlytics中捕获到无法复现的崩溃日志:
Fatal Exception: java.lang.RuntimeException: Cannot execute operation because FlutterJNI is not attached to native. at io.flutter.embedding.engine.FlutterJNI.ensureAttachedToNative(FlutterJNI.java:516) at io.flutter.embedding.engine.FlutterJNI.setSemanticsEnabled(FlutterJNI.java:876) at io.flutter.embedding.engine.systemchannels.AccessibilityChannel.onAndroidAccessibilityDisabled(AccessibilityChannel.java:130) at io.flutter.view.AccessibilityBridge$2.onAccessibilityStateChanged(AccessibilityBridge.java:372) at io.flutter.view.AccessibilityBridge.<init>(AccessibilityBridge.java:447) at io.flutter.view.AccessibilityBridge.<init>(AccessibilityBridge.java:422) at io.flutter.embedding.android.FlutterView.attachToFlutterEngine(FlutterView.java:1133) at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onCreateView(FlutterActivityAndFragmentDelegate.java:401) at io.flutter.embedding.android.FlutterFragment.onCreateView(FlutterFragment.java:1073) at air.com.religare.iPhone.flutter.NetMarginFlutterFragment.onCreateView(MyCustomFlutterFragment.kt:30)
崩溃原因
崩溃核心是FlutterEngine生命周期与Fragment/ViewPager生命周期不匹配:ViewPager的预加载、销毁机制会导致Fragment被提前创建或销毁,而Cached Engine可能未完成原生绑定,或已被提前解绑。此时AccessibilityBridge初始化时触发的setSemanticsEnabled方法,会调用未绑定原生的FlutterJNI,引发异常。
解决方案
1. 提前初始化并缓存FlutterEngine
在Application启动时创建并缓存FlutterEngine,确保引擎在应用生命周期内保持活跃,避免Fragment创建时才初始化:
class MyApp : Application() { lateinit var flutterEngine: FlutterEngine override fun onCreate() { super.onCreate() // 初始化FlutterEngine flutterEngine = FlutterEngine(this) // 执行Dart入口点 flutterEngine.dartExecutor.executeDartEntrypoint( DartExecutor.DartEntrypoint.createDefault() ) // 缓存引擎 FlutterEngineCache.getInstance().put("net_margin_engine", flutterEngine) } }
2. 重写Fragment生命周期,管理引擎绑定
在自定义FlutterFragment中,确保引擎绑定时机正确,延迟解绑避免回调冲突:
class NetMarginFlutterFragment : FlutterFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 指定使用缓存的引擎ID setCachedEngineId("net_margin_engine") } override fun onDetach() { // 延迟执行父类的onDetach,避免ViewPager销毁Fragment时立即解绑引擎 Handler(Looper.getMainLooper()).postDelayed({ super.onDetach() }, 100) } }
3. 临时禁用辅助功能通道(应急方案)
如果崩溃无法快速修复,可临时禁用AccessibilityChannel,避免触发相关回调:
// 在FlutterEngine初始化后调用 flutterEngine.plugins.accessibilityChannel.setAccessibilityEnabled(false)
4. 优化ViewPager预加载策略
减少ViewPager预加载页数,避免不必要的Fragment创建和引擎绑定:
viewPager.offscreenPageLimit = 0
内容的提问来源于stack exchange,提问作者Anukool srivastav
相关产品推荐
相关产品推荐

