对root电话上目录的访问不一致

时间:2014-11-17 13:16:19

标签: android root

我正在编写一个需要在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#虚拟目录由设备驱动程序显示”。嗯,也许我搞砸了设备驱动程序?

1 个答案:

答案 0 :(得分:3)

您看到目录消失的原因是 cpu hotplugging 。这是Linux内核功能,允许操作系统禁用cpu上的特定内核以节省电量。默认的Android内核旨在当系统负载不是计算所必需的时,几乎在所有手机上禁用核1-3。禁用这些核心时,也会删除相应的目录。

因此,您可以推断,如果目录存在,则核心以指定的频率运行。如果它不存在,则核心被禁用,因此没有频率。