題外話
剛剛開始着筆寫作這篇文章時,正好看電視在采訪一位92歲的考古學家,在他的日記中有這樣一句話,寫在這里與君共勉“不要等待幸運的降臨,要去努力的掌握知識”。如此朴實的一句話,此時此刻,正適合我們。
1 前言
回到前面的文章:
Android 12(S) 圖像顯示系統 - 示例應用(二) ,在上一篇文章中已經講解了應用如何與SurfaceFlinger建立連接和通信,接下來就要去創建Surface了,當然在此之前,還有獲取屏幕Display信息的操作,這不是關注的重點,先不展開講解。
// create the native surface
sp<SurfaceControl> surfaceControl = surfaceComposerClient->createSurface(mName,
resolution.getWidth(),
resolution.getHeight(), PIXEL_FORMAT_RGBA_8888,
ISurfaceComposerClient::eFXSurfaceBufferState,
/*parent*/ nullptr);
注:本片涉及的代碼
/frameworks/native/libs/gui/SurfaceComposerClient.cpp
/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
/frameworks/native/services/surfaceflinger/Client.cpp
/frameworks/native/libs/gui/ISurfaceComposer.cpp
2 createSurface的流程
先把類圖貼這里,待會分析流程便於查看數據的流向

SurfaceComposerClient::createSurface
代碼如下,比較簡單,使用時需要傳遞一個名字(name),指定寬高信息,指定格式(format)等,返回一個SurfaceControl的指針,這個方法中調用了createSurfaceChecked
* /frameworks/native/libs/gui/SurfaceComposerClient.cpp
sp<SurfaceControl> SurfaceComposerClient::createSurface(const String8& name, uint32_t w, uint32_t h,
PixelFormat format, uint32_t flags,
const sp<IBinder>& parentHandle,
LayerMetadata metadata,
uint32_t* outTransformHint) {
sp<SurfaceControl> s;
createSurfaceChecked(name, w, h, format, &s, flags, parentHandle, std::move(metadata),
outTransformHint);
return s;
}
SurfaceComposerClient::createSurfaceChecked
這個方法的核心是 mClient->createSurface ,前面講過(sp<ISurfaceComposerClient> mClient)是Client的代理客戶端,最終調用到服務端 Client::createSurface
這個方法中還有兩個變量:
sp<IBinder> handle == 這個代表什么? ==> SurfaceFlinger中創建的Layer的句柄或標識