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

.NET环境下Android.Systems.OsConstants取值异常问题咨询

Xamarin.Android CPU监控参数获取错误修复方案

问题根因

Android.Systems.OsConstants下的ScClkTck、ScNprocessorsConf不是系统配置的实际值,是POSIX标准中定义的sysconf系统调用的入参索引,直接将常量本身作为计算参数,会得到完全不符合实际的结果,这也是算出96核心、6Hz这类错误值的原因。

正确调用方式

需要调用Android.Systems.Os.Sysconf()方法,传入对应的常量作为参数,才能获取到设备实际的配置值,替换原有代码中参数获取的两行即可:

var self = new Java.IO.RandomAccessFile("/proc/self/stat", "r");
string[] info = self.ReadLine().Split(" ");

// 替换错误的常量取值逻辑
long clockSpeedHz = Android.Systems.Os.Sysconf(Android.Systems.OsConstants.ScClkTck);
long numCores = Android.Systems.Os.Sysconf(Android.Systems.OsConstants.ScNprocessorsConf);

double uptimeSec = Android.OS.SystemClock.ElapsedRealtime() / 1000.0;
long startTime = long.Parse(info[21]);

double cpuTimeSeconds = (long.Parse(info[13]) + long.Parse(info[14]) + long.Parse(info[15]) + long.Parse(info[16])) / (double)clockSpeedHz;
double processTimeSeconds = uptimeSec - (startTime / (double)clockSpeedHz);
double avgUsagePercent = (100 * cpuTimeSeconds / processTimeSeconds) / numCores;

return avgUsagePercent;

注意事项

  • Sysconf返回值为long类型,不要用int接收,避免部分设备上数值溢出
  • 该方法获取的参数是系统运行时的实际配置,不需要针对不同设备硬编码,全架构通用

低版本兼容方案

如果应用需要兼容Android 5.0(API 21)以下版本,Android.Systems.Os类可能无法正常调用,可以通过读取系统节点的方式获取参数:

// 读取CPU核心数
long numCores = new Java.IO.File("/sys/devices/system/cpu/").ListFiles()
    .Count(f => f.Name.StartsWith("cpu") && f.Name[3..].All(char.IsDigit));

// 读取CLK_TCK,也可以通过执行shell命令getconf CLK_TCK获取

内容的提问来源于stack exchange,提问作者Mark Weinhold

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:24:42