You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:25:19