Red de conocimiento informático - Conocimiento informático - Cómo Android usa el acceso de root para llamar a la función Surfacecontrol.screenshotEn términos generales, los primeros programas de captura de pantalla de Android se derivan del método de captura de pantalla de Linux. Android usa el kernel de Linux, por lo que la pantalla de Linux La captura de pantalla. El método también fue el primero en ser adoptado por Android. Linux utiliza un búfer de cuadros para administrar la salida del monitor. El método tradicional es leer los datos en el búfer de cuadros y luego obtener los datos de toda la pantalla. Linux utiliza un búfer de cuadros para administrar la salida de la pantalla. El método tradicional es leer los datos del búfer de cuadros y luego obtener los datos de toda la pantalla. Antes de Android 3.0, este método era el único posible. Sin embargo, Linux utiliza permisos estrictos para controlar los archivos del dispositivo, y el framebuffer es uno de ellos. En Android, solo el root y los usuarios del grupo de gráficos tienen permiso de lectura: ls -l /dev/graphics/fb0 crw-rw---- root Graphics 29, 0 2015-01-16 03:26 fb0 Entonces, este es el única forma de obtener la pantalla completa. 16 03:26 fb0 Entonces, para tomar una captura de pantalla leyendo el framebuffer, la aplicación debe tener privilegios de root. Con los cambios en el sistema de visualización de Android, a partir de Android 4.2, el propio Android ha agregado una interfaz de captura de pantalla, y cada vez más dispositivos utilizan múltiples buffers de fotogramas y superposiciones, y más hardware compone el dispositivo, por lo que no se puede capturar la pantalla completa simplemente leyendo el búfer de fotogramas. Por lo tanto, los desarrolladores han abandonado gradualmente este método.

Cómo Android usa el acceso de root para llamar a la función Surfacecontrol.screenshotEn términos generales, los primeros programas de captura de pantalla de Android se derivan del método de captura de pantalla de Linux. Android usa el kernel de Linux, por lo que la pantalla de Linux La captura de pantalla. El método también fue el primero en ser adoptado por Android. Linux utiliza un búfer de cuadros para administrar la salida del monitor. El método tradicional es leer los datos en el búfer de cuadros y luego obtener los datos de toda la pantalla. Linux utiliza un búfer de cuadros para administrar la salida de la pantalla. El método tradicional es leer los datos del búfer de cuadros y luego obtener los datos de toda la pantalla. Antes de Android 3.0, este método era el único posible. Sin embargo, Linux utiliza permisos estrictos para controlar los archivos del dispositivo, y el framebuffer es uno de ellos. En Android, solo el root y los usuarios del grupo de gráficos tienen permiso de lectura: ls -l /dev/graphics/fb0 crw-rw---- root Graphics 29, 0 2015-01-16 03:26 fb0 Entonces, este es el única forma de obtener la pantalla completa. 16 03:26 fb0 Entonces, para tomar una captura de pantalla leyendo el framebuffer, la aplicación debe tener privilegios de root. Con los cambios en el sistema de visualización de Android, a partir de Android 4.2, el propio Android ha agregado una interfaz de captura de pantalla, y cada vez más dispositivos utilizan múltiples buffers de fotogramas y superposiciones, y más hardware compone el dispositivo, por lo que no se puede capturar la pantalla completa simplemente leyendo el búfer de fotogramas. Por lo tanto, los desarrolladores han abandonado gradualmente este método.

Captura de pantalla de Android: SurfaceFlinger En Android 4.0, el sistema de visualización adopta una nueva arquitectura, agrega un "programa de mantequilla" y también agrega una interfaz de captura de pantalla: status_t SurfaceFlinger::captureScreen(const splt; IBindergt; amp; display, splt; IMemoryHeapgt; * montón, uint32_t* ancho, uint32_t* alto, formato PixelFormat*, uint32_t formato PixelFormat*, uint32_t sw, uint32_t sh, uint32_t minLayerZ, uint32_t maxLayerZ) { if (CC_UNLIKELY(display == 0)) return BAD_VALUE if (! GLExtensions; ::getInstance().haveFramebufferObject()) devuelve INVALID_OPERATION; class MessageCaptureScreen: public MessageBase { SurfaceFlinger* splt; IBindergt; splt; ; uint32_t sh; uint32_t minLayerZ; uint32_t maxLayerZ; status_t resultado; public: MessageCaptureScreen(SurfaceFlinger* flinger, const splt; IBindergt; amp; display, splt; IMemoryHeapgt; * montón, uint32_t* w, uint32_t* h, PixelFormat* f, uint32_t sw, uint32_t sh, uint32_t minLayerZ, uint32_t maxLayerZ): flinger(flinger), display(display), montón(montón), w(w), h(h), f(f), sw(sw), sh( sh ), minLayerZ(minLayerZ), maxLayerZ(maxLayerZ), resultado(PERMISSION_DENIED) { } status_t getResult() const { return resultado } virtual bool handler() { Mutex::Autolock _l(flinger-gt;mStateLock); -gt; captureScreenImplLocked(display, heap, w, h, f, sw, sh, minLayerZ, maxLayerZ return true };