flutter_boost icon indicating copy to clipboard operation
flutter_boost copied to clipboard

[Bug]: 执行代理跳转创建FBFlutterViewContainer时候卡死,也不闪退就是卡死整个app动不了

Open WillianZhang opened this issue 7 months ago • 10 comments

请描述遇到的问题,以及您所期望的正确的结果

在按照配置初始化flutterboost后,按钮点击执行[[FlutterBoost instance]open:options]; 触发代理pushFlutterRoute 在pushFlutterRoute方法中 创建FBFlutterViewContainer *vc = [[FBFlutterViewContainer alloc] init]; 程序卡死在这里,FBFlutterViewContainer.m中所有方法断点后都没执行,无法进行任何操作,这是个别机型版本会出现的问题。我这里用到的是13pro 18.3.2系统版本。为什么少部分机型会出现这样的问题,而且同一种机型也不是每个都会出问题。

请说明如何操作会遇到上述问题

正常的点击原生事件触发跳转到flutter模块的操作,在少部分机型会复现此问题。复现率很低,但是某一手机有问题的话会100%复现,一定卡死。卸载app重装等都没用。

在下面填入关键复现代码

  • (void)pushFlutterRoute:(FlutterBoostRouteOptions *)options {

    *//执行FBFlutterViewContainer vc = [[FBFlutterViewContainer alloc] init];的时候直接卡死

    FBFlutterViewContainer *vc = [[FBFlutterViewContainer alloc] init];

    [vc setName:options.pageName uniqueId:options.uniqueId params:options.arguments opaque:options.opaque];

    //是否伴随动画 BOOL animated = YES; NSNumber * animatedValue = options.arguments[@"animated"]; if(animatedValue){ animated = [animatedValue boolValue]; }

    BOOL present = [options.arguments[@"present"] boolValue] || !options.opaque;

    if(present){ [self.navigationController presentViewController:vc animated:animated completion:^{ options.completion(YES); }]; }else{ [self.navigationController pushViewController:vc animated:animated]; options.completion(YES); } }

复现的平台

iOS

Flutter SDK版本

3.27.0

FlutterBoost版本

4.6.5

是否延迟初始化FlutterBoost

No

解决方案

WillianZhang avatar May 16 '25 09:05 WillianZhang

大佬,有解决方案吗? 我这也是 到这儿就不往下走了 let vc: FBFlutterViewContainer = FBFlutterViewContainer()

AnnyName avatar May 19 '25 01:05 AnnyName

我也是遇见,还没解决,在线等。

xieyinghao avatar May 26 '25 08:05 xieyinghao

可以看看你的delegate咋写的吗

xieyinghao avatar May 27 '25 01:05 xieyinghao

问题解决了吗,遇见一样情况,同问。

xieyinghao avatar May 27 '25 09:05 xieyinghao

看堆栈是 flutter内部死锁了 flutter version >= 3.27.0 都有问题

* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
  * frame #0: 0x0000000110703564 libsystem_kernel.dylib`__psynch_mutexwait + 8
    frame #1: 0x000000010f97fb10 libsystem_pthread.dylib`_pthread_mutex_firstfit_lock_wait + 80
    frame #2: 0x000000010f97d6b4 libsystem_pthread.dylib`_pthread_mutex_firstfit_lock_slow + 216
    frame #3: 0x0000000119f419cc Flutter`std::_fl::mutex::lock() + 12
    frame #4: 0x0000000119ede9b4 Flutter`flutter::PlatformViewIOS::SetOwnerViewController(fml::WeakNSObject<FlutterViewController> const&) + 36
    frame #5: 0x0000000119ece308 Flutter`-[FlutterEngine notifyViewControllerDeallocated] + 120
    frame #6: 0x00000001804110e4 CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 120
    frame #7: 0x000000018041101c CoreFoundation`___CFXRegistrationPost_block_invoke + 88
    frame #8: 0x0000000180410504 CoreFoundation`_CFXRegistrationPost + 404
    frame #9: 0x000000018040fef0 CoreFoundation`_CFXNotificationPost + 696
    frame #10: 0x00000001810a6290 Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:] + 88
    frame #11: 0x0000000119ed7a7c Flutter`-[FlutterViewController deregisterNotifications] + 72
    frame #12: 0x0000000119ed7af0 Flutter`-[FlutterViewController dealloc] + 76
    frame #13: 0x0000000119f12b40 Flutter`flutter::AccessibilityBridge::~AccessibilityBridge() + 212
    frame #14: 0x0000000119ede3f8 Flutter`std::_fl::unique_ptr<flutter::AccessibilityBridge, std::_fl::default_delete<flutter::AccessibilityBridge>>::reset[abi:v15000](flutter::AccessibilityBridge*) + 28
    frame #15: 0x0000000119ede3c8 Flutter`flutter::PlatformViewIOS::AccessibilityBridgeManager::Clear() + 60
    frame #16: 0x0000000119ede9e4 Flutter`flutter::PlatformViewIOS::SetOwnerViewController(fml::WeakNSObject<FlutterViewController> const&) + 84
    frame #17: 0x0000000119ece05c Flutter`-[FlutterEngine setViewController:] + 168
    frame #18: 0x000000010de31cd8 flutter_boost`-[FBFlutterViewContainer init](self=0x000000014c0cd800, _cmd="init") at FBFlutterViewContainer.m:81:10

