技术小黑屋

Flutter/Dart Release 模式下屏蔽 debugPrint 与 Print 输出

当我们在写 Flutter,Dart程序时,release 模式下,我们很奇怪的发现debugPrint和 print 这两个的输出内容,还是能够通过 flutter logs 展示出来。这一点尤其在端上暴露的问题要严重一些,比如涉及到一些敏感信息的日志打印。

本文,将会有两个超级简单的方法,来实现对这些输出的屏蔽,并且是专门治理 release 模式下的问题,debug 模式不受影响。

DebugPrint

DebugPrint 着实是一个比较迷惑的方法,看意思我们理解是在debug 模式下才进行日志打印,但是实际上,这个方法也会在 release 模式下进行日志输出。

好在,我们可以通过这样简单设置即可处理 上面的问题。

1
2
3
4
5
if (kReleaseMode) {
   debugPrint = (String? message, {int? wrapWidth}) {
     // empty debugPrint implementation in the release mode
    };
}

在 RunApp 启动之前即可。

print 处理

print 的处理相对比较麻烦一些,但是 dart 层也提供了一个 重载print实现的方法,就是使用 Zone API.

实现思路如下

  • 使用 runZonedGuarded 包裹 runApp
  • 增加 zoneSpecification 参数配置 printHandler
  • printHandler 增加release 模式控制,进行日志打印屏蔽处理。

具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
runZonedGuarded(() {
 runApp(MyApp());
}, (error, stackTrace) {
 print(stackTrace);
}, zoneSpecification: ZoneSpecification(
   print: (Zone self, ZoneDelegate parent, Zone zone, String message){
     /**
      * Print only in debug mode
      * */
     if (kDebugMode) {
       parent.print(zone, "wrapped content=$message");
     }
   }));

其他的建议

  • 使用自己封装的 Log 库,可以统一进行管理
  • 使用 lint 检查,检测并处理 使用 print,debugPrint的代码。




低价正版软件,限时优惠,Office 365,Typora等海量优惠