http://www.2cto.com/kf/201208/150878.html

前面分析了Android 4.03编译系统-------envsetup.sh,今天来说lunch命令。

在Android目录下执行了envsetup.sh后,下一部就是执行:lunch。lunch是在envsetup.sh里面定义的函数,函数原型如下:

/**********************************************begin**********************************************/

function lunch()
{
    local answer
    if [ "$1" ] ; then
        answer=$1
    else
        print_lunch_menu
        echo -n "Which would you like? [full-eng] "
        read answer
    fi
    local selection=
    if [ -z "$answer" ]
    then
        selection=full-eng
    elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
    then
        if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
        then
            selection=${LUNCH_MENU_CHOICES[$(($answer-1))]}
        fi
    elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")
    then
        selection=$answer
    fi
    if [ -z "$selection" ]
    then
        echo
        echo "Invalid lunch combo: $answer"
        return 1
    fi
    export TARGET_BUILD_APPS=
    local product=$(echo -n $selection | sed -e "s/-.*$//")
    check_product $product
    if [ $? -ne 0 ]
    then
        echo
        echo "** Don't have a product spec for: '$product'"
        echo "** Do you have the right repo manifest?"
        product=
    fi
    local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")
    check_variant $variant
    if [ $? -ne 0 ]
    then
        echo
        echo "** Invalid variant: '$variant'"
        echo "** Must be one of ${VARIANT_CHOICES[@]}"
        variant=
    fi
    if [ -z "$product" -o -z "$variant" ]
    then
        echo
        return 1
    fi
    export TARGET_PRODUCT=$product
    export TARGET_BUILD_VARIANT=$variant
    export TARGET_BUILD_TYPE=release
    echo
    set_stuff_for_environment
    printconfig
}

/***********************************************end***********************************************/

函数使用 print_lunch_menu 函数将envsetup.sh 设置的LUNCH_MENU_CHOICES变量打印出来,并等待用户的输入,读入用户输入后,将对应数字的字符串赋值给selection, local product=$(echo -n $selection | sed -e "s/-.*$//") ,local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//"),对selection进行处理,得到product以及variant,前者是将selection中最后一个 - 后面的所有内容去掉而得来,后者刚好相反,是将 - 前面的内容去掉,例如:选择了 4,对应:full_stingray-userdebug,则selection = full_stingray-userdebug,product=full_stingray,variant=userdebug,最后设置环境变量TARGET_PRODUCT=$product等。

到这里,我们设置了一个重要的环境变量TARGET_PRODUCT,这个后面多处都是依靠它来寻找编译文件的。接下是两个函数:set_stuff_for_environment,printconfig.

set_stuff_for_environment 设置了一下环境变量,就不进去分析了。重点是printconfig函数,其函数体比较简单:get_build_var report_config,调用了另外一个函数,get_build_var 也比较简单,重要语句:

make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$1

它的意思是执行build/core/config.mk,至于dumpvar-$1,我一直没找到,也不知道是什么意思,有知道的告知一下,多谢!

好了,现在开始进入config.mk文件(其实后面的make命名重复执行,不管了,一步步往下走)。config.mk前面那一堆的变量定义赋值就不说了,直奔重点:

/**********************************************begin**********************************************/
include $(BUILD_SYSTEM)/envsetup.mk
board_config_mk := \
        $(strip $(wildcard \
                $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \
                device/*/$(TARGET_DEVICE)/BoardConfig.mk \
                vendor/*/$(TARGET_DEVICE)/BoardConfig.mk \
        ))
ifeq ($(board_config_mk),)
  $(error No config file found for TARGET_DEVICE $(TARGET_DEVICE))
endif
ifneq ($(words $(board_config_mk)),1)
  $(error Multiple board config files for TARGET_DEVICE $(TARGET_DEVICE): $(board_config_mk))
endif
include $(board_config_mk)
TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))

/**********************************************end**********************************************/

