[Android] SurfaceFlinger (2)

這裡整理了一份從java層surface到surfaceflinger的source code trace route,雖然只列出Surface init及Surface destroy,不過看起來基本的流程就是這樣了,其他的surface operations應該也可以依循這樣的路徑去看。

相關的檔案位置如下:

frameworks/base/core/java/android/view/Surface.java

frameworks/base/core/jni/android_view_Surface.cpp

frameworks/base/libs/ui/SurfaceComposerClient.cpp

frameworks/base/libs/ui/ISurfaceFlingerClient.cpp

frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp

還有一些相關的header files可能會需要看看,可以在以下兩個位置找到

frameworks/base/include/ui

frameworks/base/include/binder

簡單說一下,其實基本上就是找到上層java那邊的功能,然後一定會有相對應的jni,去作為java操控底層native library的interface,所以找到相對的程式碼,從裡面可以再trace到相對應的library。surfaceflinger的部份,首先要注意的是Binder的介接,因為這裡的實作方式是透過Binder去作為SurfaceComposerClient及SurfaceFlinger之間的溝通管道,所以在此會看到好幾個加上了像ISurfaceFlingerClient.cpp這種由I開頭的檔名,裡面基本上都是繼承自Binder相關的class,Binder的宣告和實作部份,大致上有以下幾個檔案要注意,

frameworks/base/include/binder/IInterface.h

frameworks/base/include/binder/Binder.h

frameworks/base/include/binder/IBinder.h

frameworks/base/include/binder/BpBinder.h

而他們的實作內容放在

frameworks/base/libs/binder/

在SurfaceFlinger裡面,則要注意到一些Layer的操作,這部份Android 1.6和2.0之間似乎有些區別,Android 2.0在LayerBase的部份,另外有個class sp來作template包裝,這是跟1.6之間的小差異吧。

接下來再針對找尋dirty region的部份作整理。

發佈留言