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

在O’REILLY"嵌入式Android系統"這本書的第七章Android Framework,這也是本書的最後一章;前面已經分享"框架入門"的部份,再下來會把剩下的部份作一個心得分享:

※ 實用程序和命令

※ 支援背景處理程序

※ 硬體抽象層

在實用程序和命令部份,主要是介紹一些命令列上可以使用的命,但就如書上所描述的,還是要參照原始碼才能確切瞭解命令的使用方式,原始碼路徑frameworks/base/cmds下的內容:

7-2-1

原始碼路徑frameworks/native/cmds下的內容:

7-2-2

以下都是展示的命令使用常用方式,詳細的內容就請參照書上的描述,請先以adb shell命令來進入命令列。以下先介紹通用目的之實用程序;在service命令,用以下命令確認目前運作的系統服務清單:

7-2-3

dumpsys命令,可以用來查詢系統服務的內部狀態,以下展示的是dumpsys不帶參數的方式,會先印出系統服務清單,然後轉儲它們自己的狀態:

7-2-4

dumpstate命令,可以用於取得整個系統的快照,以下展示不帶任何參數時的情況,它會查尋系統的幾個部份,為你提供系統狀態的完整快照:

7-2-5

rawbu命令用於備份與回復/data內容,以下是它的說明:

7-2-6

再下來介紹的是服務特定的實用程序,這些命令都可以直接跟某些系統服務進行互動;首先看一下am命令,它對應到Activity Manager服務上,由於功能很多,請先確認其線上說明(下圖只是局部):

7-2-7

你可以用am命令來啟動一個程式,如下所示:

7-2-8

pm命令就是對應Package Manager,由於功能很多,請先確認其線上說明(下圖只是局部):

7-2-9

你可以用以下方式列出已安裝套件(下圖只是局部):

7-2-10

安裝APP參考以下畫面:

7-2-11

移除APP參考以下畫面:

7-2-12

svc命令,用以提供數個系統服務的能力,其線上說明於下:

7-2-13

ime命令,可以讓你與Input Method系統服務進行溝通,以控制該系統中使用有效的輸入法,其線上說明於下:

7-2-14

input命令,其與Window Manager系統服務相關,用以注入本文或按鍵事件到系統中,其線上說明於下:

7-2-15

以下是一個範例,模擬按下Home鍵:

7-2-16

monkey命令比較是Android應用開發者所用到的,參考官方網站的UI/Application Exerciser Monkey說明(http://developer.android.com/tools/help/monkey.html);在bmgr命令,是以Backup Manager相關用與控制備份功能的相關行為,其線上說明於下(只是局部):

7-2-17

最後一個命令是stagefright命令,這命令主要是用來與Media Player進行互動,其線上說明於下:

7-2-18

以下展示系統所支援的Audio/Video Codec有那些:
7-2-19

最後介紹的是Dalvia實用程序,這是跳過所有Android之分層,直接控制Dalvia虛擬機器,實際上在嵌入式Android系統上開發不大容易碰到,所以就請參考書上的內容,總共有以下幾個命令:dalvikvmdvzdexdump,其中dvz並不包含在Android 4.2中;另外比較要說明的是dexdump命令,這是用在App程式逆向工程上面,這方面的議題可以參考" Android及ARM原生語言:逆向工程破解Android APP安全"一書。

在支援背景處理程序部份,說明了Android大部份的智能都是實作在系統服務中,但系統服務的一部份作用是作為與原生背景程序溝通的中間物,以下介紹並不會說明梢早所涵蓋的背景程序或者與系統服務沒有繫結的程序。在installd部份,雖然Package Manager服務與工作是管理.apk檔案,但並未具有適當的權限可以履行建立及執行App所需操作,而是依賴於installd,而其起動是由init.rc中以下內容為之:

7-2-20

而其原始碼是在frameworks/base/cmds/installd,其內容如下:

7-2-21

vold部份,是負責處理Mount Service需要的諸多關鍵操作,如掛載與格式化磁碟空間,而其起動是由init.rc中以下內容為之:

7-2-22

vold的部份是以組態檔的方式進行設定,該組態檔都可以在device目錄下的target中找到vold.fstab,其內容於下:

7-2-23

組態設定的相關方式,請參考官網中" Device Specific Configuration"說明(https://source.android.com/devices/tech/storage/config.html)。在netd部份,Network Management Service依賴netd處理重要的網路組態操作,而其起動是由init.rc中以下內容為之:

7-2-24

riid部份,這是與電話部份相關,嵌入式Android系統較少碰觸這個部份,就請參考書上的描述,而其起動是由init.rc中以下內容為之:

7-2-25

在密鑰儲存庫部份,其並不實際為任何系統服務效勞,它被系統的各個不同部份用了儲存與檢索鍵值對,而其起動是由init.rc中以下內容為之:

7-2-26

還有一些其它支援背景處理程式書中就沒有討論,這些部份若有需要就要自行參閱程式碼來做進一步瞭解。

在硬體抽象層的部份,這部份書中只是一頁左右的概述,當然這個議題非常的煩雜而且與硬體有關,概述的部份也請參考書中的敘述;在這邊主要是要分享這個議題的進一步資訊,在HAL這個議題台灣最早是由Jollen老師把整個觀念做一個完整的整理與課程教授,當然若有需要詳細瞭解這個議題可以參加Jollen老師課程;也可以由線上課程進行自修,Jollen老師早期的講義也可以從以下連結下載(本公司不做任何保證 http://pan.baidu.com/wap/shareview?&shareid=177930&uk=18317253&dir=%2FAndroid%2Fandroid%E4%B9%A6%E7%B1%8D%2Fkernel&page=2&num=20&fsid=516718217&third=0http://pan.baidu.com/wap/shareview?&shareid=177930&uk=18317253&dir=%2FAndroid%2Fandroid%E4%B9%A6%E7%B1%8D%2Fkernel&page=2&num=20&fsid=431095649&third=0);至於各硬體在驅動程式或HAL上要如何對應,這部份的資訊在第二章心得分享中有相對應的資訊可供參考。

到此就是書中所有章節與搭配Cubietruck開發板實作的心得分享;書上還有幾個附錄的內容,其中最主要的是附錄B支援新硬體的部份,與附錄C客制化預設套件清單兩個部份。其中附錄B的內容可參考以下網頁 http://www.opersys.com/blog/extending-android-hal ,並可以從GitHub下載到對應的程式碼(https://github.com/opersys/opersys-hal-hw);但主要都針對Android 2.3版所做的,若有興趣可以自行實作看看。作者的這個改法會造成跟標準的Android系統服務不太一樣,變成你要自己產生SDK才能由App呼叫到自己做的服務,衍生出來的問題是在標準CTS驗證會發生失敗。比較正式的做法就要參考Jollen老師的mokoid實作,原始碼在GitHub上(https://github.com/moko365/mokoid)。關於書上的附錄部份就一併心得分享到此,後面本部落格會分享一些Android客制化的方式與不同開發板的原始碼下載與編譯方法的資訊,歡迎對這方面有需求的朋友後續能多多造訪。

廣告

發表迴響

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

WordPress.com Logo

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

Twitter picture

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

Facebook照片

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

Google+ photo

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

連結到 %s