2014-11-17 3 views
5

Я пишу приложение, которое должно работать на корневой Sony xperia 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); 
    } 

Эта функция получает выполняется один раз в секунда:

Все это работает отлично. Я показываю номера в своем приложении, и я вижу, что они ведут себя точно так, как я ожидал. Частоты ядра часто отличаются друг от друга, и когда ядро ​​слишком сильно нагревается (я тоже читаю температуру процессора), скорость уменьшается. Поэтому я уверен, что эти цифры читаются правильно.

Теперь вот где начинается тайна. Если я открою оболочку adb для своего устройства, тогда введите «su» в качестве моей первой команды. Я могу без проблем перейти в каталог «/ sys/devices/system/cpu/cpu0/cpufreq /». Но если я попытаюсь перейти к каталогам для ядра 1,2 или 3. Я получаю «Нет такого файла или каталога». Я сбит с толку.

EDIT: Я просто проверял, используя эмулятор терминала, который работает на самом устройстве, и обнаружил, что я мог получить доступ к директории для всех ядер. Итак, его оболочка adb ведет себя странно.

EDIT: Только что я придумал su -c "ls cpu1/cpufreq/", и это сработало, я увидел каталог cpu1. Так что, может быть, набрав su в оболочке adb не, дайте мне доступ к суперпользователю?

EDIT: OMG! Я просто выполнял su -c "ls cpu1/cpufreq/" снова и снова, чтобы найти, что иногда это сработало (т. Е. Я увидел список каталогов), а иногда и не сделал (т. Е. У меня не было такого файла или каталога)!

EDIT:: По this document, оказывается, что каталоги виртуальный. В какой-то момент в нем говорится: «cd/sys/devices/system/cpu # виртуальный каталог, отображаемый драйверами устройств». Хм, может быть, я испортил драйверы устройств?

+0

Root-доступ не распространяется на ваш код Java или что-либо в ваших процессах приложений, поэтому, по-видимому, он не имеет отношения к вашей цели. Все, что вам удалось изменить в/sys, должно быть исправлено при перезагрузке. –

ответ

3

Причина, по которой вы видите исчезновение каталогов, - cpu hotplugging. Это функция ядра Linux, которая позволяет ОС отключать определенные ядра на процессоре для экономии энергии. Ядро Android по умолчанию предназначено для отключения ядра 1-3 на почти всех телефонах, когда загрузка системы такова, что они не нужны для вычислений. Когда эти ядра отключены, соответствующие каталоги также удаляются.

Следовательно, вы можете заключить, что если каталог существует, ядро ​​работает с указанной частотой. Если он не существует, ядро ​​отключается и, следовательно, не имеет частоты.

+0

Подняв hotplugging, кажется, все о физически * добавлении/удалении процессоров. Возможно, я смотрю на неправильные документы. У вас есть ссылка, на которую я мог бы взглянуть? – Mick

+0

Это правда, что _hotplugging_ является несколько перегруженным термином; это может означать физически.Тем не менее, hotplugging происходит и на логическом уровне. Ядро linux также обрабатывает ядра cpu, такие как cpus, и, следовательно, структуру каталогов выше. Как и во многих других случаях в ядре linux, есть много анекдотических ссылок на эти понятия в Интернете, но несколько четких официальных документов. Проверьте [эту ссылку] (http://www.cyberciti.biz/faq/debian-rhel-centos-redhat-suse-hotplug-cpu/) на примере того, как hotplug cpu/core. Вы также можете использовать термины Google + android, чтобы найти информацию об Android. –

Смежные вопросы