上面这段代码里,有个重要的变量TARGET_DEVICE,它在哪里定义的呢?它在envsetup.mk中定义的,注意,注意,是envsetup.mk,不要和前面的envsetup.sh搞混了,后则位于build/目录下,前者位于build/core/目录下,来看看envsetup.mk,envsetup.mk里面也设置了一大堆的变量,最重要的是:include $(BUILD_SYSTEM)/product_config.mk,

头是不是有点晕了?我也晕了,先整理一下思路:我们是进来寻找TARGET_DEVICE的,前面都没有设置,只能继续跟进了。finally,在product_config.mk中终于找到了TARGET_DEVICE的定义:

/**********************************************begin**********************************************/

ifneq ($(strip $(TARGET_BUILD_APPS)),)
  $(call import-products,$(call get-product-makefiles,\
      $(SRC_TARGET_DIR)/product/AndroidProducts.mk))
else
  $(call import-products, $(get-all-product-makefiles))
endif # TARGET_BUILD_APPS
$(check-all-products)
ifneq ($(filter dump-products, $(MAKECMDGOALS)),)
$(dump-products)
$(error done)
endif

INTERNAL_PRODUCT := $(call resolve-short-product-name, $(TARGET_PRODUCT))
#$(error TARGET_PRODUCT $(TARGET_PRODUCT) --> $(INTERNAL_PRODUCT))
TARGET_DEVICE := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)
#$(error TARGET_DEVICE $(TARGET_DEVICE) --> $(INTERNAL_PRODUCT))

/***********************************************end***********************************************/

在分析TARGET_DEVICE之前,先说明一下前面的一小段代码,也是很重要的。TARGET_BUILD_APPS等于空,所以执行else分支,$(call import-products, $(get-all-product-makefiles))是读取所有的AndroidProducts.mk,并将其中定义的PRODUCT_MAKEFILES变量都赋值给PRODUCT变量,后面的操作都是在PRODUCT里面寻找需要的文件。好了现在开始分析TARGET_DEVICE。
         首先,是INTERNAL_PRODUCT,TARGET_PRODUCT是前面定义的,至于函数resolve-short-product-name,定义再produck.mk文件中,我是没怎么看懂,我也没打算看懂了,因为有个好方法可以知道结果,可以将上面的两个error 打开,这样就能知道结果了:

$(error TARGET_PRODUCT $(TARGET_PRODUCT) --> $(INTERNAL_PRODUCT))  ,输出如下:

TARGET_PRODUCT full_stingray --> device/moto/stingray/full_stingray.mk。

经过测试,根据TARGET_PRODUCT=full_stingray寻找full_stingray.mk的条件是:full_stingray.mk文件中的

PRODUCT_NAME == TARGET_PRODUCT

$(error TARGET_DEVICE $(TARGET_DEVICE) --> $(INTERNAL_PRODUCT)), 输出如下:

TARGET_DEVICE stingray--> device/moto/stingray/full_stingray.mk。

经过测试,TARGET_DEVICE 等于 full_stingray.mk 中的PRODUCT_DEVICE。
          好了目标找到了,终于可以回去了,我们回到config.mk文件中:

/**********************************************begin**********************************************/
include $(BUILD_SYSTEM)/envsetup.mk
board_config_mk := \
        $(strip $(wildcard \
                $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \
                device/*/$(TARGET_DEVICE)/BoardConfig.mk \
                vendor/*/$(TARGET_DEVICE)/BoardConfig.mk \
        ))
ifeq ($(board_config_mk),)
  $(error No config file found for TARGET_DEVICE $(TARGET_DEVICE))
endif
ifneq ($(words $(board_config_mk)),1)
  $(error Multiple board config files for TARGET_DEVICE $(TARGET_DEVICE): $(board_config_mk))
endif
include $(board_config_mk)
TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))

/**********************************************end**********************************************/

board_config_mk 根据千辛万苦得来的TARGET_DEVICE来寻找BoardConfig.mk,里面是一些cpu级别的配置。

终于把lunch的主线说完了,后面的make就简单得多了,因为make做了很多重复的操作。

