function help()function get_abs_build_var()function get_build_var()function check_product()function check_variant()function setpaths()function printconfig()function set_stuff_for_environment()function set_sequence_number()function settitle()function choosetype()function chooseproduct()function choosevariant()function tapas()function choosecombo()function print_lunch_menu()function lunch()function gettopfunction m()function findmakefile()function mm()function mmm()function croot()function pid()function gdbclient()function jgrep()function cgrep()function resgrep()function getprebuiltfunction tracedmdump()function runhat()function getbugreports()function startviewserver()function stopviewserver()function isviewserverstarted()function smoketest()function runtest()function runtest_py()function godir ()
function choosecombo(){
choosesim $1 // choosesim以及后续的choosetype都是本文件定义的一个函数echoechochoosetype $2echoechochooseproduct $3echoechochoosevariant $4echoset_stuff_for_environmentprintconfig
chooseproduct()}执行该函数后会依次进行如下选择:Build for the simulator or the device?1. Device2. SimulatorWhich would you like? [1]Build type cBuild type choices are:1. release2. debugWhich would you like? [1]Product choices are:1. emulator2. generic3. sim4. littletonYou can also type the name of a product if you know it.Which would you like? [littleton]Variant choices are:1. user2. userdebug3. engWhich would you like? [eng] user默认选择以后会出现:TARGET_PRODUCT=littletonTARGET_BUILD_VARIANT=userTARGET_SIMULATOR=falseTARGET_BUILD_TYPE=releaseTARGET_ARCH=armHOST_ARCH=x86HOST_OS=linuxHOST_BUILD_TYPE=releaseBUILD_ID=
配置环境变量TARGET_PRODUCT。会提示用户选择release或debug。然后调用set_stuff_for_environment设置。choices=(`/bin/ls build/target/board/*/BoardConfig.mk vendor/*/*/BoardConfig.mk 2> /dev/null`)读取 build/target/board/* 目录下的板配置文件:BoardConfig.mk读取 vendor/*/*/目录下的板配置文件:BoardConfig.mkchoices 的值为:build/target/board/emulator/BoardConfig.mkbuild/target/board/generic/BoardConfig.mkbuild/target/board/sim/BoardConfig.mkvendor/marvell/littleton/BoardConfig.mk经过:for choice in ${choices[@]}do# The product name is the name of the directory containing# the makefile we found, above.prodlist=(${prodlist[@]} `dirname ${choice} | xargs basename`)done的处理,prodlist的值为:emulator generic sim littleton所以选择菜单为:Product choices are:1. emulator2. generic3. sim4. littleton如果选择 4,那么 TARGET_PRODUCT 被赋值为: littleton。board_config_mk := \$(strip $(wildcard \$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \vendor/*/$(TARGET_DEVICE)/BoardConfig.mk \))
lunch函数提供了一个菜单,让开发人员选择需要编译的目标产品(target product)和变体(variant),并做一些检查,设置环境变量,并打印出主要的环境变量。直接运行lunch(必须先运行 build/envsetup.sh,让lunch函数驻留到环境变量中)alex@alex-Vostra3400:~/share/Marvell/m4sp3$ lunchYou're building on LinuxLunch menu... pick a combo:1. generic-eng2. simulatorWhich would you like? [generic-eng] dkb-eng============================================PLATFORM_VERSION_CODENAME=RELPLATFORM_VERSION=2.3.7TARGET_PRODUCT=dkbTARGET_BUILD_VARIANT=engTARGET_SIMULATOR=falseTARGET_BUILD_TYPE=releaseTARGET_BUILD_APPS=TARGET_ARCH=armHOST_ARCH=x86HOST_OS=linuxHOST_BUILD_TYPE=releaseBUILD_ID=GWK74============================================
用户也可以直接输入参数,不使用菜单alex@alex-Vostra3400:~/share/Marvell/m4sp3$ lunch dkb-eng
下面是lunch函数源代码,用蓝色添加了一下注释,便于阅读:function lunch(){local answerif [ "$1" ] ; then # lunchanswer=$1else # lunch 后面不带参数,则打印出所有的target product和variant菜单提供用户选择print_lunch_menuecho -n "Which would you like? [generic-eng] "
read answerfilocal selection=if [ -z "$answer" ] # 如果用户在菜单中没有选择,直接回车,则为系统缺省的generic-engthenselection=generic-engelif [ "$answer" = "simulator" ] # 如果是模拟器thenselection=simulatorelif (echo -n $answer | grep -q -e "^[0-9][0-9]*$") # 如果answer是选择菜单的数字,则获取该数字对应的字符串
thenif [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]thenselection=${LUNCH_MENU_CHOICES[$(($answer-$_arrayoffset))]}fielif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$") # 如果answer字符串匹配*-*模式(*的开头不能为-)thenselection=$answerfiif [ -z "$selection" ]thenechoecho "Invalid lunch combo: $answer"return 1fi# special case the simulatorif [ "$selection" = "simulator" ]then模拟器模式#export TARGET_PRODUCT=simexport TARGET_BUILD_VARIANT=engexport TARGET_SIMULATOR=trueexport TARGET_BUILD_TYPE=debugelse将 product-variant模式种的product分离出来#local product=$(echo -n $selection | sed -e "s/-.*$//")检查之,调用关系 check_product()->get_build_var()->build/core/config.mk比较罗嗦,不展开了#check_product $productif [ $? -ne 0 ]thenechoecho "** Don't have a product spec for: '$product'"echo "** Do you have the right repo manifest?"product=fi将 product-variant模式种的variant分离出来#local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")检查之,看看是否在 (user userdebug eng) 范围内#check_variant $variantif [ $? -ne 0 ]thenechoecho "** Invalid variant: '$variant'"echo "** Must be one of ${VARIANT_CHOICES[@]}"variant=fiif [ -z "$product" -o -z "$variant" ]thenechoreturn 1fiexport TARGET_PRODUCT=$productexport TARGET_BUILD_VARIANT=$variantexport TARGET_SIMULATOR=falseexport TARGET_BUILD_TYPE=releasefi # !simulatorecho设置到环境变量,比较多,不再一一列出,最 简单的方法 set >env.txt 可获得#set_stuff_for_environment打印一些主要的变量, 调用关系 printconfig()->get_build_var()->build/core/config.mk->build/core/envsetup.mk 比较罗嗦,不展开了#printconfig}
列出make脚本中某变量的值,前缀是当前路径。ref dumpvar.mk使用方法:get_abs_build_var VAR_NAMEVAR_NAME是需要显示的make脚本中的变量。例如:alex@alex-Vostra3400:~/share/Marvell/m4sp3$ get_abs_build_var TARGET_PRODUCT
返回
/home/alex/share/Marvell/m4sp3/dkb
列出make脚本中某变量的值。ref dumpvar.mk
与上一个命令的区别是没有前缀。
Usage:
get_build_var VAR_NAME
VAR_NAME是需要显示的make脚本中的变量。
Return:
<VAR_NAME Value>
例如:alex@alex-Vostra3400:~/share/Marvell/m4sp3$ get_build_var TARGET_PRODUCT
返回
dkb
检查指定的TARGET_PRODUCT是否允许,默认的有sim和generic。如果不允许,则输出错误信息,允许则无回显。check_variant
Usage:
check_product <YourTargetProduct>
Example:
check_product generic
setpaths
检查variant是否支持,支持则返回0,不支持则返回1。允许的variant列表定义在envsetup.sh中的 VARIANT_CHOICES中,默认是user,userdebug,eng。定制android时,可以在VARIANT_CHOICES中添加 vairant。
Usage:
check_variant <YourVariant>
Example:
check_variant eng
printconfig
奇次执行时,将ANDROID_BUILD_PATHS路径加到PATH中。偶次执行时,将ANDROID_BUILD_PATHS路径从 PATH中去除。ANDROID_BUILD_PATHS包括android编译中要使用到的路径,例如 ANDROID_EABI_TOOLCHAIN,ANDROID_TOOLCHAIN,ANDROID_QTOOLS,ANDROID_JAVA_TOOLCHAIN,ANDROID_PRODUCT_OUT 等等。
Usage:
setpaths
set_stuff_for_environment
输出类似如下形势的配置信息。
============================================
PLATFORM_VERSION_CODENAME=AOSP
PLATFORM_VERSION=AOSP
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=OPENMASTER
============================================
set_sequence_number
依次调用settitle, set_java_home,setpaths,set_sequence_number。设置android编译需要的环境变量。
settitle
输出环境变量BUILD_ENV_SEQUENCE_NUMBER。
choosesim
设置shell的prompt提示,PROMPT_COMMAND中加入TARGET_PRODUCT,TARGET_BUILD_VARIANT,和TARGET_BUILD_APPS等信息提示。
choosetype
配置环境变量TARGET_SIMULATOR。linux下会提示用户选择device或simulator。然后调用set_stuff_for_environment设置。
add_lunch_combo
配置环境变量TARGET_BUILD_TYPE_SIMULATOR。会提示用户选择release或debug。然后调用set_stuff_for_environment设置。
向环境变量LUNCH_MENU_CHOICES标识的列表中添加项。envsetup.sh中默认添加了full-eng,full_x86-eng,和simulator。print_lunch_menu
tapas
列出LUNCH_MENU_CHOICES中的所有选项。
用户给定variant和一个或多个app name,就是LOCAL_PACKAGE_NAME的名字。tapas设定gettop
export TARGET_PRODUCT=generic
export TARGET_BUILD_VARIANT=$variant
export TARGET_SIMULATOR=false
export TARGET_BUILD_TYPE=release
export TARGET_BUILD_APPS=$apps
Usage:
tapas <YourVariant>? <YourAppName>*
?代表可选,*代表0个,1个或多个。YourVariant 和YourAppName的次序可颠倒。
Example:
tapas user Calculator Calender
m
返回当前android代码树的顶层路径。前提是当前路径位于android代码树中。
findmakefile
等价于在当前android代码树的顶层路径下执行make命令。
mm
查找当前或最接近自己的祖辈路径上的Android.mk,返回Android.mk的路径,假设当前路径处于android代码树中。
mmm
如果当前路径是代码树顶层,则mm相当于make。如果是深层,测mm相当于ONE_SHOT_MAKEFILE=$M make -C $T files $@
$M是findmakefile发现的Android.mk,$T是代码树顶层路径,files是main.mk中定义的phony goal,就是完成$M对应目录范围内,所有android需编译的modules以及辅助说明txt文件。
croot
给定package的路径,则mm会make相应的package。
例如,mmm package/apps/Calculator
cproj
改变当前路径到代码树顶层。
pid
改变当前路径到最近的还有Android.mk文件的祖父辈路径。
systemstack
使用adb shell ps命令列出手机上指定名字的进程的pid。
Usage:
pid <YourName>
gdbclient
使用kill -3system_server将系统进程中的线程信息写入/data/anr/traces.txt。
sgrep
建立gdb调试环境,包括两步,手机上运行gdbserver,本机上运行arm-eabi-gdb。
Usage:
gdbclient <EXE> <PORT> <AppName>EXE: AppName的执行名。
PORT:gdbserver的端口,例如, 192.168.2.102:5039
AppName:手机中ps列出的app名字,据此查pid。
jgrep
查找当前目录及子目录中所有.c,.h,.cpp,.S,.java,.mk,.xml,.sh文件,即源码文件中包含特定单词的行,并颜色显示输出。
Usage:
sgrep <YourWord>
Example:
sgrep Calendar
cgrep
同sgrep,但只查.java文件。
resgrep
同sgrep,但只查c相关的文件,即.c,.cc,.cpp,.h文件。
mgrep
同sgrep,但只查res相关的.xml文件。
treegrep
同sgrep,但只查make相关的脚本文件,包括Makefile文件,Makefile目录下的所有文件,.make文件,.mak文件和.mk文件。
getprebuilt
查找当前目录及子目录中所有.c,.h,.cpp,.S,.java,.xml文件,即源码文件中包含特定单词的行,并颜色显示输出。
tracedmdump
输出prebuilt的路径。
runhat
生成dexlist文件qtrace.dexlit,dmtrace数据文件dmtrace,和调用dmtracedump工具生成的dmtrace解析文件dmtrace.html,将生成文件放到指定路径。
Usage:
tracedmdump <YourDirName>
如果YourDirName中不含’\’,则将放置的路径是$ANDROID_PRODUCT_OUT/traces/YourDirName。
getbug reports
貌似使用kill -10的方法得到heap dump并取到本地。使用hat以http方式展现出来。hat可能是个lightweight http server,不曾用过。
startviewserver
将手机/sdcard/bugreports目录下的文件下载到本地并压缩打包。
stopviewserver
用指定端口启动viewserver。
Usage:
startviewserver <Port>
不指定端口,则默认4939。
isviewserverstarted
关闭viewserver。
smoketest
检查viewserver是否可用。
runtest
编译smoketest并安装手机运行。
godir
运行development/testrunner/runtest.py $@
set_java_home
给出一个词,godir会输出一个路径列表供用户选择要进入的路径。路径列表包含的路径满足,路径名中包含这个词,或这路径下的文件有文件名含这个词。out/路径下不考虑。
Usage:
godir <YourKey>
Usage:
godir Calculator
设置JAVA_HOME环境变量为/usr/lib/jvm/java-6-sun。