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