
陸陸續(xù)續(xù)已經(jīng)寫了好多了,這個計劃圖之后再調整吧。
Android圖形系統(tǒng)學習框架:
Android圖形系統(tǒng)(一)-Window加載視圖過程
Android圖形系統(tǒng)(二)-DecorView布局加載流程
Android圖形系統(tǒng)(三)-View繪制流程
Android圖形系統(tǒng)(四)-Activity、Window、View關系總結
Android圖形系統(tǒng)(五)-Surface圖形系統(tǒng)概覽
Android圖形系統(tǒng)(六)-app與SurfaceFlinger服務連接過程
Android圖形系統(tǒng)(七)-app請求SurfaceFlinger創(chuàng)建Surface過程
Android圖形系統(tǒng)(八)-app與SurfaceFlinger共享UI元數(shù)據(jù)過程
Android圖形系統(tǒng)(九)-View、Canvas與Surface的關系
Android圖形系統(tǒng)(十)-SurfaceFlinger啟動及圖層合成送顯過程
Android圖形系統(tǒng)(十一)-Choreographer
Android圖形系統(tǒng)(十二)-流暢度概念
簡單總結下Activity啟動后布局顯示過程:
SurfaceFlinger 是在init.rc解析的時候被創(chuàng)建的,執(zhí)行其main方法,實例化了Surfaceflinger,并向ServiceManager注冊,SurfaceFlinger運行在單獨進程中。
在 Activity 創(chuàng)建過程中執(zhí)行 scheduleLaunchActivity() 之后便調用到了 handleLaunchActivity() 方法。首先通過Instrumentation創(chuàng)建Activity,然后執(zhí)行Activity的attach()方法,創(chuàng)建 PhoneWindow,且與activity建立回調關聯(lián)。獲取WindowManager,層層代理最終干活的是WindowManagerGlobal。
setContentView過程,創(chuàng)建DecorView,并把xml的View樹解析出來,加到DecorView上的contentParent部分。
Activity 調用makeVisible ,實際上是WindowManagerGlobal執(zhí)行addView操作,然后調用ViewRootImpl setView操作。
ViewRootImpl setView 做了兩件事: 1) requestLayout觸發(fā)繪制流程 2)mWindowSession.addToDisplay 通過IPC 執(zhí)行WMS.addWindow
requestLayout :中的relayoutWindow過程中app請求SurfaceFlinger創(chuàng)建Surface
mWindowSession.addToDisplay:最終執(zhí)行WMS.addWindow方法,該方法流程最終建立了app與SurfaceFlinger服務連接。
Android應用程序與SurfaceFlinger服務是運行在不同的進程中的,用Binder進行通信,用匿名共享內存進行UI數(shù)據(jù)傳遞。
requestLayout draw的流程中:Surface通過dequeueBuffer獲取一塊GraphicBuffer, 然后onDraw中通過傳入的Java層Canvas 調用底層Skia引擎中的SKCanvas(畫家)、SKBitmap(畫布)進行具體繪制操作,繪制完成之后把圖形數(shù)據(jù)放入GraphicBuffer,最后Surface執(zhí)行queueBuffer,把這塊帶有圖形數(shù)據(jù)的buffer送回BufferQueue,并通過onFrameAvailable通知Layer更新。
SurfaceFlinger合成圖層依賴于Android的異步消息處理機制,每16ms接收一次vsync信號來執(zhí)行圖層合成操作,最終通過handleMessageRefresh一系列方法的處理,其中包括把GraphicBuffer數(shù)據(jù)映射為OpenGL的texture ,收集所有Layer計算顯示區(qū)域,然后通過openG 或 HWC進行合成以及柵格化處理,最后送顯。
另外,這個過程了解了,那么Systrace也就會看了。