如何在Linux系统中通过Flutter获取CPU和内存使用率?
Linux下Flutter获取CPU和内存使用率的可行方案
方案一:直接读取Linux proc文件系统(推荐)
Linux系统的/proc目录存放着系统实时运行状态信息,无需依赖第三方包,直接通过Flutter的dart:io读取解析即可,稳定性拉满。
获取CPU使用率
CPU统计信息在/proc/stat文件中,通过两次读取文件内容、计算时间差内的CPU使用占比:
import 'dart:io'; import 'dart:async'; Future<double> getCpuUsage() async { // 第一次读取CPU状态 var stat1 = await File('/proc/stat').readAsString(); var parts1 = stat1.split('\n').first.split(' ').where((e) => e.isNotEmpty).skip(1); var idle1 = int.parse(parts1.elementAt(3)); var total1 = parts1.map(int.parse).reduce((a, b) => a + b); // 等待1秒获取时间差 await Future.delayed(Duration(seconds: 1)); // 第二次读取CPU状态 var stat2 = await File('/proc/stat').readAsString(); var parts2 = stat2.split('\n').first.split(' ').where((e) => e.isNotEmpty).skip(1); var idle2 = int.parse(parts2.elementAt(3)); var total2 = parts2.map(int.parse).reduce((a, b) => a + b); // 计算使用率 var idleDiff = idle2 - idle1; var totalDiff = total2 - total1; var usage = ((totalDiff - idleDiff) / totalDiff) * 100; return double.parse(usage.toStringAsFixed(2)); }
获取内存使用率
内存信息在/proc/meminfo文件中,解析MemTotal、MemFree等字段计算使用率:
Future<double> getMemoryUsage() async { var memInfo = await File('/proc/meminfo').readAsString(); var lines = memInfo.split('\n'); int totalMem = 0; int freeMem = 0; int buffers = 0; int cached = 0; for (var line in lines) { if (line.startsWith('MemTotal:')) { totalMem = int.parse(line.split(RegExp(r'\s+')).elementAt(1)); } else if (line.startsWith('MemFree:')) { freeMem = int.parse(line.split(RegExp(r'\s+')).elementAt(1)); } else if (line.startsWith('Buffers:')) { buffers = int.parse(line.split(RegExp(r'\s+')).elementAt(1)); } else if (line.startsWith('Cached:')) { cached = int.parse(line.split(RegExp(r'\s+')).elementAt(1)); } } // 已使用内存 = 总内存 - 空闲 - 缓存 - 缓冲区 var usedMem = totalMem - freeMem - buffers - cached; var usage = (usedMem / totalMem) * 100; return double.parse(usage.toStringAsFixed(2)); }
方案二:排查第三方包问题
如果想用第三方包,试试这些操作:
- 把
system_resources或linux_system_info更新到最新版,旧版本可能存在Linux兼容性bug - 确认Flutter Linux编译环境依赖齐全(比如安装
libgtk-3-dev等基础库) - 查看包的GitHub Issues,看看有没有其他用户的同类问题及解决办法
方案三:调用系统命令解析
通过dart:io执行top、free等系统命令,再解析输出结果:
Future<double> getCpuUsageViaCmd() async { var result = await Process.run('top', ['-bn1']); var output = result.stdout.toString(); var cpuLine = output.split('\n').firstWhere((line) => line.startsWith('%Cpu(s)')); var usagePart = cpuLine.split(RegExp(r'\s+')).elementAt(1); return double.parse(usagePart); }
这种方式依赖命令输出格式,不同Linux发行版可能有差异,稳定性不如直接读proc文件。
圣诞快乐!
内容的提问来源于stack exchange,提问作者franzi98
相关产品推荐
相关产品推荐