Android 4.03 编译系统------lunch相关推荐

  1. Android 编译系统分析之lunch分析

    已开通新的博客,后续文字都会发到新博客 http://www.0xfree.top Android 编译系统解析系列文档 编译系统入口envsetup.sh解析 source build/envset ...

  2. android系统源码的环境下用make来编译,Android源码编译系统入门

    做过 Android 平台开发的朋友对make,mm或make clean命令应该很熟悉,但也许大家只是熟知这些命令的作用却不知道这些命令底下有些什么原理?那么今天我就带着大家推开Android编译系 ...

  3. 【Bash百宝箱】Android envsetup.sh及lunch

    文章目录 1.envsetup.sh 2.lunch 3.make 在Android开发环境中编译一个目标时,一般要执行下面三行命令: $ . build/envsetup.sh $ lunch &l ...

  4. Android复习03(Get请求访问网络[详解]、获取文章列表)

    2020年3月26日 第6周 星期四 https://ke.qq.com/webcourse/index.html#cid=989760&term_id=101085595&taid= ...

  5. 《教我兄弟学Android逆向03 破解第一个Android游戏 》

    上一篇 <教我兄弟学Android逆向02  破解第一个Android程序  >我带着你破解了我们自己编的一个小程序 里面我分析并讲解的一些smali语法你都记住了 给你布置的课后作业你发 ...

  6. 基于深度学习lstm_深度学习和基于LSTM的恶意软件分类

    基于深度学习lstm Malware development has seen diversity in terms of architecture and features. This advanc ...

  7. 基于深度学习lstm_基于LSTM的深度恶意软件分析

    基于深度学习lstm Malware development has seen diversity in terms of architecture and features. This advanc ...

  8. Android编译系统Makefile

    编译系统Makefile Android平台的编译系统,其实就是用Makefile写出来的一个独立项目.它定义了编译的规则,实现了"自动化编译",不仅把分散在数百个Git库中的代码 ...

  9. Android编译系统中的Kconfig,Makefile,.config编译系统浅析

    在对Android进行编译时,用的就是Linux下的Makefile和Kconfig编译系统,对整个系统进行编译.当然还包括很多配置命令,比如make defconfig, make oldconfi ...

最新文章

  1. Socketserver 笔记
  2. 父亲和女儿同为互联网大佬, 但不幸都得癌症
  3. tcl脚本学习十一:proc应用 (带默认参数)
  4. goldengate 故障及解决方法汇总
  5. 【Linux】一步一步学Linux——exec命令(208)
  6. 添加Godaddy二级域名子域名方法
  7. BXNA在调试显示新闻的JS?
  8. 【数据结构与算法】【算法思想】动态规划
  9. Redis使用过程出现类型转换异常问题- 20190220
  10. 第一个程序 快速编译链接的办法
  11. 优酷的多页画在同一窗口打开效果。
  12. 任意给定一个正整数N,求一个最小的正整数M(M1),使得N*M的十进制表示形式里只含有1和0。...
  13. div+css 背景图片的定位取图问题详解
  14. chrome提示安装unity web player
  15. 二维分类教案_大班数学活动二维分类
  16. 地图坐标转换-火星坐标
  17. 得胃病者的饮食原则 养胃及食疗菜谱介绍做法
  18. Java将html转换成pdf、html转换成图片
  19. 计算机二级新题word,计算机二级word试题最新.pdf
  20. 如何在局域网内让自己电脑的文件被其他电脑访问

热门文章

  1. 安装MeadCo ScriptX的ActiveX控件
  2. 致同助力国企改革不断迈出实质性步伐
  3. 峰哥读者高中学历,被忽悠去培训大数据。。
  4. TensorFlow-GPU框架详细安装
  5. 找工作总结(微电子、FPGA方向)
  6. PPTV免费会员赠送活动
  7. Ktor: Kotlin Web后端框架 快速开始入门
  8. python导入库的方式有几种_python库导入的三种方式
  9. windows 2008r2 系统开机重启出现 系统恢复 的解决方案
  10. 江苏linux系统自考试卷,【历年真题】2020年8月江苏自考专科《操作系统概论》真题与答案...