2014-11-17 2 views
5

Sto scrivendo un'app che deve funzionare su un Sony xperia z rootato (Android 4.4.2, build numero 10.5.A.0.230). L'applicazione legge le velocità di base dei quattro nuclei passando una delle seguenti stringhe ...Accesso incoerente alle directory sul telefono rooted

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

... la seguente funzione ...

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

Questa funzione viene eseguita una volta per secondo:

Tutto funziona perfettamente. Visualizzo i numeri nella mia app e vedo che si comportano esattamente come mi aspetterei. Le velocità del core sono spesso diverse l'una dall'altra, e quando il core si surriscalda troppo (ho letto anche la temperatura della CPU) le velocità si riducono. Quindi sono sicuro che questi numeri vengano letti correttamente.

Ora è qui che inizia il mistero. Se apro una shell adb sul mio dispositivo, digita "su" come mio primo comando. Posso navigare nella directory "/ sys/devices/system/cpu/cpu0/cpufreq /" senza problemi. Ma se provo a navigare nelle directory per il core 1,2 o 3. Ottengo "No such file or directory". Sono sconcertato.

EDIT: Ho appena testato utilizzando un emulatore di terminale che gira sul dispositivo stesso, e trovato le directory per tutte le anime che potuto accesso. Quindi la sua shell adb si sta comportando in modo strano.

MODIFICA: Solo su un'intuizione ho provato su -c "ls cpu1/cpufreq/" e ha funzionato, ho visto la directory cpu1. Quindi forse digitando su nella shell adb non mi è stato concesso l'accesso come superutente??

MODIFICA: OMG! Ho appena eseguito su -c "ls cpu1/cpufreq/" più e più volte per scoprire che a volte ha funzionato (cioè ho visto l'elenco delle directory) ea volte no (cioè non ho trovato alcun file o directory)!

EDIT:: Secondo this document, sembra che le directory sono virtuali. Ad un certo punto dice "cd/sys/devices/system/cpu # una directory virtuale resa visibile dai driver di dispositivo". Hmmm, forse ho incasinato i driver del dispositivo?

+0

L'accesso root non si applica al codice java o a qualsiasi altra cosa nei processi della tua applicazione, quindi è apparentemente irrilevante per il tuo obiettivo. Tutto ciò che è riuscito a cambiare in/sys dovrebbe essere corretto al riavvio. –

risposta

3

Il motivo per cui le directory scompaiono è cpu hotplugging. Questa è la caratteristica del kernel linux che consente al sistema operativo di disabilitare core specifici sulla CPU per risparmiare energia. Il kernel predefinito di Android è progettato per disabilitare i core 1-3 su quasi tutti i telefoni quando il carico del sistema è tale che non sono necessari per i calcoli. Quando questi core sono disabilitati, vengono rimosse anche le directory corrispondenti.

Pertanto, è possibile dedurre che se la directory esiste, il core funziona alla frequenza specificata. Se non esiste, il core è disabilitato e quindi non ha frequenza.

+0

Guardando hotplugging, sembra essere tutto * fisicamente * aggiunta/rimozione dei processori. Forse sto guardando i documenti sbagliati. Hai un riferimento che potrei guardare? – Mick

+0

È vero che _hotplugging_ è un termine un po 'sovraccarico; può significare fisicamente.Tuttavia, l'hotplug avviene anche a livello logico. Il kernel di Linux tratta anche i core della CPU come cpus, da cui la struttura delle directory sopra. Come per molte cose nel kernel di Linux, ci sono molti riferimenti aneddotici a questi concetti online ma pochi documenti chiari e formali. Controlla [questo link] (http://www.cyberciti.biz/faq/debian-rhel-centos-redhat-suse-hotplug-cpu/) per un esempio di come hotplug di cpu/core. Puoi anche termini relativi a Google + Android per trovare informazioni specifiche su Android. –