2014-11-17 5 views
5

Ich schreibe eine App, die auf einem verwurzelten Sony Xperia Z (Android 4.4.2, Build-Nummer 10.5.A.0.230) arbeiten muss. Die App liest die Kernzahlen der vier Kerne mit einer der folgenden Zeichenketten vorbei ...Inkonsistente Zugriff auf Verzeichnisse auf gerootetem Telefon

"/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" 

... auf die Funktion unten ...

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); 
    } 

Diese Funktion einmal ausgeführt wird pro Sekunde:

Das alles funktioniert perfekt. Ich zeige die Zahlen in meiner App an, und ich sehe, dass sie sich genau so verhalten, wie ich es erwarten würde. Die Kerngeschwindigkeiten sind oft voneinander verschieden, und wenn sich der Kern zu sehr erwärmt (ich lese auch die CPU-Temperatur), verringern sich die Geschwindigkeiten. Ich bin also zuversichtlich, dass diese Zahlen richtig gelesen werden.

Jetzt beginnt hier das Geheimnis. Wenn ich eine Adb-Shell auf meinem Gerät öffne, dann gebe "su" als meinen ersten Befehl ein. Ich kann ohne Probleme zum Verzeichnis "/ sys/devices/system/cpu/cpu0/cpufreq /" navigieren. Aber wenn ich versuche, zu den Verzeichnissen für Kern 1,2 oder 3 zu navigieren. Ich bekomme "Keine solche Datei oder Verzeichnis". Ich bin verwirrt.

EDIT: ich nur einen Terminal-Emulator getestet verwendet, die auf dem Gerät läuft selbst, und ich fand konnte Zugriff die Verzeichnisse für alle Kerne. Also seine AdB-Shell, die sich merkwürdig verhält.

EDIT: Nur auf eine Ahnung, ich versuchte su -c "ls cpu1/cpufreq/" und es funktionierte, sah ich das cpu1 Verzeichnis. Also vielleicht su in der Adb-Shell eingeben nicht mir Superuser Zugriff geben?

EDIT: OMG! Ich habe gerade su -c "ls cpu1/cpufreq/" immer wieder ausgeführt, um zu finden, dass es manchmal funktionierte (d. H. Ich sah die Verzeichnisliste) und manchmal nicht (d. H. Ich habe keine solche Datei oder kein Verzeichnis)!

EDIT:: Nach this document, scheint es, dass die Verzeichnisse virtuellen sind. An einem Punkt heißt es: "cd/sys/devices/system/cpu # ein virtuelles Verzeichnis, das durch Gerätetreiber sichtbar gemacht wird". Hmmm, vielleicht habe ich Gerätetreiber vermasselt?

+0

Root-Zugriff gilt nicht für Ihren Java-Code oder irgendetwas in Ihren Anwendungsprozessen, so ist scheinbar irrelevant für Ihr Ziel. Alles, was Sie in/sys ändern konnten, sollte beim Neustart behoben werden. –

Antwort

3

Der Grund, warum Sie die Verzeichnisse verschwinden sehen, ist CPU Hotplugging. Dies ist die Linux-Kernel-Funktion, die es dem Betriebssystem ermöglicht, bestimmte Kerne auf der CPU zu deaktivieren, um Energie zu sparen. Der Standard-Android-Kernel wurde entwickelt, um Kerne 1-3 auf fast allen Telefonen zu deaktivieren, wenn die Systemlast so ist, dass sie für Berechnungen nicht benötigt werden. Wenn diese Kerne deaktiviert sind, werden die entsprechenden Verzeichnisse ebenfalls entfernt.

Daher können Sie folgern, dass der Kern, wenn das Verzeichnis existiert, mit der angegebenen Frequenz arbeitet. Wenn es nicht existiert, ist der Kern deaktiviert und hat somit keine Frequenz.

+0

Wenn Sie nach Hotplugging suchen, scheint es sich um * physikalisches * Hinzufügen/Entfernen von Prozessoren zu handeln. Vielleicht schaue ich mir die falschen Dokumente an. Hast du eine Referenz, die ich mir ansehen könnte? – Mick

+0

Es ist wahr, dass _hotplugging_ ein etwas überladener Begriff ist; es kann physisch bedeuten.Hotplugging findet jedoch auch auf der logischen Ebene statt. Der Linux-Kernel behandelt auch CPU-Kerne wie cpus, daher die obige Verzeichnisstruktur. Wie bei vielen Dingen im Linux-Kernel gibt es eine Menge anekdotischer Verweise auf diese Konzepte online, aber nur wenige klare, formelle Dokumente. Überprüfen Sie [diesen Link] (http://www.cyberciti.biz/faq/debian-rhel-centos-redhat-suse-hotplug-cpu/) für ein Beispiel, wie man einen CPU/Kern hotplug. Sie können auch Google verwandte Begriffe + Android Android spezifische Informationen finden. –

Verwandte Themen