Android 系統編譯流程

前言

老早都想了解android到底是如何從代碼到系統安裝包的,可是因爲技術太菜。最近恰好看到別人寫如何構建系統,這裏整理下流程,並且學習一些基礎的知識。

正文

首先我們如何編譯系統,這裏我們很容易找到,主要是下載源碼,這裏我們暫時不要糾結,假如我們repo下一套源代碼,我們需要編譯系統
1

$. ./build/envsetup.sh

2

$lunch full-eng

3

$make

就會在out文件夾下生成系統安裝包,
這裏這幾個指令到底如何實現的,我們慢慢分析。
首先第一個. ./build/envsetup.sh,這個幹了什麼呢?我們很容易看到這種shell腳本執行方式,是在當前shell中執行,也就是所有的函數都對於當前調用可見。見博客shell腳本的幾種執行方式。所以在執行完這個腳本語言後,裏面所有的方法都可以使用。那我們還是進入代碼閱讀。因爲這是腳本。所以方法都不會執行,單行的語句纔會被調用,我們來看我們的真正的類似main()函數。

VARIANT_CHOICES=(user userdebug eng)  #初始化一個數組,這是系統默認的構建的三個版本。
unset LUNCH_MENU_CHOICES   #刪除整個數組。
#這裏纔是真的添加默認的,編譯版本。
add_lunch_combo aosp_arm-eng
add_lunch_combo aosp_arm64-eng
add_lunch_combo aosp_mips-eng
add_lunch_combo aosp_mips64-eng
add_lunch_combo aosp_x86-eng
add_lunch_combo aosp_x86_64-eng
#這個是調用_lunch函數來對lunch命令自動補全,這個我也不太懂,complete命令還是不太常用的。
complete -F _lunch lunch

#終於迎來了我們最關鍵的main函數
#判斷是不是用的bash
if [ "x$SHELL" != "x/bin/bash" ]; then
    case `ps -o command -p $$` in
        *bash*)
            ;;
        *)
            echo "WARNING: Only bash is supported, use of other shell would lead to erroneous results"
            ;;
    esac
fi

# Execute the contents of any vendorsetup.sh files we can find.首先要在根目錄,不然test不會通過,然後find命令得到,vendorsetup,然後調用這個shell腳本。
for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null`
do
    echo "including $f"
    . $f
done
unset f
#這個是檢查版本信息。還有加上adb的自動補全命令。這裏不再相信介紹。
addcompletions

註釋中還是比較清晰,這裏我們不過多解釋,我們還是回到我們執行的vendorsetup.sh的腳本中。

add_lunch_combo full_maguro-userdebug

發現很明白,和上面講的基本一致,也是添加給編譯選項。我們還是選擇這個函數看看。

function add_lunch_combo()
{
    local new_combo=$1
    local c
    for c in ${LUNCH_MENU_CHOICES[@]} ; do
        if [ "$new_combo" = "$c" ] ; then
            return
        fi
    done
    LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)
}

這個函數很簡單,就是判斷LUNCH_MENU_CHOICES是否包含添加的項有的話什麼也不幹。沒有在數組中添加一項。至此我們已經把我們所有需要的函數都添加到環境變量中。並且得到一個正常的LUNCH_MENU_CHOICES,
編譯環境已經更新成功。然後開始lunch啦!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章