在
https://blog.csdn.net/aaajj/article/details/93653074
https://blog.csdn.net/aaajj/article/details/102537628
里面讨论了从SurfaceFlinger中获取layer图像的一个试验,这里再回顾下,
应用的图像本质上是画在一个内存空间上,这个内存区是由SurfaceFinger创建的,通过一系列复杂的操作,客户端可以获取到这个共享区域的地址,在上面进行写数据来实现绘图。
里面的C++程序通过写内存数据来画图,可以加深这个理解。
SurfaceFinger创建的图像存储区通过GraifcBuffer进行了管理,在我们的试验中,也是获取到了GraifcBuffer对象,并通过binder的方式,把GraifcBuffer对象传送给另外的一个程序A,程序A获取到GraphicBuffer对象后,调用其lockAsync方法获取到图像的地址,然后获取到图像,保存到图片里。
sp
data.read(*buf);
Region newDirtyRegion;
const Rect bounds(w, h);
newDirtyRegion.set(bounds);
int fenceFd = -1;
void* vaddr;
//GRALLOC_USAGE_SW_READ_OFTEN 0x00000003U
//GRALLOC_USAGE_SW_WRITE_OFTEN 0x00000030U
status_t res = buf->lockAsync(0x00000003U | 0x00000030U,
newDirtyRegion.bounds(), &vaddr, fenceFd);
printf("==== vaddr=%p\n", vaddr);
char pname[32] = {0};
sprintf(pname, "%02d.png", icode++);
char* base = (char*)vaddr;
writePNG(pname, base, w, h, format, s);
参考资料
https://www.jianshu.com/p/993e66015c18
Android 绘图机制