Tenía un montón de preguntas similares hasta que les pregunté aquí . La esencia de las infos que se obtienen en este post son estas:
- Ninguna aplicación de Android maneja directamente
/dev/fb0
Existe o no existe. En cambio, se comunican con el proceso del sistema llamado "Surface Flinger", que es la analogía del servidor X en los Linux.
- Esta comunicación se lleva a cabo con Binder, que es un protocolo RPC específico de Android, sólo para hosts locales, similar a las tuberías de Unix.
- Ni siquiera el Flinger de la superficie puede ver el
/dev/fb0
directamente. En su lugar, habla con la HAL (capa de abstracción de hardware). Hasta Android 8, la HAL era un conjunto de bibliotecas compartidas en /lib/hw
. Desde Android8, también la HAL es un conjunto de servicios del sistema que habla a través de un binder con el Surface Flinger (aunque todavía es posible la HAL de librerías compartidas heredadas).
- El acceso directo a la pantalla se produce en la biblioteca HAL (servicio) responsable de ello.
Las librerías (servicios) HAL son desarrolladas por el proveedor del teléfono. Ha puede desarrollar una /dev/fb0
conductor y utilizar un hal capaz de manejarlo, pero también puede desarrollar cualquier método personalizado. En el segundo caso, no tendrá un /dev/fb0
en el núcleo.
Además, y ya es algo específico de linux: /dev
no necesita tener todos los archivos de dispositivos existentes en su sistema. Comúnmente es así, pero no es un requisito. (En la mayoría de las distribuciones de Linux, el software llamado udev automatiza esta tarea, pero Android no la utiliza). /dev
tiene archivos de dispositivos , en un Linux se puede ver que comienzan por un c
(archivo de dispositivo de caracteres) o b
(archivo de dispositivo de bloque) en el ls -l
y también en Android:
crw-rw---- 1 root video 29, 0 Dec 10 09:08 /dev/fb0
brw-rw---- 1 root disk 8, 0 Dec 11 07:21 /dev/sda
-rwxr-xr-x 1 root root 1302248 Apr 18 2019 /bin/bash
/dev/fb0
es un archivo de dispositivo de caracteres, /dev/sda
es un archivo de dispositivo de bloque, mientras que /bin/bash
es un archivo ordinario y no un dispositivo.
Puede crear archivos de dispositivos con la función mknod pero ten en cuenta que requiere Root.
Es muy posible que /dev/fb0
se crea en otra parte de su sistema, tal vez en una ubicación que está oculta detrás de los mismos montajes de sólo usuarios o así. También es posible que fb0 no se cree en absoluto, a pesar de que su controlador está compilado en el kernel.
Podemos comprobar qué archivos de dispositivo están compilados en el kernel, en el archivo procfs /proc/devices
. Debe contener la línea
Character devices:
...
29 fb
...
Este archivo procfs es prácticamente siempre legible también como usuario. Si no existe, entonces su HAL responsable de la visualización se comunica por alguna otra vía con el kernel.
Si existe, entonces puedes crear el dispositivo framebuffer mediante un comando
mknod /dev/fb0 c 29 0
como root. (En realidad siempre se puede crear como Root, pero si la línea anterior no existe en /proc/devices
Entonces no será utilizable).
P.d. en LineageOS, mis experiencias son mucho mejores compilando una imagen userdebug. No ralentizó mi sistema en absoluto, pero todas las cosas de rooting, adb funcionaron en él muy correctamente.
0 votos
La implementación de hardware de Android es totalmente específica del proveedor. No hay estandarización. Muchos OEMs no exponen las interfaces estándar de Linux en
/dev
,/sys
,/proc
,/config
etc. Muchas llamadas al sistema tampoco funcionan. En su lugar, los HAL de código cerrado de los OEMs interactúan con el hardware a través de diferentes IPC's, particularmente Binders.0 votos
@IrfanLatif ¡Gracias! Esto ha ayudado mucho.