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?
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. –