如何在 Flutter 中检索 logcat?

How to retrieve logcat in Flutter?

如何将写入 logcat 的输出返回到导致它的 Flutter 应用程序中?或者更简单的问题:How to read logcat in Flutter?

问题是这样的:

该应用使用一堆 Android 插件通过蓝牙与一些自定义硬件通信。那些 Android 插件大量写入 logcat。现在,对于调试,能够读取应用程序(包括本机插件)写入的所有消息非常有帮助logcat。问题是,这有可能吗?

你会如何解决这个问题?

在 pub.dev 上查看名为 logcat 的插件。

遗憾的是,它似乎不再维护,也没有针对空安全性进行更新。 但是您可以查看源代码 here 并查看插件如何访问 android logcat.

因为 logcat 是原生的,你必须使用 MethodChannel 来调用 Java/Kotlin 函数:

// define MethodChannel
final platform = const MethodChannel('app.channel.logcat');
// call native method
logs = await platform.invokeMethod('execLogcat');

和原生部分:

public class LogcatPlugin implements MethodCallHandler {

    public static void registerWith(Registrar registrar) {
        final MethodChannel channel = new MethodChannel(registrar.messenger(), "app.channel.logcat");
        channel.setMethodCallHandler(new LogcatPlugin());
    }

    @Override
    public void onMethodCall(MethodCall call, Result result) {
        if (call.method.equals("execLogcat")) {
            String logs = getLogs();
            if (logs != null) {
                result.success(logs);
            } else {
                result.error("UNAVAILABLE", "logs not available.", null);
            }
        } else {
            result.notImplemented();
        }
    }

    String getLogs() {
        try {
            Process process = Runtime.getRuntime().exec("logcat -d");
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            StringBuilder log = new StringBuilder();
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                log.append(line);
            }
            return log.toString();
        } catch (IOException e) {
            return "EXCEPTION" + e.toString();
        }
    }
}

代码示例来自github.com/pharshdev/logcat。 如果需要,也许您可​​以直接分叉 git 存储库并将其迁移到 null safety。

添加依赖:

dependencies:
  logger: ^1.1.0

示例:

import 'package:logger/logger.dart';

var logger = Logger(
  printer: PrettyPrinter(),
);

var loggerNoStack = Logger(
  printer: PrettyPrinter(methodCount: 0),
);

void main() {
  print(
      'Run with either `dart example/main.dart` or `dart --enable-asserts example/main.dart`.');
  demo();
}

void demo() {
  logger.d('Log message with 2 methods');

  loggerNoStack.i('Info message');

  loggerNoStack.w('Just a warning!');

  logger.e('Error! Something bad happened', 'Test Error');

  loggerNoStack.v({'key': 5, 'value': 'something'});

  Logger(printer: SimplePrinter(colors: true)).v('boom');
}