標籤:rod 使用者 ace 指令碼 包含 總結 產生 根目錄 comm
Android源碼編譯學習小結
內容系統源碼編譯
筆者之前在學習安卓系統源碼的編譯,為了能夠印象深刻,粗略的總結了以下內容,希望對我一樣的初學者有一些協助。
系統編譯的初始化指令
對android編譯環境進行初始化很簡單,分為兩步。第一步開啟終端輸入source build/envseup.sh載入所需的檔案。
$ source build/envseup.shincluding device/asusource build/envseup.shs/grouper/vendorsetup.sh including device/asus/tilapia/vendorsetup.sh including device/generic/armv7-a-neon/vendorsetup.sh including device/generic/armv7-a/vendorsetup.sh including device/generic/mips/vendorsetup.sh including device/generic/x86/vendorsetup.sh including device/lge/mako/vendorsetup.sh including device/samsung/maguro/vendorsetup.sh including device/samsung/manta/vendorsetup.sh including device/samsung/toroplus/vendorsetup.sh including device/samsung/toro/vendorsetup.sh including device/ti/panda/vendorsetup.sh including sdk/bash_completion/adb.bash
從命令的輸出可以知道,檔案build/envsetup.sh在載入的過程中,又會在device目錄中尋找那些名稱為vendorsetup.sh的檔案,並且也將它們載入到當前終端來。另外,在sdk/bash_completion目錄下的adb.bash檔案也會載入到當前終端來,它是用來實現adb命令的bash completion功能的。也就是說,載入了該檔案之後,我們在運行adb相關的命令的時候,通過按tab鍵就可以協助我們自動完成命令的輸入。
第二步是執行命令lunch,如下所示:
$ lunch You‘re building on Linux Lunch menu... pick a combo: 1. full-eng 2. full_x86-eng 3. vbox_x86-eng 4. full_mips-eng 5. full_grouper-userdebug 6. full_tilapia-userdebug 7. mini_armv7a_neon-userdebug 8. mini_armv7a-userdebug 9. mini_mips-userdebug 10. mini_x86-userdebug 11. full_mako-userdebug userdata.img:將被掛載為 /data,包含了應用程式相關的資料以及和使用者相關的資料。 12. full_maguro-userdebug 13. full_manta-userdebug 14. full_toroplus-userdebug 15. full_toro-userdebug 16. full_panda-userdebug Which would you like? [full-eng]
我們看到lunch命令輸出了一個Lunch菜單,該菜單列出了當前Android源碼支援的所有裝置型號及其編譯類型。例如,第一項“full-eng”表示的裝置“full”即為模擬器,並且編譯類型為“eng”即為工程機。
當我們選定了一個Lunch功能表項目序號(1-16)之後,按斷行符號鍵,就可以完成Android編譯環境的初始化過程。例如,我們選擇1,可以看到以下輸出:
Which would you like? [full-eng] 1 ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=4.2 TARGET_PRODUCT=full TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a HOST_ARCH=x86 HOST_OS=linux HOST_OS_EXTRA=Linux-3.8.0-31-generic-x86_64-with-Ubuntu-13.04-raring HOST_BUILD_TYPE=release BUILD_ID=JOP40C OUT_DIR=out ============================================
我們可以看到,lunch命令幫我們設定好了很多環境變數。通過設定這些環境變數,就配置好了Android編譯環境。
源碼編譯指令
在執行編譯指令之前,為了確保編譯環境的Api匹配所要編譯的源碼版本,我們會先進行make update-api進行Api更新,在此步驟之中可能會遇到各種問題,請讀者們自行上網搜尋解決,直到更新完成後執行make指令進行編譯,註:對於整個系統源碼編譯,必須在系統源碼根目錄下執行。
在Android編譯系統在編譯過程中,會通過根目錄下的Makefile指令碼載入build/core/main.mk指令碼,接著build/core/main.mk指令碼又會載入build/core/Makefile指令碼,而Android系統鏡像檔案就是由build/core/Makefile指令碼負責打包產生的。
編譯打包過程
- 首先,每個模組對應一個android.mk,對應於各個模組的makefile,該檔案中只需定義一些變數,就能觸發一個模組的編譯,不同模組的編譯方式不同,當然每個模組必須遵守編譯規則;
- 其次,每個模組相互獨立,但是利用include指令可以將各個模組,添加如main.mk檔案中,並有先後順序,最終各個零散的makefile檔案匯聚成最終的makefile檔案;
- 最後,通過以上過程講所有模組編譯打包。
打包的產物
所有的編譯產物都將位於 /out 目錄下,該目錄下主要有以下幾個子目錄:
- /out/host/:該目錄下包含了針對主機的 Android 開發工具的產物。即 SDK 中的各種工具,例如:emulator,adb,aapt 等。
- /out/target/common/:該目錄下包含了針對裝置的共通的編譯產物,主要是 Java 應用代碼和 Java 庫。
- /out/target/product//:包含了針對特定裝置的編譯結果以及平台相關的 C/C++ 庫和二進位檔案。其中,是具體目標裝置的名稱。
- /out/dist/:包含了為多種分發而準備的包,通過“make disttarget”將檔案拷貝到該目錄,預設的編譯目標不會產生該目錄。
編譯產生的鏡像檔案
Build 的產物中最重要的是三個鏡像檔案,它們都位於 /out/target/product// 目錄下。
- system.img:包含了 Android OS 的系統檔案,庫,可執行檔以及預置的應用程式,將被掛載為根分區。
- ramdisk.img:在啟動時將被 Linux 核心掛載為唯讀分區,它包含了 /init 檔案和一些設定檔。它用來掛載其他系統鏡像並啟動 init 進程。
- userdata.img:將被掛載為 /data,包含了應用程式相關的資料以及和使用者相關的資料。
Android源碼編譯