Android7.0 编译系统流程分析

本文详细分析了Android 7.0的编译过程,包括source、lunch和make三个主要步骤。source流程涉及envsetup.sh的加载、编译模式定义、vendorsetup.sh的处理等;lunch流程讲解了用户选择编译目标的处理,包括选择验证、环境变量设定等;make流程则探讨了编译入口、依赖解析及JACK编译器的使用。通过对整个编译系统的剖析,揭示了Android系统构建的底层逻辑。
摘要由CSDN通过智能技术生成

本文按照Android编译三部曲(source,lunch和make)的步骤来分析查看每个环节的主要流程,由于编译系统太过庞大,这里只是从关键的主干流程上做一个分析,不可能做到每个细节都剖析清楚,由于水平有限,如果有描述不够正确的地方,欢迎大家毫无保留的指正错误,在此先谢过。


1,source流程

当我们在终端执行命令source build/envsetup.sh时,其实是完整的加载了脚本envsetup.sh中的变量和方法,其中最重要的函数比如lunch就是在这一步加载到shell环境变量中去的,比较常用的函数有:

croot

切换到源码树的根目录

lunch

选择编译板型

m

在源码树的根目录执行 make

mm

build 当前目录下的模块

mmm

build 指定目录下的模块

cgrep

在所有 C/C++ 文件上执行 grep

jgrep

在所有 Java 文件上执行 grep

resgrep

在所有 res/*.xml 文件上执行 grep

godir

转到包含某个文件的目录路径

printconfig

显示当前 Build 的配置信息

add_lunch_combo

在 lunch 函数的菜单中添加一个条目

除了加载上述函数,还执行了以下初始化和动作:

1>    提前定义3种编译模式,供后面使用:

139 VARIANT_CHOICES=(user userdebug eng)

说明:数字139是这行代码在文件中的行号,下面的也是如此。


2>    使用变量LUNCH_MENU_CHOICES之前,先将它清空:

 

503 unset LUNCH_MENU_CHOICES

3>    默认会加载如下6个板型选项,这样后续的lunch菜单中就可以看到这几个板型: 

 517 add_lunch_combo aosp_arm-eng
 518 add_lunch_combo aosp_arm64-eng
 519 add_lunch_combo aosp_mips-eng
 520 add_lunch_combo aosp_mips64-eng
 521 add_lunch_combo aosp_x86-eng
 522 add_lunch_combo aosp_x86_64-eng

下面就看看函数add_lunch_combo的实现:

 504 function add_lunch_combo()
 505 {
 506     local new_combo=$1
 507     local c
 508     for c in ${LUNCH_MENU_CHOICES[@]} ; do  
 509         if [ "$new_combo" = "$c" ] ; then
 510             return
 511         fi
 512     done
 513     LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)  //这里把板型添加到数组中去了
 514 }

处理逻辑就是先从LUNCH_MENU_CHOICES中循环查找,看存不存在要添加的板型,如果存在就直接返回,如果不存在就添加到LUNCH_MENU_CHOICES中;除了上述添加的aosp的6个板型外,在device/actions/目录中还有大量的add_lunch_combo的调用,部分摘录如下:

./device/actions/s900_evb/vendorsetup.sh:add_lunch_combo s900_evb-eng
./device/actions/s900_evb/vendorsetup.sh:add_lunch_combo s900_evb-userdebug
./device/actions/s900_evb/vendorsetup.sh:add_lunch_combo s900_evb-user
./device/actions/v700_gb7_nibiru/vendorsetup.sh:add_lunch_combo v700_gb7_nibiru-eng
./device/actions/v700_gb7_nibiru/vendorsetup.sh:add_lunch_combo v700_gb7_nibiru-userdebug
./device/actions/v700_gb7_nibiru/vendorsetup.sh:add_lunch_combo v700_gb7_nibiru-user
./device/actions/v700_cxvr/vendorsetup.sh:add_lunch_combo v700_cxvr-eng
./device/actions/v700_cxvr/vendorsetup.sh:add_lunch_combo v700_cxvr-userdebug
./device/actions/v700_cxvr/vendorsetup.sh:add_lunch_combo v700_cxvr-user
./device/actions/s900_96board/vendorsetup.sh:add_lunch_combo s900_96board-eng
./device/actions/s900_96board/vendorsetup.sh:add_lunch_combo s900_96board-userdebug
./device/actions/s900_96board/vendorsetup.sh:add_lunch_combo s900_96board-user

这些全部都是在板型目录中的vendorsetup.sh脚本中写明的,脚本何时被调用的呢?【留个问题在此】


4>    下面这行的意思是,当敲入lunch命令后用Tab键进行补全时,会执行_lunch()函数:

 630 complete -F _lunch lunch

马上实践一下,发现敲完lunch后按Tab键补全果然会有东西打印出来:

aosp_angler-userdebug            gt9_ebox-user                    s900_96board_sd0_boot-eng        s900_evb_sd0_boot-eng            s900vr_ys_2k-eng
aosp_arm-eng                     gt9_ebox-userdebug               s900_96board_sd0_boot-user       s900_evb_sd0_boot-user           s900vr_ys_2k-user
aosp_arm64-eng                   hikey-userdebug                  s900_96board_sd0_boot-userdebug  s900_evb_sd0_boot-userdebug      s900vr_ys_2k-userdebug
aosp_bullhead-userdebug          m_e_arm-userdebug                s900_RY_VR-eng                   s900_qcb-eng                     v700_cxvr-eng
aosp_dragon-eng                  m_e_mips-userdebug               s900_RY_VR-user                  s900_qcb-user                    v700_cxvr-user
aosp_dragon-userdebug            m_e_mips64-eng                   s900_RY_VR-userdebug             s900_qcb-userdebug               v700_cxvr-userdebug
aosp_flounder-userdebug          mini_emulator_arm64-userdebug    s900_evb-eng                     s900_tpe-eng                     v700_gb7_nibiru-eng

那就看看函数_lunch的实现:

<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值