最近两天一直在弄项目ios打包发布,试着打adhoc包然后下载下来在真机上安装,看有没有什么问题,在真机上直接debug运行是没有问题的。
证书弄好后把打好的包发布到蒲公英并下载安装发现程序已进入就直接白屏然后直接就闪退了。
开始的时候想到能定位到崩溃的代码处,因为可以获取到崩溃的日志,以前写原生的时候也搞过,即是用xcode自带的symbolicatecrash工具对dsym文件进行分析。或者使用atos符号化分析工具定位到具体的代码行。从崩溃日志分析得知是flutter里底层调用报的错,但是这种是定位不到具体代码的。
开始找资料如何捕获flutter的异常,有dart异常,engine异常,framework异常等,dart的错误不会崩溃,但是engine的错误会导致崩溃,所以想到使用一些第三方的崩溃日志手机工具。我是使用的是腾讯的bugly,能自动将异常上传。集成后使用adhoc的包测试,始终没有上传的崩溃日志,想了下应该是因为程序直接启动起来就直接崩溃还没来得及加载bugly的服务所以不会有崩溃日志产生。
然后想到能否直接在编译的时候将scheme设置为release模式,这样能否直接在真机上运行的时候就能在xcode上看到它在发布版的崩溃日志。此时需要把release的证书设置为dev证书方可,不然报错
此时flutter run运行正常,但是xcode run始终报错:
Failed to find snapshot:/var/containers/Bundle/Application/xxx/Runner.app/Frameworks/App.framework/flutter_assets/kernel_blob.bin
Engine run configuration was invalid
Could not launch engine with configuration
此时怀疑是xcode和flutter命令运行时使用的是不同的dart环境,因为前几天在本机上安装了dart环境,会不会是和flutter有不同,所以才会有此情况。所以卸载了dart环境,但是发现还是同样的情况xcode run报错。
结论和解决方法
根据上面的报错我确认了是flutter engine里出的问题,但是具体如何处理没有找到方法。感觉问题的答案应该就在上面几个错误里。我网上再搜索failed to find snapshot:/var.../kernel.blob.bin总算找到了答案:
https://github.com/flutter/flutter/issues/33292#issuecomment-495801691
意思是kernel_bloc.bin是为JIT预备的二进制码,但是release打包是不需要JIT,release是使用AOT和dart文件编译为二进制替换App.framework里的文件,但是打包出来的二进制文件里的文件并非release类型。所以这个问题的原因是由于App.framework里的engine版本是debug的JIT类型,它不能正确地编译到release build里。尽管flutter clean操作清空了编译后的缓存信息,但是这样并未真正清空缓存信息,需要手动将/build文件夹移动到trash,再进行flutter clean操作,再flutter build ios -release,最后使用xcode archive打包。步骤:
1、首先手动删除build文件夹
!!注意:是手动删除,手动删除,手动删除,不是用命令删除!重要的事情说三遍!!手动将build移到废纸篓!
2、flutter clean
3、flutter build ios --release
4、xcode archive