Android截屏浅析
http://blog.csdn.net/xww810319/article/details/17607749

Android截屏浅析
链接:http://blog.sina.com.cn/s/blog_69a04cf4010173fz.html

Android的调试工具DDMS提供截屏功能,很多同步软件例如豌豆荚也都提供截屏功能,经分析Android截屏原理大致如下:

DDMS是通过adb调用设备端的adbd(ADBdaemon)提供的framebufferservice进行截屏(源码在system/core/adb/framebuffer_service.c),在较早版本的Android中,framebuffer service通过直接读framebuffer 设备(/dev/graphics/fb0)来截屏,在较新版本的Android中,framebuffer service则调用截屏工具screencap来截屏。那些同步软件也是调用screencap实现截屏的。

screencap是Android原生自带的工具,是一个C写的可执行文件,在设备上的/system/bin/下面可以找到它,screencap截屏后可保存为PNG格式文件或RGBRAW文件。

screencap的源码在frameworks/base/cmds/screencap/,它调用SurfaceFlinger提供的截屏接口ScreenshotClient,其源码在frameworks/native/libs/gui/SurfaceComposerClient.cpp(该路径在不同版本的Android源码中可能略有差别),ScreenshotClient通过进程间通信调用SurfaceFlinger service的截屏功能,源码在frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp中的函数SurfaceFlinger::captureScreen。

在各种截屏方法中,读framebuffer设备(/dev/graphics/fb0)的方式在某些使用硬件overlay显示的设备上可能无法截取到某些画面(例如video playback和camera preview画面),但是SurfaceFlinger提供的上述截屏接口则可以完美截取任何屏幕画面,因此相对来说是Android上最正规最完善的截屏方法,使用起来也非常简单。但需注意,ScreenshotClient等接口在不同Android版本上可能存在差异,例如在JellyBean的最新版本上ScreenshotClient的成员函数update增加了一个参数display(应该是为了支持多个显示设备),导致与之前版本不兼容。

此外Android还自带另一个截屏工具screenshot,源码在frameworks/base/cmds/screenshot/,它通过直接读framebuffer 设备(/dev/graphics/fb0)来截屏,保存为PNG格式文件。screenshot貌似没有用处。