我正在编写一个需要在root xyla z(Android 4.4.2,内部版本号10.5.A.0.230)上运行的应用程序。该应用程序通过传递以下字符串之一来读取四个核心的核心速度......
"/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"
"/sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq"
"/sys/devices/system/cpu/cpu2/cpufreq/scaling_cur_freq"
"/sys/devices/system/cpu/cpu3/cpufreq/scaling_cur_freq"
...到下面的函数......
long sysfilenum(String str)
{
String text = null;
try
{
File file = new File(str);
BufferedReader br = new BufferedReader(new FileReader(file));
text = br.readLine();
}
catch (IOException e)
{
e.printStackTrace();
}
return Long.valueOf(text);
}
此功能每秒执行一次:
这一切都很完美。我在我的应用程序中显示数字,我发现它们的行为完全符合我的预期。核心速度通常彼此不同,当核心加热太多时(我也读取CPU温度),速度会降低。所以我相信这些数字正在被正确阅读。
现在这就是神秘的开始。如果我打开一个adb shell到我的设备,然后键入“su”作为我的第一个命令。我可以毫无问题地导航到“/ sys / devices / system / cpu / cpu0 / cpufreq /”目录。但是,如果我尝试导航到核心1,2或3的目录。我得到“没有这样的文件或目录”。我很困惑。
编辑:我刚刚使用在设备上运行的终端模拟器进行了测试,发现我可以访问所有内核的目录。所以它的adb shell表现得很奇怪。
编辑:只是在预感我尝试了su -c "ls cpu1/cpufreq/"
并且它有效,我看到了cpu1目录。所以也许在adb shell中键入su 没有给我超级用户访问权限?
编辑: OMG!我刚刚一遍又一遍地执行su -c "ls cpu1/cpufreq/"
,发现有时它有效(即我看到了目录列表),有时它没有(即我没有这样的文件或目录)!
编辑:根据this document,目录似乎是虚拟。有一次它说“ cd / sys / devices / system / cpu#虚拟目录由设备驱动程序显示”。嗯,也许我搞砸了设备驱动程序?
答案 0 :(得分:3)
您看到目录消失的原因是 cpu hotplugging 。这是Linux内核功能,允许操作系统禁用cpu上的特定内核以节省电量。默认的Android内核旨在当系统负载不是计算所必需的时,几乎在所有手机上禁用核1-3。禁用这些核心时,也会删除相应的目录。
因此,您可以推断,如果目录存在,则核心以指定的频率运行。如果它不存在,则核心被禁用,因此没有频率。