我眼中的Android Framework

在開發中咱們會遇到各類各樣的很是奇怪的問題,有些問題是百思不得騎姐。其實這些問題大都是由於咱們不瞭解安卓內部運行原理,知其因此然纔是咱們的目的。—前言linux

任何控制類程序都有一個入口,安卓應用程序確定也是有滴。
Android framework包含三個小夥伴:服務端、客戶端、linux驅動。多線程

服務端

服務端主要包含兩個狠重要的類:WindowManagerService(WMS)和ActivityManagerService(AMS)異步

客戶端

客戶端包含如下類:函數

  • ActivityThread:是安卓應用程序的主線程類,這個小夥伴所在的線程就是UI線程或者稱爲主線程。oop

  • Activity:ActivityThread會根據用戶的操做選擇讓哪一個Activity對象上它的船。線程

  • PhoneWindow:富二代,繼承於牛氣的Window類,本身屋裏住着一個DecorView對象,像它老爸喜歡制定規則提供了一些通用窗口操做API。cdn

  • Window:富一代,長得比較抽象,喜歡制定規則提供了一些通用的窗口操做API。它不喜歡被人管因此呢,注意:WindowManagerService管理的窗口不是Window類,實際上是View和ViewGroup。對象

  • DecorView:很能幹的傢伙,家產來自FrameLayout,比較注重外在喜歡打扮,DecorView是對FrameLayout進行了一些修飾,從名字就能夠看出來。繼承

  • ViewRoot:小管家繼承於Handler,主要做用是把WMS的IPC調用轉換爲本地的一個異步調用。接口

  • W類:ViewRoot小助手,繼承於binder,是ViewRoot內部類。主要幫助ViewRoot實現把WMS的IPC調用轉換爲本地的一個異步調用。

  • WindowManager:客戶端若是想建立一個窗口得先告訴WindowManager一聲,而後它再和WindowManagerService交流一下看看能不能建立,客戶端不能直接和WMS交互。

    Linux驅動

    Linux驅動和Framework相關的主要是兩個部分:畫家SurfaceFlingger和快遞員Binder。

    每個窗口都對應一個畫Surface,SF主要是把各個Surface顯示到同一屏幕上。Binder是提供跨進程的消息傳遞。

從apk程序的運行過程去看看上面各個組件在啥時候幹啥活的

ActivityThread從main()函數中就開始動起來,而後調用prepareMainLooper()爲UI線程建立一個消息快遞通道即MessageQueue。

接着建立ActivityThread對象,建立過程會建立一個消息裝卸工Handler對象和一個快遞員Binder對象,其中Binder負責接收遠程Ams的IPC調用,接收到調用後讓Handler把消息裝到消息快遞隊列,UI線程很忙的都是異步的從消息快遞隊列中取出消息並執行相應操做,好比 start、stop、pause。

而後UI線程讓隊列調用Looper.loop()方法進入消息循環體,進入後就會不斷地從消息隊列中讀取並處理消息。

當ActivityThread接收到Ams發送start某個Activity的快遞後就會建立指定的Activity對象。Activity會先按窗戶再去按玻璃和貼窗花,因此先建立PhoneWindow->DecorView->建立相應的View或ViewGroup。建立完成後就可讓你們欣賞了,調用WindowManager把界面顯示到屏幕上,而後建立ViewRoot,而後調用Wms提供的遠程接口添加一個窗口並顯示到屏幕上。

接下來就是用戶的操做,事件線程不斷的把消息快遞發到事件隊列中去,而後事件分發線程祕書逐個取出消息,而後調用Wms中的相應函數處理該消息。

不少線程是否是很暈?

  1. 安卓程序中都有哪些線程?

    客戶端小夥伴至少包含三個線程小弟,Activity啓動後會建立一個ViewRoot.W對象,同時ActivityThread會建立一個ApplicationThread對象,這兩個對象繼承消息總管Binder,每一個Binder對應一個線程,負責接收Linux Binder驅動發送的IPC調用。還有一個是UI線程唄。

  2. UI線程是什麼?

    一直在傾聽用戶的心聲,全部的處理用戶消息,以及繪製頁面的工做都在該線程中完成。

  3. 自定義的線程和UI線程有什麼區別?

    UI線程是從ActivityThread運行的,在該類的main()方法中已經使用了Looper.prepareMainLooper()爲該線程添加了Looper對象,已經爲該線程建立了消息隊列,是自帶祕書光環的。所以,咱們才能夠在Activity中去定義Handler對象,由於建立Handler對象時其線程必須已經建立了消息隊列,裝卸工得配運輸帶要否則無法幹活。而普通的Thread則沒有默認建立消息隊列,因此不能直接在Thread中直接定義Handler,這個就是咱們不懂程序運行原理致使的困惑。

轉載註明出處,若有問題請留言。

備註:以上部分思想來自於《Android內核剖析》

相關文章
相關標籤/搜索