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.

  • Adb pull -> dispositivo no encontrado
  • Adb shell su funciona, pero la raíz adb no
  • ¿Qué permisos se pueden conceder a los dispositivos enraizados?
  • Cómo quitar la aplicación del lanzador (en un dispositivo arraigado) programáticamente
  • Bloqueo antes de que se inicie la aplicación: SecurityException: denegación de permisos: INTERACT_ACROSS_USERS_FULL
  • Fuerza Cierre una aplicación mediante programación
  • Copiar archivos a otra carpeta de paquetes (root, su)
  • Obtener una lista de almacenamiento externo en Android 4.3
  • ¿Cómo funciona su trabajo en android? ¿Y cuáles son los requisitos previos para que funcione? ¿Qué es el enraizamiento en Android?
  • ¿Es seguro deshabilitar com.android.systemui?
  • Ejecutar comandos de shell desde la aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.