Linux command screen和Android screencap

1. Linux Screen

我们用ssh登录的时候发现,如果用命令行的方式启动QEMU,由于是用command line的方式在本地窗口登录了远程的Host主机,导致QEMU无法在当前窗口(本地窗口)正常启动QEMU窗口,也就无法正常启动虚拟机。这时候需要用到screen这个命令。这个命令可以让我们登录在远程Host主机的窗口上。

安装 screen

on ubuntu 20.04:

$ sudo apt-get install screen

在远程Host端生成窗口(需要在Host端的机器的shell里启动下面这个命令)

$ screen

在远程SSH端:

复制代码
#after ssh login, execute below commands

#screen -ls 会显示当前启动的screen
# screen -d -r <screen_name> 可以登录远程窗口

civ@civ-rcl:~$ screen -ls
There is a screen on:
        5499.pts-2.civ-rcl      (2021年03月10日 13时32分47秒)   (Attached)
1 Socket in /run/screen/S-civ.
civ@civ-rcl:~$ screen -d -r 5499.pts-2.civ-rcl
复制代码

 

2. Android screencap

2.1用法

$ adb shell /system/bin/screencap -p /sdcard/screenshot.png
$ adb pull /sdcard/screenshot.png

或者可以直接用

$ adb shell screencap /data/pic_1.png

如果sdcard没有,可以用data,这里也可以随便修改添加文件

2.2 Android screencap与HardwareComposer

2.2.1区别与联系

需要注意的是,设备中并没有一个framebuffer包含所有的像素让我们简单的copy来capture screen。

因此当我们用adb shell screencap截屏的时候,实际上screencap这个function是把整个屏幕重新画到一块buffer里,然后输出到文件中。

所以大概会有两种原因导致截图内容可能会和我们见到屏幕显示的内容不同:

a.如果屏幕上存在“secure” layer或 DRM 内容(这里的DRM指的是Digital Rights Management,数字版权管理;而不是我们常说的Direct Rendering Model)。显然出于安全或者版权保护的原因,这部分内容将不会被合成进screencap生成的截图中。

b.HardwareComposer合成出错。Android系统默认开启HardwareComposer(在系统中也被标为hardware overlay)进行对渲染的各个图层进行硬件合成,当HardwareComposer合成出错时,screencap输出的截图反而会是对的,这是因为如前面所说,screencap是把整个屏幕内容重新画到一块buffer里再输出,相当于GLES合成(即软件方式合成)。

2.2.2如何关闭HardwareComposer

有两种方法,

方法一:在Android UI界面的setting中找到Hardware Overlay选项进行改动

方法二:Android命令:adb shell service call SurfaceFlinger 1008 i32 1

关闭HWC后将会强制开启GLES合成

 

参考链接:

https://stackoverflow.com/questions/30328373/adb-screencap-output-is-different-than-on-the-device

posted @ 2021-03-11 15:44  青山牧云人  阅读(280)  评论(0)    收藏  举报