2 votes

Autre moyen d'obtenir une capture d'écran Android dans le shell ?

Ok, donc d'abord, j'ai réalisé qu'une de mes applications de capture d'écran sur une tablette Android 7, ne fonctionnait pas (me donnait une capture d'écran noire), et ensuite j'ai réalisé que cette application n'avait pas la permission "Capture d'écran" ; ensuite j'ai cherché cette permission dans les Paramètres, mais je ne l'ai pas trouvée ; ensuite j'ai réalisé que l'application fait planter Android et provoque un redémarrage à certains moments lorsque vous lui demandez de capturer.

(EDIT : étrangement, - dans le contexte des problèmes de ce post listés plus loin, - lorsque j'ai essayé de prendre une capture d'écran en appuyant sur le "bouton d'alimentation et le bouton volume-bas", cela a bien fonctionné).

J'ai donc réussi à me connecter à l'appareil, où je peux obtenir Root, et j'ai voulu lancer une commande de screencap, et cela s'est terminé comme ceci :

# screencap -p out.png
stack corruption detected
Aborted 

J'ai essayé de faire la même chose qu'un utilisateur normal et j'ai reçu un rapport :

$ screencap -p out.png
Segmentation fault 

C'est de la merde, hein ? En plus, j'ai essayé :

# screenrecord out.mp4

... et cela a fait planter Android, et je l'ai redémarré.

Donc, pour arriver à por qué screencap ne fonctionne pas, ne ressemble pas à un problème trivial - mais l'appareil fonctionne autrement, l'écran est affiché, etc.

Je me demandais donc s'il existait un autre moyen de faire une capture d'écran dans ce contexte (j'ai Root dans le shell sous Android 7, l'écran est rendu et affiché correctement, tout fonctionne apparemment, à l'exception de screencap elle-même) ?

( Peut-être que certains /dev/... fichier de nœud de périphérique, qui, lorsque vous cat ) vous donne le contenu actuel de l'écran, pixel par pixel (ce qui, j'imagine, nécessitera un décodage avant d'être visualisable, mais ce n'est pas un problème, je peux utiliser tftp pour transférer les fichiers hors de l'appareil) ? )


EDIT : Voici l'extrait connexe de logcat quand le crash de la capture d'écran se produit :

02-12 17:05:01.285 22745 22745 D AndroidRuntime: >>>>>> START com.android.internal.os.RuntimeInit uid 0 <<<<<<
02-12 17:05:01.322 22745 22745 D AndroidRuntime: CheckJNI is OFF
02-12 17:05:01.551 22745 22745 D ICU     : No timezone override file found: /data/misc/zoneinfo/current/icu/icu_tzdata.dat
02-12 17:05:01.718 22745 22745 W System  : ClassLoader referenced unknown path: /vendor/lib64
02-12 17:05:01.719 22745 22745 W System  : ClassLoader referenced unknown path: /system/lib64
02-12 17:05:01.930 22745 22745 E memtrack: Couldn't load memtrack module (No such file or directory)
02-12 17:05:01.930 22745 22745 E android.os.Debug: failed to load memtrack module: -2
02-12 17:05:01.951 22745 22745 I Radio-JNI: register_android_hardware_Radio DONE
02-12 17:05:02.092 22745 22745 D AndroidRuntime: Calling main entry com.android.commands.am.Am
02-12 17:05:02.228 22745 22745 D AndroidRuntime: Shutting down VM
02-12 17:05:02.358 18887 22754 I OpenGLRenderer: Initialized EGL, version 1.4
02-12 17:05:02.358 18887 22754 D OpenGLRenderer: Properties::enablePartialUpdates 1
02-12 17:05:02.359 18887 22754 D OpenGLRenderer: Properties::useBufferAge 1
02-12 17:05:02.359 18887 22754 D OpenGLRenderer: Default swap behavior 0
02-12 17:05:02.359 18887 22754 D OpenGLRenderer: Swap behavior 0
02-12 17:05:04.259 16803 16803 W WindowManager: Attempted to remove non-existing token: android.os.Binder@73bede4
02-12 17:05:10.741 22761 22761 D AndroidRuntime: >>>>>> START com.android.internal.os.RuntimeInit uid 0 <<<<<<
02-12 17:05:10.756 22761 22761 D AndroidRuntime: CheckJNI is OFF
02-12 17:05:10.890 22761 22761 D ICU     : No timezone override file found: /data/misc/zoneinfo/current/icu/icu_tzdata.dat
02-12 17:05:11.019 22761 22761 E memtrack: Couldn't load memtrack module (No such file or directory)
02-12 17:05:11.019 22761 22761 E android.os.Debug: failed to load memtrack module: -2
02-12 17:05:11.024 22761 22761 I Radio-JNI: register_android_hardware_Radio DONE
02-12 17:05:11.080 16562 16562 I main    : type=1400 audit(0.0:613): avc: denied { read } for path="/dev/socket/zygote" scontext=u:r:zygote:s0 tcontext=u:r:init:s0 tclass=unix_stream_socket permissive=1
02-12 17:05:11.080 16562 16562 I main    : type=1400 audit(0.0:614): avc: denied { getattr } for path="socket:[201098]" dev=sockfs ino=201098 scontext=u:r:zygote:s0 tcontext=u:r:init:s0 tclass=unix_stream_socket permissive=1
02-12 17:05:11.081 22761 22761 D AndroidRuntime: Calling main entry com.android.commands.am.Am
02-12 17:05:11.100 16562 16562 I main    : type=1400 audit(0.0:615): avc: denied { write } for path="/dev/socket/zygote" scontext=u:r:zygote:s0 tcontext=u:r:init:s0 tclass=unix_stream_socket permissive=1
02-12 17:05:11.118 16803 16855 I ActivityManager: Start proc 22770:android.process.media/u0a10 for broadcast com.android.providers.media/.MediaScannerReceiver
02-12 17:05:11.189 22770 22770 W System  : ClassLoader referenced unknown path: /system/priv-app/MediaProvider/lib/arm
02-12 17:05:11.293 22770 22783 D libEGL  : loaded /vendor/lib/egl/libEGL_tegra.so
02-12 17:05:11.306 22770 22783 D libEGL  : loaded /vendor/lib/egl/libGLESv1_CM_tegra.so
02-12 17:05:11.310 22770 22770 W System  : ClassLoader referenced unknown path: /system/priv-app/DownloadProvider/lib/arm
02-12 17:05:11.312 22770 22770 D ApplicationLoaders: ignored Vulkan layer search path /system/priv-app/DownloadProvider/lib/arm:/system/priv-app/DownloadProvider/DownloadProvider.apk!/lib/armeabi-v7a:/system/lib:/vendor/lib for namespace 0xa8751090
02-12 17:05:11.479 22770 22783 D libEGL  : loaded /vendor/lib/egl/libGLESv2_tegra.so
02-12 17:05:11.560 22770 22770 D MediaScannerReceiver: action: android.intent.action.MEDIA_SCANNER_SCAN_FILE path: /
02-12 17:05:11.562 16803 16852 I ActivityManager: Killing 19204:com.android.packageinstaller/u0a17 (adj 906): empty #17
02-12 17:05:11.564 22761 22761 D AndroidRuntime: Shutting down VM
02-12 17:05:11.579 16803 17333 D GraphicsStats: Buffer count: 7
02-12 17:05:11.580 16803 17283 D ActivityManager: cleanUpApplicationRecord -- 19204
02-12 17:05:11.603 22757 22757 F libc    : stack corruption detected
02-12 17:05:11.603 22757 22757 F libc    : Fatal signal 6 (SIGABRT), code -6 in tid 22757 (screencap)
02-12 17:05:11.604   127   127 W         : debuggerd: handling request: pid=22757 uid=0 gid=0 tid=22757
02-12 17:05:11.662 22787 22787 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
02-12 17:05:11.663 22787 22787 F DEBUG   : Build fingerprint: 'samsung/GT-P7500/GT-P7500:4.0.4/IMM76D/XXLQ8:user/release-keys'
02-12 17:05:11.663 22787 22787 F DEBUG   : Revision: '14'
02-12 17:05:11.663 22787 22787 F DEBUG   : ABI: 'arm'
02-12 17:05:11.664 22787 22787 F DEBUG   : pid: 22757, tid: 22757, name: screencap  >>> screencap <<<
02-12 17:05:11.664 22787 22787 F DEBUG   : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
02-12 17:05:11.683 22787 22787 F DEBUG   : Abort message: 'stack corruption detected'
02-12 17:05:11.683 22787 22787 F DEBUG   :     r0 00000000  r1 000058e5  r2 00000006  r3 00000008
02-12 17:05:11.683 22787 22787 F DEBUG   :     r4 a9bb957c  r5 00000006  r6 a9bb9524  r7 0000010c
02-12 17:05:11.683 22787 22787 F DEBUG   :     r8 beb7ba33  r9 00000001  sl 00000500  fp 00000005
02-12 17:05:11.683 22787 22787 F DEBUG   :     ip 00000016  sp beb7b760  lr a8f2b477  pc a8f2dccc  cpsr 000f0010
02-12 17:05:11.705 22787 22787 F DEBUG   : 
02-12 17:05:11.705 22787 22787 F DEBUG   : backtrace:
02-12 17:05:11.705 22787 22787 F DEBUG   :     #00 pc 0004cccc  /system/lib/libc.so (tgkill+12)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #01 pc 0004a473  /system/lib/libc.so (pthread_kill+34)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #02 pc 0001c649  /system/lib/libc.so (raise+10)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #03 pc 00018169  /system/lib/libc.so (__libc_android_abort+34)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #04 pc 00016910  /system/lib/libc.so (abort+4)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #05 pc 0001a627  /system/lib/libc.so (__libc_fatal+22)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #06 pc 0004b183  /system/lib/libc.so (__stack_chk_fail+6)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #07 pc 00001765  /system/bin/screencap
02-12 17:05:11.705 22787 22787 F DEBUG   :     #08 pc 00016061  /system/lib/libc.so (__libc_init+48)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #09 pc 00001344  /system/bin/screencap
02-12 17:05:11.767 16803 16921 W NativeCrashListener: Couldn't find ProcessRecord for pid 22757
02-12 17:05:11.767 22787 22787 E         : AM data write failed: Broken pipe
02-12 17:05:11.769   127   127 W         : debuggerd: resuming target 22757
02-12 17:05:11.771 16803 16859 I BootReceiver: Copying /data/tombstones/tombstone_05 to DropBox (SYSTEM_TOMBSTONE)

1voto

sdaau Points 171

Eh bien, il s'avère qu'il y a quelque chose qui peut être tenté - copier le framebuffer du périphérique - mais cela n'a toujours pas abouti à une capture d'écran complète du périphérique pour moi.

Pourquoi le FrameBuffer est-il absent sur certains appareils Android ?

dans Android, c'est /dev/graphics/fbX, usually /dev/graphics/fb0`

pour moi :

 ls -la /dev/graphics/                                                                   
total 0
drwxr-xr-x  2 root root          80 2022-02-12 13:09 .
drwxr-xr-x 18 root root        2560 2022-02-12 13:10 ..
crw-rw----  1 root graphics 29,   0 2022-02-12 13:09 fb0
crw-rw----  1 root graphics 29,   1 2022-02-12 13:09 fb1

https://www.kernel.org/doc/html/latest/fb/framebuffer.html

Les dispositifs de tampon de trame sont également des dispositifs de mémoire normaux, ce qui signifie que vous pouvez lire et écrire leur contenu. Vous pouvez, par exemple, faire une capture d'écran :

cp /dev/fb0 myfile

Et enfin https://stackoverflow.com/questions/12456174/how-to-convert-a-raw-rgb-frame-buffer-file-to-a-viewable-format/16936538#16936538 :

Pour ne pas réinventer la roue, j'ai essayé de réutiliser un outil existant : ...

J'ai appelé le script de ce post get_android_fb_format.sh vous devrez peut-être changer la ligne principale en ceci :

    ffmpeg -f rawvideo -pix_fmt $item -s $FB_RESOLUTION -i androidFB $OUTPUT_DIR/$item.png

Donc, j'essaie depuis un PC :

$ adb pull /dev/graphics/fb0 androidFB
adb: error: failed to copy '/dev/graphics/fb0' to 'androidFB': remote open failed: Permission denied

Impossible - doit se faire en tant que Root à partir de l'appareil :

# cd /sdcard/Download
# cp /dev/graphics/fb0 androidFB 

... qui a fonctionné ; puis sur PC - adb pull enregistre un fichier appelé androidFB sur le dispositif, sur lequel je lance le script :

$ adb pull /sdcard/Download/androidFB
$ bash get_android_fb_format.sh

J'obtiens un dossier fbresult/ créé, où l'on peut observer différentes tentatives de décodage. Voici la partie intéressante :

  • Pour moi, /dev/graphics/fb0 a tenu le logo de démarrage Samsung (j'ai obtenu le décodage correct, mais j'ai aimé celui-là) :
    enter image description here
  • Cependant, /dev/graphics/fb1 est toujours vide

Donc, ce n'est probablement pas la bonne chose à faire - retourner à Pourquoi le FrameBuffer est-il absent sur certains appareils Android ? :

Aucune application Android ne gère directement /dev/fb0 existe-t-il ou non ?
...
Même le dragueur de surface ne peut pas voir le /dev/fb0 directement.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X