Android6.0 WMS(二) WMS創建窗口與創建Surface的關係

在上篇博客我們知道ViewRootImpl的setView函數會調用WindowSession的addToDisplay函數,這個函數通過Binder最終會調用WMS的addWindow函數,增加窗口。在http://blog.csdn.net/kc58236582/article/details/52413871博客中WindowState的創建過程那節中有詳細分析,當然這部分主要是圍繞Surface創建,另一篇博客http://blog.csdn.net/kc58236582/article/details/52088224中講解了窗口的建立,次序等等。

這篇博客我們把之前兩篇博客簡單結合起來,分析Surface創建的relayoutWindow函數和addWindow的聯繫等。


一、addWindow函數

我們知道在ViewRootImpl的setView函數中,是先調用了requestLayout函數,然後調用了mWindowSession.addToDisplay函數,但是requestLayout最後消息機制handler最後調用relayoutWindow函數,在這個函數中調用了mWindowSession.relayout函數,最後再到WMS的relayoutWindow函數的。這樣其實在ViewRootImpl的requestLayout中調用WMS的relayoutWindow是一個異步過程,所以先調用了WMS的addWindow函數。

addWindow的主要邏輯我們在http://blog.csdn.net/kc58236582/article/details/52413871博客中都分析了,這裏主要講下WindowState的創建,在WindowState的構造函數中我們也會新建一個WindowStateAnimator對象

        mWinAnimator = new WindowStateAnimator(this);

新建完WindowState對象後,會調用其attach函數

  1. void attach() {
  2. if (WindowManagerService.localLOGV) Slog.v(
  3. TAG, "Attaching " + this + " token=" + mToken
  4. + ", list=" + mToken.windows);
  5. mSession.windowAddedLocked();
  6. }

Session的windowAddedLocked函數會創建SurfaceSession對象

  1. void windowAddedLocked() {
  2. if (mSurfaceSession == null) {
  3. if (WindowManagerService.localLOGV) Slog.v(
  4. WindowManagerService.TAG, "First window added to " + this + ", creating SurfaceSession");
  5. mSurfaceSession = new SurfaceSession();
  6. if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
  7. WindowManagerService.TAG, " NEW SURFACE SESSION " + mSurfaceSession);
  8. mService.mSessions.add(this);
  9. if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
  10. mService.dispatchNewAnimatorScaleLocked(this);
  11. }
  12. }
  13. mNumWindow++;
  14. }
而這個SurfaceSession的構造函數調用會調用nativeCreate JNI函數,這個函數我們不看了會創建一個和SurfaceFlinger連接的對象。這個我們在博客http://blog.csdn.net/kc58236582/article/details/52413871也分析過了。
  1. public SurfaceSession() {
  2. mNativeClient = nativeCreate();
  3. }

最後我們會把這個WindowState放在mWindowMap這個map中。

mWindowMap.put(client.asBinder(), win);

二、relayoutWindow函數

relayoutWindow函數上來,直接調用windowForClientLocked函數查找WindowState對象

            WindowState win = windowForClientLocked(session, client, false);

這個函數就是從mWindowMap來查找WindowState對象,是根據應用共的IBinder對象來查詢的。

  1. final WindowState windowForClientLocked(Session session, IBinder client,
  2. boolean throwOnError) {
  3. WindowState win = mWindowMap.get(client);
  4. ......
  5. return win;
  6. }

後面會用WindowState的mWinAnimator對象的createSurfaceLocked函數來創建surfaceControl,最後再把這個copyFrom到outSurface,創給應用ViewRootImpl中的Surface。

  1. SurfaceControl surfaceControl = winAnimator.createSurfaceLocked();
  2. if (surfaceControl != null) {
  3. outSurface.copyFrom(surfaceControl);
  4. if (SHOW_TRANSACTIONS) Slog.i(TAG,
  5. " OUT SURFACE " + outSurface + ": copied");
  6. }

createSurfaceLocked會新建一個SurfaceControl對象

  1. mSurfaceControl = new SurfaceControl(
  2. mSession.mSurfaceSession,
  3. attrs.getTitle().toString(),
  4. width, height, format, flags);

在SurfaceControl對象的構造函數中調用nativeCreate JNI函數,利用傳進來的mSession的mSurfaceSession,就是之前WindowState的attach函數中創建的。利用它來和SurfaceFlinger通信創建Surface。具體可以看http://blog.csdn.net/kc58236582/article/details/52421683博客

        mNativeObject = nativeCreate(session, name, w, h, format, flags);




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章