在
https://blog.csdn.net/aaajj/article/details/93653074
https://blog.csdn.net/aaajj/article/details/102537628
裏面討論了從SurfaceFlinger中獲取layer圖像的一個試驗,這裏再回顧下,
應用的圖像本質上是畫在一個內存空間上,這個內存區是由SurfaceFinger創建的,通過一系列複雜的操作,客戶端可以獲取到這個共享區域的地址,在上面進行寫數據來實現繪圖。
【Android顯示系統初探】surface初相識
裏面的C++程序通過寫內存數據來畫圖,可以加深這個理解。
SurfaceFinger創建的圖像存儲區通過GraifcBuffer進行了管理,在我們的試驗中,也是獲取到了GraifcBuffer對象,並通過binder的方式,把GraifcBuffer對象傳送給另外的一個程序A,程序A獲取到GraphicBuffer對象後,調用其lockAsync方法獲取到圖像的地址,然後獲取到圖像,保存到圖片裏。
sp<GraphicBuffer> buf = new GraphicBuffer();;
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 繪圖機制