前言
老早都想了解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啦!!!