yaotiancheng-ola avatar Jun 10 '25 07:06 yaotiancheng-ola

解决方案: 关闭引擎预热

        let delegate = BoostDelegate()
        let options = FlutterBoostSetupOptions.createDefault()
        options?.warmUpEngine = false
        
        FlutterBoost.instance().setup(application, delegate: delegate, callback: { _ in }, options: options)
        

yaotiancheng-ola avatar Jun 10 '25 07:06 yaotiancheng-ola

解决方案: 关闭引擎预热

        let delegate = BoostDelegate()
        let options = FlutterBoostSetupOptions.createDefault()
        options?.warmUpEngine = false
        
        FlutterBoost.instance().setup(application, delegate: delegate, callback: { _ in }, options: options)
        

禁了预热以后,现在退到后台时不时会崩溃

tongzifang avatar Jun 13 '25 05:06 tongzifang

解决方案: 关闭引擎预热

        let delegate = BoostDelegate()
        let options = FlutterBoostSetupOptions.createDefault()
        options?.warmUpEngine = false
        
        FlutterBoost.instance().setup(application, delegate: delegate, callback: { _ in }, options: options)
        

禁了预热以后,现在退到后台时不时会崩溃

我们测试了一段时间没出现过,有堆栈吗?

yaotiancheng-ola avatar Jun 13 '25 06:06 yaotiancheng-ola

FlutterBoost.m 中的预热引擎方法如下:

/// 提前预热引擎
- (void)warmUpEngine {
  FlutterViewController* vc = [[FlutterViewController alloc] initWithEngine:self.engine
                                                                    nibName:nil bundle:nil];
//卡死页面的代码地方
//下面这几行代码的调用时机应在在addChildVC后,没有addChildVC直接调用会有问题
  [vc beginAppearanceTransition:YES animated:NO];
  [vc endAppearanceTransition];
  [vc beginAppearanceTransition:NO animated:NO];
  [vc endAppearanceTransition];
}

解决方法:

  1. 初始化时关闭预热 AppDelegate.swift
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        let ops:FlutterBoostSetupOptions = FlutterBoostSetupOptions()
        //关闭预热
        ops.warmUpEngine = false
        let delegate = MyBoostAppDelegate.shared
        FlutterBoost.instance().setup(application, delegate: delegate, callback: { engine in
                                        
        }, options: ops)
        return true
    }
  1. 手动预热,最好在window的根控制器中,或其他控制器中,自己根据情况选择 ViewController.swift
    override func viewDidLoad() {
        super.viewDidLoad()
        //手动预热
        if let eg = FlutterBoost.instance().engine() {
           let vc = FBFlutterViewContainer(engine: eg, nibName: nil, bundle: nil)
            //隐藏视图
            vc.view.isHidden = true
            self.addChild(vc)
            vc.beginAppearanceTransition(true, animated: false)
            vc.endAppearanceTransition()
            vc.beginAppearanceTransition(false, animated: false)
            vc.endAppearanceTransition()
        }

HeHuiqi avatar Jun 25 '25 02:06 HeHuiqi

flutter 3.27.4,flutter_boost 4.2.0, 我按照上面关闭了预热, 但是部分机型仍有问题

threeWolf avatar Sep 30 '25 02:09 threeWolf