surfaceflinger類圖
frameworks/base/libs/ui 和 frameworks/base/libs/surfaceflinger
ISurface 定義了基礎的Surface接口,供圖形系統客戶端 (應用)和server端(即surfaceflinger)交互。ISurface.cpp
BpSurface是ISurface的派生類,提供接口供server 調用客戶端功能;ISurface.cpp
BnSurface是ISurface的另一個派生類,提供接口供客戶端調用server功能。當 server 收到來自客戶端 (通過BnSurace)的調用請求後,如registerBuffers, postBuffer等,BnSurface::onTransact被觸發。ISurface.h
Surface (LayerBaseClient的私有類)是BnSurface的派生類。layerBase.h
SurfaceBuffer (SurfaceBuffer的私有類)是Surface的派生類。layerBuffer.h
ISurfaceComposer 定義了基礎的接口,供客戶端和server端交互。ISurfaceComposer.h
BpSurfaceComposer是一個派生類,提供接口供server調用客戶端功能;ISurfaceComposer.cpp
BnSurfaceComposer是另一派生類,提供接口供客戶端調用server功能。類 SurfaceFlinger 由BnSurfaceComposer派生而來。ISurfaceComposer.h
SurfaceComposerClient直接供客戶端使用,調用ISurface (BnSurface)和 ISurfaceComposer (BnSurfaceComposer)以及 ISurfaceFlingerClient 接口,與server交互。SurfaceComposerClient.h
BClient 派生自ISurfaceFlingerClient (BnSurfaceFlingerClient),調用server的createSurface,真正創建一個surface。每個surface對應一個layer.surfaceflinger.h
egl_native_window_t 定義了一個本地window類 。這個類提供了對本地window 的所有描述以及用於egl (opengl 與本地圖形系統的接口)操作本地windwo的所有方法。eglnatives.h
EGLNativeSurface是egl_native_window_t的一個派生類。EGLNativeSurface.h
EGLDisplaySurface是EGLNativeSurface的派生類。 EGLDisplaySurface 是一個非常重要的類,在這個類裏,真正打開framebuffer設備(/dev/graphics/fb0 或者/dev/fb0),並將這個設備封裝成EGLDisplaySurface的形式供server使用。函數mapFrameBuffer打開framebuffer, 創建兩個緩衝區,(一個是on screen front 緩衝區, 另一個back buffer, 可能位於offscreen framebuffer,也可能位於系統內存)。 函數swapBuffers將back buffer內容拷貝到front buffer中。
DisplayHardware 類中初始化了egl系統,併爲本地窗口對象EGLDisplaySurface 創建了對應的EGLSurface 對象。surfaceflinger 使用DisplayHardware去和本地窗口打交道。
研究一個surface如何創建的關鍵路徑如下:
1. frameworks/base/core/java/android/view/Surface.java — Surface::Surface ()。
2. frameworks/base/core/jni/android_view_Surface.cpp — Surface_init ()。
在這個函數中SurfaceComposerClient 對象被創建。
3. frameworks/base/libs/ui/SurfaceComposerClient.cpp — SurfaceComposerClient::SurfaceComposerClient ().
這個函數非常重要,在這裏建立了client和server之間的橋樑。通過函數_get_surface_manager()獲得了一個指向 server的IBinder 對象(具有ISurfaceComposer接口),之後通過這個IBinder就可以跨進程訪問Server的功能。接着調用 ISurfaceComposer::createConnection()創建並返回了一個ISurfaceFlingerClient的 IBinder。
4. frameworks/base/libs/ui/SurfaceComposerClient.cpp — SurfaceComposerClient::createSurface().
這個函數中,利用前面獲得的ISurfaceFlingerClient的IBinder,調用其createSurface接口。
5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp — BClient::createSurface ()。
BClient由ISurfaceFlingerClient派生而來。
6.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp — SurfaceFlinger:: createSurface()。
這個函數爲Surface創建一個對應的Layer。
上述關鍵路徑中,1,2,3,4運行於client進程中,而5,6運行與server進程中。server作爲一個service提供給client訪問。
與圖形相關的代碼分析
與圖形相關的代碼主要位於下列目錄:
1. frameworks/base/graphics/java/android/graphics
2.frameworks/base/core/java/android/view
3.frameworks/base/core/java/android/widget
4.frameworks/base/opengl/
5.frameworks/base/libs/ui
6.frameworks/base/libs/surfaceflinger
7.frameworks/base/core/jni/android/graphics
8.frameworks/base/core/jni/android/opengl
9.frameworks/base/core/jni/android/android_view_*.cpp
10.external/skia
android.graphics, android.view和android.widget
1.frameworks/base/graphics/java/android/graphics
2.frameworks/base/core/java/android/view
3.frameworks/base/core/java/android/widget
android.graphics, android.view和android.widget功能和其他類似的圖形庫如 Qt/Gtk+差不多,分別提供基本的圖形原語(如畫點畫線,設置圖形上下文等),事件機制,以及開發圖形用戶界面的控件等。canvas 用於開發2D圖形, Surface 代表一個可供圖形系統繪製的surface。可在其上繪製2D活3D圖形。
frameworks/base/opengl/
這個目錄包含opengel的接口以及軟件實現。在
http://developer.android.com/guide/topics/graphics/opengl.html
有詳細介紹如何使用android.opengl開發3d graphics。
external/skia
skia與cairo功能相當,封裝底 層的圖形硬件,爲上面的圖形庫提供最基礎的操作圖形硬件的原語。關於 skia 可參考《淺談 Google Skia 圖形處理引擎》2和 《Android 的圖形引擎 Skia》3兩篇文章。
frameworks/base/libs/ui 和 frameworks/base/libs/surfaceflinger
ISurface 定義了基礎的Surface接口,供圖形系統客戶端 (應用)和server端(即surfaceflinger)交互。
BpSurface是ISurface的派生類,提供接口供server 調用客戶端功能;
BnSurface是ISurface的另一個派生類,提供接口供客戶端調用server功能。當 server 收到來自客戶端 (通過BnSurace)的調用請求後,如registerBuffers, postBuffer等,BnSurface::onTransact被觸發。
Surface (LayerBaseClient的私有類)是BnSurface的派生類。
SurfaceBuffer (SurfaceBuffer的私有類)是Surface的派生類。
ISurfaceComposer 定義了基礎的接口,供客戶端和server端交互。
BpSurfaceComposer是一個派生類,提供接口供server調用客戶端功能;
BnSurfaceComposer是另一派生類,提供接口供客戶端調用server功能。類 SurfaceFlinger 由BnSurfaceComposer派生而來。
SurfaceComposerClient直接供客戶端使用,調用ISurface (BnSurface)和 ISurfaceComposer (BnSurfaceComposer)以及 ISurfaceFlingerClient 接口,與server交互。
BClient 派生自ISurfaceFlingerClient (BnSurfaceFlingerClient),調用server的createSurface,真正創建一個surface。每個surface對應一個layer.
egl_native_window_t 定義了一個本地window類 。這個類提供了對本地window 的所有描述以及用於egl (opengl 與本地圖形系統的接口)操作本地windwo的所有方法。
EGLNativeSurface是egl_native_window_t的一個派生類。
EGLDisplaySurface是EGLNativeSurface的派生類。 EGLDisplaySurface 是一個非常重要的類,在這個類裏,真正打開framebuffer設備(/dev/graphics/fb0 或者/dev/fb0),並將這個設備封裝成EGLDisplaySurface的形式供server使用。函數mapFrameBuffer打開framebuffer, 創建兩個緩衝區,(一個是on screen front 緩衝區, 另一個back buffer, 可能位於offscreen framebuffer,也可能位於系統內存)。 函數swapBuffers將back buffer內容拷貝到front buffer中。
DisplayHardware 類中初始化了egl系統,併爲本地窗口對象EGLDisplaySurface 創建了對應的EGLSurface 對象。surfaceflinger 使用DisplayHardware去和本地窗口打交道。
jni
7.frameworks/base/core/jni/android/graphics
8.frameworks/base/core/jni/android/opengl
9.frameworks/base/core/jni/android/android_view_*.cpp
這些目錄下的代碼在Java層的graphics 組件和native (c++)組件之間銜接,將java層的功能調用轉換到對應的本地調用。
hardware/libhardware實現了HAL(Hardware Abstraction Layer)層,copybit device是其中一個模塊。
ISurface 定義了基礎的Surface接口,供圖形系統客戶端 (應用)和server端(即surfaceflinger)交互。ISurface.cpp
BpSurface是ISurface的派生類,提供接口供server 調用客戶端功能;ISurface.cpp
BnSurface是ISurface的另一個派生類,提供接口供客戶端調用server功能。當 server 收到來自客戶端 (通過BnSurace)的調用請求後,如registerBuffers, postBuffer等,BnSurface::onTransact被觸發。ISurface.h
Surface (LayerBaseClient的私有類)是BnSurface的派生類。layerBase.h
SurfaceBuffer (SurfaceBuffer的私有類)是Surface的派生類。layerBuffer.h
ISurfaceComposer 定義了基礎的接口,供客戶端和server端交互。ISurfaceComposer.h
BpSurfaceComposer是一個派生類,提供接口供server調用客戶端功能;ISurfaceComposer.cpp
BnSurfaceComposer是另一派生類,提供接口供客戶端調用server功能。類 SurfaceFlinger 由BnSurfaceComposer派生而來。ISurfaceComposer.h
SurfaceComposerClient直接供客戶端使用,調用ISurface (BnSurface)和 ISurfaceComposer (BnSurfaceComposer)以及 ISurfaceFlingerClient 接口,與server交互。SurfaceComposerClient.h
BClient 派生自ISurfaceFlingerClient (BnSurfaceFlingerClient),調用server的createSurface,真正創建一個surface。每個surface對應一個layer.surfaceflinger.h
egl_native_window_t 定義了一個本地window類 。這個類提供了對本地window 的所有描述以及用於egl (opengl 與本地圖形系統的接口)操作本地windwo的所有方法。eglnatives.h
EGLNativeSurface是egl_native_window_t的一個派生類。EGLNativeSurface.h
EGLDisplaySurface是EGLNativeSurface的派生類。 EGLDisplaySurface 是一個非常重要的類,在這個類裏,真正打開framebuffer設備(/dev/graphics/fb0 或者/dev/fb0),並將這個設備封裝成EGLDisplaySurface的形式供server使用。函數mapFrameBuffer打開framebuffer, 創建兩個緩衝區,(一個是on screen front 緩衝區, 另一個back buffer, 可能位於offscreen framebuffer,也可能位於系統內存)。 函數swapBuffers將back buffer內容拷貝到front buffer中。
DisplayHardware 類中初始化了egl系統,併爲本地窗口對象EGLDisplaySurface 創建了對應的EGLSurface 對象。surfaceflinger 使用DisplayHardware去和本地窗口打交道。
研究一個surface如何創建的關鍵路徑如下:
1. frameworks/base/core/java/android/view/Surface.java — Surface::Surface ()。
2. frameworks/base/core/jni/android_view_Surface.cpp — Surface_init ()。
在這個函數中SurfaceComposerClient 對象被創建。
3. frameworks/base/libs/ui/SurfaceComposerClient.cpp — SurfaceComposerClient::SurfaceComposerClient ().
這個函數非常重要,在這裏建立了client和server之間的橋樑。通過函數_get_surface_manager()獲得了一個指向 server的IBinder 對象(具有ISurfaceComposer接口),之後通過這個IBinder就可以跨進程訪問Server的功能。接着調用 ISurfaceComposer::createConnection()創建並返回了一個ISurfaceFlingerClient的 IBinder。
4. frameworks/base/libs/ui/SurfaceComposerClient.cpp — SurfaceComposerClient::createSurface().
這個函數中,利用前面獲得的ISurfaceFlingerClient的IBinder,調用其createSurface接口。
5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp — BClient::createSurface ()。
BClient由ISurfaceFlingerClient派生而來。
6.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp — SurfaceFlinger:: createSurface()。
這個函數爲Surface創建一個對應的Layer。
上述關鍵路徑中,1,2,3,4運行於client進程中,而5,6運行與server進程中。server作爲一個service提供給client訪問。
與圖形相關的代碼分析
與圖形相關的代碼主要位於下列目錄:
1. frameworks/base/graphics/java/android/graphics
2.frameworks/base/core/java/android/view
3.frameworks/base/core/java/android/widget
4.frameworks/base/opengl/
5.frameworks/base/libs/ui
6.frameworks/base/libs/surfaceflinger
7.frameworks/base/core/jni/android/graphics
8.frameworks/base/core/jni/android/opengl
9.frameworks/base/core/jni/android/android_view_*.cpp
10.external/skia
android.graphics, android.view和android.widget
1.frameworks/base/graphics/java/android/graphics
2.frameworks/base/core/java/android/view
3.frameworks/base/core/java/android/widget
android.graphics, android.view和android.widget功能和其他類似的圖形庫如 Qt/Gtk+差不多,分別提供基本的圖形原語(如畫點畫線,設置圖形上下文等),事件機制,以及開發圖形用戶界面的控件等。canvas 用於開發2D圖形, Surface 代表一個可供圖形系統繪製的surface。可在其上繪製2D活3D圖形。
frameworks/base/opengl/
這個目錄包含opengel的接口以及軟件實現。在
http://developer.android.com/guide/topics/graphics/opengl.html
有詳細介紹如何使用android.opengl開發3d graphics。
external/skia
skia與cairo功能相當,封裝底 層的圖形硬件,爲上面的圖形庫提供最基礎的操作圖形硬件的原語。關於 skia 可參考《淺談 Google Skia 圖形處理引擎》2和 《Android 的圖形引擎 Skia》3兩篇文章。
frameworks/base/libs/ui 和 frameworks/base/libs/surfaceflinger
ISurface 定義了基礎的Surface接口,供圖形系統客戶端 (應用)和server端(即surfaceflinger)交互。
BpSurface是ISurface的派生類,提供接口供server 調用客戶端功能;
BnSurface是ISurface的另一個派生類,提供接口供客戶端調用server功能。當 server 收到來自客戶端 (通過BnSurace)的調用請求後,如registerBuffers, postBuffer等,BnSurface::onTransact被觸發。
Surface (LayerBaseClient的私有類)是BnSurface的派生類。
SurfaceBuffer (SurfaceBuffer的私有類)是Surface的派生類。
ISurfaceComposer 定義了基礎的接口,供客戶端和server端交互。
BpSurfaceComposer是一個派生類,提供接口供server調用客戶端功能;
BnSurfaceComposer是另一派生類,提供接口供客戶端調用server功能。類 SurfaceFlinger 由BnSurfaceComposer派生而來。
SurfaceComposerClient直接供客戶端使用,調用ISurface (BnSurface)和 ISurfaceComposer (BnSurfaceComposer)以及 ISurfaceFlingerClient 接口,與server交互。
BClient 派生自ISurfaceFlingerClient (BnSurfaceFlingerClient),調用server的createSurface,真正創建一個surface。每個surface對應一個layer.
egl_native_window_t 定義了一個本地window類 。這個類提供了對本地window 的所有描述以及用於egl (opengl 與本地圖形系統的接口)操作本地windwo的所有方法。
EGLNativeSurface是egl_native_window_t的一個派生類。
EGLDisplaySurface是EGLNativeSurface的派生類。 EGLDisplaySurface 是一個非常重要的類,在這個類裏,真正打開framebuffer設備(/dev/graphics/fb0 或者/dev/fb0),並將這個設備封裝成EGLDisplaySurface的形式供server使用。函數mapFrameBuffer打開framebuffer, 創建兩個緩衝區,(一個是on screen front 緩衝區, 另一個back buffer, 可能位於offscreen framebuffer,也可能位於系統內存)。 函數swapBuffers將back buffer內容拷貝到front buffer中。
DisplayHardware 類中初始化了egl系統,併爲本地窗口對象EGLDisplaySurface 創建了對應的EGLSurface 對象。surfaceflinger 使用DisplayHardware去和本地窗口打交道。
jni
7.frameworks/base/core/jni/android/graphics
8.frameworks/base/core/jni/android/opengl
9.frameworks/base/core/jni/android/android_view_*.cpp
這些目錄下的代碼在Java層的graphics 組件和native (c++)組件之間銜接,將java層的功能調用轉換到對應的本地調用。
hardware/libhardware實現了HAL(Hardware Abstraction Layer)層,copybit device是其中一個模塊。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.