本课时将实现一个通用的 Flutter 异常上报模块,为线上运营提供上报与监控安全保障,其次借助 Sentry 平台实现异常告警和管理功能。我们先来看下 App 的线上安全包括哪些点。
线上安全运营
在上线每个客户端版本时,我们都要有一个 crash 标准,由于客户端发布后是无法回滚的,因此在发布时需要使用数据来辅助判断,这里就需要使用 crash 率来辅助判断是否需要进一步灰度更多用户。要做到这点,就需要将客户端异常的报错问题,上报到平台。Android 和 iOS 都有类似的功能模块,在 Flutter 官网 也介绍了相应的理论方法,大家可以前往官网进行了解。写这篇专栏的目的是希望将该功能作为通用模块,并且实践该过程。
接下来我们就看看,如何利用官网的理论知识,将该功能封装为一个通用的异常上报模块。
通用上报模块
根据官网的文档,我们将该过程分为三个步骤:
-
修改 main.dart 中的 main 函数;
-
异常捕获;
-
捕获内容上报。
接下来我们就分别看看三个过程中的实现原理。
第一步:修改 main.dart 中 main 函数
在我们之前项目代码逻辑的 main 函数中,都是使用下面的代码方式来启动运行 Flutter 项目。
/// App 核心入口文件
void main() {
runApp(MyApp());
}
由于需要 catch 异常,因此我们将 runApp 执行放到异常捕获模块中去执行,修改如下的方式。
import 'package:two_you_friend/util/tools/app_sentry.dart';
/// App 核心入口文件
void main() {
AppSentry.runWithCatchError(MyApp());
}
这里引入了通用异常捕获模块,后续你在项目中,也可以直接使用该模块实现上报,接下来我们来看下 AppSentry 的实现异常捕获逻辑。
第二步:异常捕获
该功能的实现会应用到 FlutterError 和 runZonedGuarded 两个知识点。
在 Flutter 中可以通过 FlutterError 来捕获到运行期间的错误,包括构建期间、布局期间和绘制期间。
runZonedGuarded 则是使用 Zone.fork 创建一片新的区域去运行代码逻辑,也就是 runApp,当遇到错误时会执行其回调函数 onError,其次如果在