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 …
- Cómo cambiar el id de grupo de un archivo en el dispositivo android arraigado?
- usuario root puede acceder a almacenamiento interno en Android?
- Cómo instalar la aplicación de Android en el directorio de sistema / app sin dispositivo enraizado para que el usuario no pueda desinstalar esa aplicación
- ¿Puedo deshabilitar systemui desde dentro de mi aplicación android?
- Escribir archivos en / system
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?
- Construir / compilar Android desde el origen con privilegios de superusuario
- ADB obtener un permiso denegado a pesar de correr como root
- Android: copiar programaticamente apk en / system / app
- Copiar archivos a otra carpeta de paquetes (root, su)
- ¿Cómo puede detectar si el dispositivo está enraizado en la aplicación?
- Abra cualquier SQLiteDatabase como su / root
- Determinar si se ejecuta en un dispositivo enraizado
- Cómo quitar la aplicación del lanzador (en un dispositivo arraigado) programáticamente
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.
- Soporte para Android Tipo de entrada EditTextPreference
- NullPointerException al cambiar entre fragmentos que contienen RecyclerView