Android screencap的处理流程-编程思维

以下分析基于Android Q的代码

 

先大体整理screencap的处理流程
1.获取DisplayID
std::optional<PhysicalDisplayId> displayId = SurfaceComposerClient::getInternalDisplayId();

2. 调用ScreenshotClient::capture截取屏幕图像,数据保存在一个GraphicBuffer中

ui::Dataspace outDataspace;
sp<GraphicBuffer> outBuffer;
status_t result = ScreenshotClient::capture(*displayId, &outDataspace, &outBuffer);

3. BInder IPC 呼叫到 SurfaceFlinger::captureScreen

根据DisplayId获取到DisplayDevice信息,width/height/orientation/renderArea

4. 继续呼叫 SurfaceFlinger::captureScreenCommon
createGraphicBuffer

5. 继续调用 SurfaceFlinger::captureScreenImplLocked
找到belongsToDisplay 并判断(layer->isVisible() && layer->isSecure()的情况

6. 继续走到 SurfaceFlinger::renderScreenImplLocked
遍历belongsToDisplay的所有layer ==>layer->prepareClientLayer

7. 使用getRenderEngine().drawLayers 绘制合成到一个GraphicBuffer中
GLESRenderEngine::drawLayers中使用GLES完成图像绘制

大体如上过程screencap中就得到了最后保存屏幕截图的GraphicBuffer,然后利用Skia中的方法经encode保存在PNG图片

 

 

 

 

 

 

 

Android原生recent app机制的重点就是去获取screenshots of each task,具体是去调用 :
WindowManagerService::getTaskSnapshot

TaskSnapshot实际是在TaskSnapshotController中获取的
frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java

 

大体如下流程:
     1. TaskSnapshotController::createTaskSnapshot
     2. SurfaceControl::captureLayers
     经JNI
     3. ScreenshotClient::captureChildLayers
     经binder
     4. SurfaceFlinger::captureLayers
     5. SurfaceFlinger::captureScreenCommon
     6. SurfaceFlinger::captureScreenImplLocked
     7. SurfaceFlinger::renderScreenImplLocked
     8. GLESRenderEngine::drawLayers

处理过程和screencap截取屏幕是类似的,区别在于

screencap:呼叫ScreenshotClient::capture,传递displayId给SurfaceFlinger,会把和这个display相关的layer合成绘制到一张图片

TaskSnapshot: 呼叫ScreenshotClient::captureChildLayers,传递和task相关的layerHandle给SurfaceFlinger,会把和这个layerHandle相关的layers / child layers合成绘制到一张图片

差不多简单理解:

screencap:截取屏幕显示的内容

TaskSnapshot:截取一个apk界面显示的内容

 

但从SurfaceFlinger处理来说基本一致,最终都是通过GPU合成 画到一张图片,数据存到GraphicBuffer中返回给caller。

 

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/roger-yu/p/16212198.html

Qt Quick 配置android开发环境-编程思维

Qt Quick 配置android开发环境          如果用Qt来开发Android程序,安装qt后,在QtCreator 的Kits配置中,Android的选项由于配置不全而不能被选中使用,如下,这是由于Qt开发Android的开发环境还没有配置而引起的。          在设备选项配置中,Androi

爬虫工程师分享:三步就搞定 Android 逆向-编程思维

本文源于我近期的一次公司内部分享,通过逆向某款 APP 来介绍逆向过程。由于仅作为学习用途,APP 的相关信息会被遮盖,敬请理解。 关于逆向 逆向——包括但不限于通过反编译、Hook 等手段,来解析一些功能的实现过程。 逆向在很多领域都有应用,比如如今爬虫技术已经遍地走,甚至不用写代码都可以爬取数据,导致前端开发的反