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

在O’REILLY"嵌入式Android系統"這本書的第四章建置系統是以仿真器做為標的,先前我們已經介紹過開發板與第五章的內容;所以再下來我們就不會以仿真器做為標的,而以Cubietruck開發板做為實作的目標。再下來介紹的內容都開始在實機上進行操作,就請各位準備好Android開發環境(Ubuntu)與Cubietruck開發板。由於內容很多,這章也是分段來分享;本次大綱於下:

◎    與其他建置系統相比

◎    架構

在與其他建置系統相比部份,從第三章的驗證就可以知道Android建置系統不同於傳統的Embedded Linux建置環境(Ex. Buildroot),也不依賴遞迴式的Makefile;而是有個命令搞會探索全部的目錄與子目錄,直到找到Android.mk;Android是指定本地"模組"如何被建置Android.mk檔案。以下是Cubietruck開發板Android Source Code內的模組數目:

4-1-1

Android依賴一組經由envsetup.sh與lunch自動被設定為命令殼環境一部份,或者事先在buildspec.mk檔案中以靜態方式定義的變數。此外,建置系統建立了一個out/目錄,當中儲存了它所生成的一切;只要移除out/目錄即可清除被建置出來的東西。

在架構部份,瞭解建置系統的切入點就是build/core/目錄下的main.mk檔案,這透過最上層的makefile而被呼叫;build/core/目錄實在上包含建置系統的大部份,後面書上會說明裏面的一些關鍵性檔案。Android建置系統將一切集中到單一的makefile,而不是以遞迴方式進行,所看到的每一個.mk檔案最後都會變更單一的巨大makefile的一部份,該makefile包含建置整個系統之所有片段的一切規則;建置系統的關係就參考圖4-1。建置系統最初所做的工作之一就是透過包含config.mk引進建置組態,建置可以透過envsetup.sh與lunch指令,或者是透過最上層的buildspec.mk檔案而備組態;當中的變數有:TARGET_PRODUCT(generic , full …)、TARGET_BUILD_VARIANT(eng, userdebug, user)、TARGET_BUILD_TYPE(release, debug)、TARGET_TOOLS_PREFIX、OUT_DIR與BUILD_ENV_SEQUENCE_NUMBER;除了選擇要建置AOSP的哪些部份以及要用什麼選項建置他們之外,建置系統還必須瞭解它針對什麼target來建置的,這透過BoardConfig.mk檔案來提供,並指定相關參數;再此,看一下device/softwinner/sugar-cubietruck目錄的內容,就可以看到BoardConfig.mk的存在:

4-1-2

關於組態的最後一塊拼圖就是用來建置Android的CPU特定選項,就ARM而言都包含在build/core/combo/arch/arm目錄下:

4-1-3

接下來看envsetup.sh,它除了提供Android建置環境外,還定義了一系列對任意類型之AOSP工作有用的命令,書中的部份就不在贅述;來看一下於Cubietruck開發板Android Source Code的lunch項目:

4-1-4

suager_cubietruck-eng項目來說,項目命令稿(vendorsetup.sh)放在device/softwinner/sugar-cubietruck目錄中,其內容如下:

4-1-5

建置系統在definitions.mk檔案中定義大量函式,該檔案在build/core目錄下可以看到;這些函式擔任中心程式庫的角色,有時更直接被運用在模組的Android.mk檔案中。再下來就稍微檢視一下主要Make配方,檔案在build/core目錄下的Makefile檔案,細節就請參閱書上的描述。而關於清理的部份,make clean就相當於刪除整個out/目錄;至於installclean命令不清除整個out/目錄,而只清理在給定combo組態改變下需要重新建置的部份。接下來談到建置模板的部份,主要瞭解表4-2,以及在Android.mk是透過include指令存取它;在此參考實際的Android.mk來瞭解模組建置模板,以下是"tinyalsa"模組Android.mk的一部份:

4-1-6

BUILD_SHARED_LIBRARY就是建置模板;在此也要瞭解一下LOCAL_*變數以其所代表的意義,由於官方文件以不復存在,就請閱讀書中所列的項目及其說明。這個段落最後說明輸出的部份,建置輸出在三個階段與兩個模式下運作,一個是主機模式,一個是target模式;三階段分別於下:1. 中間物是使用模組原始碼產生,這些中間物的格式與位置取決於模組的原始碼;2.中間物為建置系統所利用,以建立實際位元碼檔案與套件;位元碼檔案和套件組合成建置系統所要求的輸出;而out/主要的的兩個目錄是反應於運作模式(主機模式的host/與target模式的target/):

4-1-7

最終我們關心的目錄是out/target/product/sugar-cubietruck

4-1-8

可以與書中表4-3做個相互比對。

發表留言