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

Mic*_*ick 5 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"
Run Code Online (Sandbox Code Playgroud)

...到下面的功能......

   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);
    }
Run Code Online (Sandbox Code Playgroud)

此函数每秒执行一次:

一切都很完美.我在我的应用程序中显示数字,我发现它们的行为完全符合我的预期.核心速度通常彼此不同,当核心加热太多时(我也读取CPU温度),速度会降低.所以我相信这些数字正在被正确阅读.

现在这就是神秘的开始.如果我打开一个adb shell到我的设备,然后键入"su"作为我的第一个命令.我可以毫无问题地导航到"/ sys/devices/system/cpu/cpu0/cpufreq /"目录.但是,如果我尝试导航到核心1,2或3的目录.我得到"没有这样的文件或目录".我很困惑.

编辑:我刚刚使用在设备上运行的终端仿真器进行了测试,发现我可以访问所有核心的目录.所以它的adb shell表现得很奇怪.

编辑:只是在预感我试过su -c "ls cpu1/cpufreq/"它工作,我看到了cpu1目录.所以也许在adb shell中输入su 并没有给我超级用户访问权限?

编辑:天啊!我只是su -c "ls cpu1/cpufreq/"一遍又一遍地执行,发现有时它工作(即我看到目录列表),有时它没有(即我没有这样的文件或目录)!

编辑::根据这个文件,似乎目录是虚拟的.有一次它说" cd/sys/devices/system/cpu#一个虚拟目录被设备驱动程序看到 ".嗯,也许我搞砸了设备驱动程序?

Jef*_*xon 4

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

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