Android 系统编译流程

来源:互联网 发布:'淘宝账户手机无法登陆 编辑:程序博客网 时间:2024/05/19 18:37

前言

老早都想了解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-engadd_lunch_combo aosp_arm64-engadd_lunch_combo aosp_mips-engadd_lunch_combo aosp_mips64-engadd_lunch_combo aosp_x86-engadd_lunch_combo aosp_x86_64-eng#这个是调用_lunch函数来对lunch命令自动补全,这个我也不太懂,complete命令还是不太常用的。complete -F _lunch lunch#终于迎来了我们最关键的main函数#判断是不是用的bashif [ "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"            ;;    esacfi# 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"    . $fdoneunset 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啦!!!

0 0
原创粉丝点击