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

在O’REILLY"嵌入式Android系統"這本書的第六章原生使用者空間,本次心得分享本章最後一個議題:Init。

當核心完成初始化裝置驅動程式及自身的內部結構,系統中最重要的任務之一就是初始化使用者空間環境,這是由核心啟動之init行程的工作。在運作原理的部份,參閱書中圖6-1以瞭解init如何與其它Android元件相互整合,當核心啟動後,init基本上會讀取組態檔並將開機標誌顯示到螢幕上,為其特性服務開啟socket,並啟動所有的背景處理程序與服務,init最初所做的事情之一就是檢查它是否被呼叫做為ueventd,接下來建立並掛載/dev/proc與/sys,之後讀取/init.rc與/init.[device_name].rc(在Cubieturck開發板上為init.sun7i.rc)檔案並進行初始化系統,之後init就進入無限迴圈。在組態檔案的部份,控制init行為的主要方式都是透過它的組態檔案,其位址在根目錄(/)下,用DDMS File Explorer進行觀察:

6-3-1

主要就是init.rc與init.sun7i.rc兩個檔案,這兩個檔案分別在Android原始碼中的device/softwinner/wing-common目錄與device/softwinner/sugar-cubietruck目錄中;語義的部份,主要就是說明Android Init Language,Android的官方說明就是在system/core/init/readme.txt檔案(雖然書上有說這個檔案內容並未完全實作):

6-3-2

init的.rc檔案包含一系列落在兩種類型之一的宣告:動作與服務,每一個宣告區段皆以識別出該宣告類型之關鍵字開頭,on針對動作,service針對服務,後面接著該宣告的相關細節,組態檔可以宣告許多的動作與服務,服務宣告只是描述服務並未有實際啟動任何東西,服務通常在某項動作被觸發時啟動或停止,預設的觸發器有以下幾個,書中也說明其執行順序:

6-3-3

而觸發器也可以基於特性,當特性值改變而觸發對應的動作,在動作命令的部份,就參考表6-18與表6-19為init所提供的命令,而服務被以下方式所宣告:

6-3-4

服務選項的部份就請參考表6-20,實際對於init.rc的內容的最快瞭解方式是閱讀init.rc檔案,同時搭配書上語義之說明來瞭解,書中的附錄D就有一份Android 4.2的init.rc,而device/softwinner/wing-common目錄下的init.rc檔案則是開發板上實際運作之版本。在全域特性的部份,運作原理中關於權限的部份就請閱讀system/core/init/property_service.c檔案:

6-3-5

若要為所添加特性來設定其權限就要修改此列表,另外書上有說SDK(Java)所開放的API無法存取全域特性,但NDK(C/C++)則有API可以讀取全域特性(__system_property_get()),但要寫入全域特性並沒有對應的API且會遇到權限的問題,有人幫NDK補上所欠缺的API(如property_get()、property_set(),參考專案:https://github.com/karfield/libcutils4ndk),但在APP端存取全域特性的權限問題就要對Android進行客制化修改(提示:property_service.c檔案中的check_perms()函式);在命名與設定的部份,就需要瞭解一些特定前綴字(ro.*,persist.*,ctrl.*,net.change.*)所代表的涵意,除此之外,你也可以自行定義一組特性;儲存機制的部份,在Android上有很多地方來存放全域特性,分別為建置系統(產生/system/build.prop與/default.prop)、額外的特性檔案、.rc檔案、程式碼與/data/property,詳細就請參考書上的說明。在ueventd部份,init包含處理熱插拔事件的功能,請參考書中圖6-5來瞭解其運作原理,ueventd是最早由預設init.rc啟動服務之一,它讀取主要組態檔/ueventd.rc與/ueventd.[device_name].rc(在Cubietruck開發板上為ueventd.sun7i.rc),重播所有核心的uevent,然後等待與監聽所有未來的uevent,ueventd組態檔的格式相當簡單,如下所示:

6-3-6

開機標誌的部份主要是在討論init開機標誌,書上討論的是一般Android的方式就請自行參閱,在Cubieboard開發板上所使用的A20 SoC針對這部份有提供軟體客制化說明,於下所示:

6-3-7

圖片尺寸須為1280*720,最後就把產生出來的initlogo.rle覆蓋到建置目標的所在目錄(device/softwinner/sugar-cubietruck):

6-3-8

重新編譯以產生Image並將其燒錄至開發板,重新開機後就可以看到init開機標誌已更換為客製化圖片。

廣告

發表迴響

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

WordPress.com Logo

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

Twitter picture

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

Facebook照片

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

Google+ photo

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

連結到 %s