Acceso incoherente a los directorios en el teléfono enraizado

Estoy escribiendo una aplicación que necesita trabajar en una raíz Sony xperia z (Android 4.4.2, número de construcción 10.5.A.0.230). La aplicación lee las velocidades de núcleo de los cuatro núcleos pasando una de las siguientes cadenas …

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

… a la siguiente función …

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

Esta función se ejecuta una vez por segundo:

Todo esto funciona perfectamente. Muestro los números en mi aplicación, y veo que se comportan exactamente como yo esperaría. Las velocidades del núcleo a menudo son diferentes entre sí, y cuando el núcleo se calienta demasiado (leo la temperatura de la CPU también), las velocidades se reducen. Así que estoy seguro de que estos números se están leyendo correctamente.

Ahora es aquí donde comienza el misterio. Si abro un shell de adb a mi dispositivo, escriba "su" como mi primer comando. Puedo navegar hasta el directorio "/ sys / devices / system / cpu / cpu0 / cpufreq /" sin problema. Pero si intento navegar a los directorios para el núcleo 1,2 o 3. Consigo "ninguÌ n tal archivo o directorio". Estoy desconcertado.

EDIT: Acabo de probar con un emulador de terminal que se ejecuta en el dispositivo en sí, y encontré que podía acceder a los directorios de todos los núcleos. Así que su shell adb que se está comportando extrañamente.

EDIT: Justo en un palpitar intenté su -c "ls cpu1/cpufreq/" y trabajó, vi el directorio de cpu1. Así que tal vez escribiendo su en el shell de adb no me dio el acceso de superusuario?

EDIT: ¡OMG! Acabo de ejecutar su -c "ls cpu1/cpufreq/" una y otra vez para encontrar que a veces funcionaba (es decir, vi la lista de directorios) ya veces no lo hizo (es decir, no tengo tal archivo o directorio)!

EDIT:: Según este documento , parece que los directorios son virtuales . En un punto dice dice " cd / sys / devices / system / cpu # un directorio virtual hecho visible por los controladores de dispositivo ". Hmmm, tal vez he estropeado los controladores de dispositivo?

La razón por la que está viendo los directorios desaparecer es cpu hotplugging . Esta es la característica del kernel de linux que permite al sistema operativo deshabilitar núcleos específicos en la CPU para ahorrar energía. El núcleo predeterminado de Android está diseñado para deshabilitar los núcleos 1-3 en casi todos los teléfonos cuando la carga del sistema es tal que no son necesarios para los cálculos. Cuando estos núcleos están deshabilitados, los directorios correspondientes también se eliminan.

Por lo tanto, puede inferir que si el directorio existe, el núcleo está funcionando a la frecuencia especificada. Si no existe, el núcleo está deshabilitado y por lo tanto no tiene frecuencia.

  • Permiso de READ_LOGS en Jelly Bean (api 16)
  • ¿Qué permisos se pueden conceder a los dispositivos enraizados?
  • Privilegios raíz para una aplicación Android (aplicación completa, no sólo unos pocos comandos)
  • Adb pull -> dispositivo no encontrado
  • Ocultar barra de sistema en Jelly Bean Tablet (enraizado)
  • Crea Android con Superusuario
  • ¿Cómo comprobar si el teléfono android está enraizado?
  • ¿Cómo funciona su trabajo en android? ¿Y cuáles son los requisitos previos para que funcione? ¿Qué es el enraizamiento en Android?
  • ¿Detección de raíz de Android mediante etiquetas de construcción?
  • Ejecute el programa android como root
  • ¿Cómo puede mi aplicación acceder a privilegios de nivel de administración en un dispositivo no enraizado?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.