一起來學嵌入式Android系統 (第二章心得三)

在O’REILLY"嵌入式Android系統"這本書的第二章是Android內部機制入門。本次心得是第二章的最後一篇文章,大綱於下:

◎    系統服務

◎    基本常備AOSP套件

◎    系統啟動

系統服務(system service)應該算是Android重要的幕後機制,Android的功能大多是透過系統服務(service)來達成的;這些服務彼此協同合作,構成以Linux為基礎的物件導向OS,這正是Binder存在的目的。因此,理解系統服務包含些什麼以及它們如何與彼此及系統其餘部份互動是一件至關重要的事,故會針對此部份補充參考書籍。在這邊要說明的是,在Android上面Service很多的意思;在前面提到APP四大元件時的Service是指android.app.Service;而在系統端又分為以下兩種Service(以下採用Jollen說法): Android Service又稱為Java Service,是實作在框架層(framework)裡的「Server」,Android Service以Java撰寫;而Native Service則是實作在Runtime層裡的Server。系統服務的架構請參考書中圖2-4所示,大多數的服務主要執行在System Server行程之上,但多媒體相關的服務則是在Media Service(mediaserver行程)之上,書上有特別說明Android在這個部份的名詞混亂,需要多花些時間瞭解專有術語的部份。再下來就是在實機上以命令service list來看有多少系統服務,但由於沒有文件說明每個服務運作方式,這些都要確認原始碼以取得與其它服務如何互動的正確觀念。

在這邊就要先離開書裡內容。上面提到要瞭解每個服務必須去看Android程式碼;但是Android程式碼相當的龐大,一開始很難著手;這時後大陸作者寫的Android原始碼分析書籍就派上用場了。推薦以下兩本都是鄧凡平先生的著作:

◎ Android系統原理深入解析 (以下簡稱"第一冊")

2-3-1

◎ 解剖Android原生代碼 (以下簡稱"第二冊")

2-3-2

“第一冊"主要是在Native Code的部份,"第二冊"則是在Java部份;前一篇文章的JNI的議題,就請參考"第一冊"第二章 深入理解JNI;而系統服務的部份則可以參考"第一冊"第六章 深入理解Binder 與 “第二冊"第三章 深入瞭解SystemServer。

回到書上的內容,Server Manager與Binder互動請見圖2-5與書中的文字敘述;簡言之在平台端,所有的系統服務查詢都是透過System Manager完成的,如果服務未跟Service Manager註冊,就不會被系統其餘部份看到。另外,APP也可以透過getSystemService()利用System Manager來找到對應的服務。最後書中以Activity Manager做為服務範例來簡單描述,而關於Activity Manager詳細內容請參考"第二冊"第六章 深入瞭解ActivityManagerService。

在基本常備AOSP套件的部份,就是說明常備APP、Provider與輸入法法等資訊,就請參考書上的表2-7 ~表2-9,當然也要參考一些2.3到4.2版本變化時所可能發生變動的描述。

在系統啟動的部份,從圖2-6著手瞭解;首先CPU開機或重置之後執行Bootloader程式,其會進行初始化RAM,以載入核心與RAM DISK並跳入核心;初始化核心非常依賴硬體,但它的目的是設定好一切,讓CPU能夠儘快執行C程式碼。一但完成,核心便跳入架構獨立的start_kernel()函式,初始化它的各個子系統,並且開啟呼叫全部內建驅動程式的"init"函式,接著核心便掛載它的根檔案系統,並啟動init行程。這時Android的init介入,並執行/init.rc檔案內得指令,以設定環境變數,建立掛載點,掛載檔案系統,設定OOM調整,並且啟動原生背景處理程序。有很多原生背景處理程序(也就是前述的Native Service)在此時被啟動,但再我們會把焦點放在Zygote;Zygote的工作就是啟動APP,其主要功能就是聚焦於此,好讓所有APP共用的元件都能一致並縮短其啟動時間;但init實際上不直接啟動Zygote,而是使用app_process命令,讓Zygote被Android Runtime啟動,Android Runtime接著啟動系統第一個Dalvik VM,並且要它呼叫Zygote的main()。Zygote啟動System Server,這是Zygote啟動的第一支APP,它以獨立的父行程方式持續存活;接著,System Server開始初始化它所存放的每一個系統服務,並且向之前所啟動的Server Manager註冊它們;它們所開啟的服務之一,Activity Manage,將透過傳送Intent.CATEGORY_HOME型別來結束它的初始化,以啟動Launcher APP。若要對相關程式碼有所瞭解則請參考"第一冊"第三章 深入理解init與"第一冊"第四章 深入理解zygote。

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s