build/envsetup.sh 简介

每次进入到android source目录后的第一件事恐怕就是先执行. build/envsetup.sh,完成一些命令的初始化,今天主要分析envsetup.sh。

1. 命令-也就是envsetup.sh中的函数

function help()                   # 显示帮助信息
function get_abs_build_var()           # 获取绝对变量
function get_build_var()              # 获取绝对变量
function check_product()             # 检查product
function check_variant()              # 检查变量
function setpaths()                # 设置文件路径
function printconfig()               # 打印配置
function set_stuff_for_environment()        # 设置环境变量
function set_sequence_number()          # 设置序号
function settitle()                  # 设置标题
function choosetype()               # 设置type
function chooseproduct()              # 设置product
function choosevariant()               # 设置variant
function tapas()                    # 功能同choosecombo
function choosecombo()             # 设置编译参数
function add_lunch_combo()           # 添加lunch项目
function print_lunch_menu()           # 打印lunch列表
function lunch()                  # 配置lunch
function m()                   # make from top
function findmakefile()              # 查找makefile
function mm()                  # make from current directory
function mmm()                 # make the supplied directories
function croot()                 # 回到根目录
function cproj()
function pid()
function systemstack()
function gdbclient()
function jgrep()                 # 查找java文件
function cgrep()                  # 查找c/cpp文件
function resgrep()
function tracedmdump()
function runhat()
function getbugreports()
function startviewserver()
function stopviewserver()
function isviewserverstarted()
function smoketest()
function runtest()
function godir ()                  # 跳到指定目录

 

# add the default one here
add_lunch_combo generic-eng

 

# Execute the contents of any vendorsetup.sh files we can find.
for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/build/vendorsetup.sh 2> /dev/null`
do
    echo "including $f"
    . $f
done

-------------------------------------------------------------------------------------------------------------------------

build/envsetup.sh提供了几个有用的shell命令,使用
$. build/envsetup.sh

可以引入到shell环境中。下面整理并简述。特别,envsetup.sh还同时会引入vendor/和device /目录下的vendorsetup.sh脚本

help  
显示帮助,列出提供的命令

-----------------------------------------------------------------------------------------------

get_abs_build_var 
列出make脚本中某变量的值,前缀上当前路径。ref dumpvar.mk
使用方法:
       get_abs_build_var VAR_NAME
VAR_NAME是需要显示的make脚本中的变量。
例如:
       get_abs_build_var TARGET_PRODUCT
返回
       <Your Android Root>\<VAR_NAME Value>

# Get the value of a build variable as an absolute path.

function get_abs_build_var()

{

    T=$(gettop)

    if [ ! "$T" ]; then

        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2

        return

    fi

    (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \

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

}

-----------------------------------------------------------------------------------------------------------

get_build_var   
列出make脚本中某变量的值。ref dumpvar.mk
Usage:
       get_build_var VAR_NAME
VAR_NAME是需要显示的make脚本中的变量。
Return:
       <VAR_NAME Value>
Example:
       get_abs_build_var TARGET_PRODUCT

# Get the exact value of a build variable.

function get_build_var()

{

    T=$(gettop)

    if [ ! "$T" ]; then

        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2

        return

    fi

    CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \

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

}

------------------------------------------------------------------------------------------------------------
check_product
检查指定的TARGET_PRODUCT是否允许,默认的有sim和generic。如果不允许,则输出错误信息,允许则无回显。
Usage:
       check_product <YourTargetProduct>
Example:
       check_product generic

# check to see if the supplied product is one we can build

function check_product()

{

    T=$(gettop)

    if [ ! "$T" ]; then

        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2

        return

    fi

    CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \

        TARGET_PRODUCT=$1 \

        TARGET_BUILD_VARIANT= \

        TARGET_BUILD_TYPE= \

        TARGET_BUILD_APPS= \

        get_build_var TARGET_DEVICE > /dev/null

    # hide successful answers, but allow the errors to show

}

------------------------------------------------------------------------------------------------------------------

check_variant
检查variant是否支持,支持则返回0,不支持则返回1。允许的variant列表定义在envsetup.sh中的VARIANT_CHOICES中,默认是user,userdebug,eng。定制android时,可以在VARIANT_CHOICES中添加vairant。
Usage:
       check_variant <YourVariant>
Example:
       check_variant eng

VARIANT_CHOICES=(user userdebug eng)


# check to see if the supplied variant is valid

function check_variant()

{

    for v in ${VARIANT_CHOICES[@]}

    do

        if [ "$v" = "$1" ]

        then

            return 0

        fi

    done

    return 1

}

-------------------------------------------------------------------------------------

setpaths
奇次执行时,将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

function setpaths()

{

    T=$(gettop)

    if [ ! "$T" ]; then

        echo "Couldn't locate the top of the tree.  Try setting TOP."

        return

    fi

    ##################################################################

    #                                                                #

    #              Read me before you modify this code               #

    #                                                                #

    #   This function sets ANDROID_BUILD_PATHS to what it is adding  #

    #   to PATH, and the next time it is run, it removes that from   #

    #   PATH.  This is required so lunch can be run more than once   #

    #   and still have working paths.                                #

    #                                                                #

    ##################################################################

    # Note: on windows/cygwin, ANDROID_BUILD_PATHS will contain spaces

    # due to "C:\Program Files" being in the path.


    # out with the old

    if [ -n "$ANDROID_BUILD_PATHS" ] ; then

        export PATH=${PATH/$ANDROID_BUILD_PATHS/}

    fi

    if [ -n "$ANDROID_PRE_BUILD_PATHS" ] ; then

        export PATH=${PATH/$ANDROID_PRE_BUILD_PATHS/}

        # strip leading ':', if any

        export PATH=${PATH/:%/}

    fi

   # and in with the new

    CODE_REVIEWS=

    prebuiltdir=$(getprebuilt)

    gccprebuiltdir=$(get_abs_build_var ANDROID_GCC_PREBUILTS)


    # defined in core/config.mk

    targetgccversion=$(get_build_var TARGET_GCC_VERSION)

    export TARGET_GCC_VERSION=$targetgccversion


    # The gcc toolchain does not exists for windows/cygwin. In this case, do not reference it.

    export ANDROID_EABI_TOOLCHAIN=

    local ARCH=$(get_build_var TARGET_ARCH)

    case $ARCH in

        x86) toolchaindir=x86/i686-linux-android-$targetgccversion/bin

            ;;

        arm) toolchaindir=arm/arm-linux-androideabi-$targetgccversion/bin

            ;;

        mips) toolchaindir=mips/mipsel-linux-android-$targetgccversion/bin

            ;;

        *)

            echo "Can't find toolchain for unknown architecture: $ARCH"

            toolchaindir=xxxxxxxxx

            ;;

    esac

    if [ -d "$gccprebuiltdir/$toolchaindir" ]; then

        export ANDROID_EABI_TOOLCHAIN=$gccprebuiltdir/$toolchaindir

    fi

 

    unset ARM_EABI_TOOLCHAIN ARM_EABI_TOOLCHAIN_PATH

    case $ARCH in

        arm)

            toolchaindir=arm/arm-eabi-$targetgccversion/bin

            if [ -d "$gccprebuiltdir/$toolchaindir" ]; then

                 export ARM_EABI_TOOLCHAIN="$gccprebuiltdir/$toolchaindir"

                 ARM_EABI_TOOLCHAIN_PATH=":$gccprebuiltdir/$toolchaindir"

            fi

            ;;

        mips) toolchaindir=mips/mips-eabi-4.4.3/bin

            ;;

        *)

            # No need to set ARM_EABI_TOOLCHAIN for other ARCHs

            ;;

    esac

    export ANDROID_TOOLCHAIN=$ANDROID_EABI_TOOLCHAIN

    export ANDROID_QTOOLS=$T/development/emulator/qtools

    export ANDROID_DEV_SCRIPTS=$T/development/scripts:$T/prebuilts/devtools/tools

    export ANDROID_BUILD_PATHS=$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_QTOOLS:$ANDROID_TOOLCHAIN$ARM_EABI_TOOLCHAIN_PATH$CODE_REVIEWS:$ANDROID_DEV_SCRIPTS:

    export PATH=$ANDROID_BUILD_PATHS$PATH

    unset ANDROID_JAVA_TOOLCHAIN

    unset ANDROID_PRE_BUILD_PATHS

    if [ -n "$JAVA_HOME" ]; then

        export ANDROID_JAVA_TOOLCHAIN=$JAVA_HOME/bin

        export ANDROID_PRE_BUILD_PATHS=$ANDROID_JAVA_TOOLCHAIN:

        export PATH=$ANDROID_PRE_BUILD_PATHS$PATH

    fi

    unset ANDROID_PRODUCT_OUT

    export ANDROID_PRODUCT_OUT=$(get_abs_build_var PRODUCT_OUT)

    export OUT=$ANDROID_PRODUCT_OUT


    unset ANDROID_HOST_OUT

    export ANDROID_HOST_OUT=$(get_abs_build_var HOST_OUT)

    # needed for processing samples collected by perf counters

    unset OPROFILE_EVENTS_DIR

    export OPROFILE_EVENTS_DIR=$T/external/oprofile/events


    # needed for building linux on MacOS

    # TODO: fix the path

    #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include

}

--------------------------------------------------------------------------------------------------------------
printconfig
输出类似如下形势的配置信息。
============================================
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
============================================

function printconfig()

{

    T=$(gettop)

    if [ ! "$T" ]; then

        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2

        return

    fi

    get_build_var report_config

}

------------------------------------------------------------------------------------------------
set_stuff_for_environment
依次调用settitle, set_java_home,setpaths,set_sequence_number。设置android编译需要的环境变量。

function set_stuff_for_environment()

{

    settitle

    set_java_home

    setpaths

    set_sequence_number


    export ANDROID_BUILD_TOP=$(gettop)

}

set_sequence_number
输出环境变量BUILD_ENV_SEQUENCE_NUMBER。

function set_sequence_number()

{

    export BUILD_ENV_SEQUENCE_NUMBER=10

}

settitle
设置shell的prompt提示,PROMPT_COMMAND中加入TARGET_PRODUCT,TARGET_BUILD_VARIANT,和TARGET_BUILD_APPS等信息提示。

function settitle()

{

    if [ "$STAY_OFF_MY_LAWN" = "" ]; then

        local arch=$(gettargetarch)

        local product=$TARGET_PRODUCT

        local variant=$TARGET_BUILD_VARIANT

        local apps=$TARGET_BUILD_APPS

        if [ -z "$apps" ]; then

            export PROMPT_COMMAND="echo -ne \"\033]0;[${arch}-${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\""

        else

            export PROMPT_COMMAND="echo -ne \"\033]0;[$arch $apps $variant] ${USER}@${HOSTNAME}: ${PWD}\007\""

        fi

    fi

}


choosesim
配置环境变量TARGET_SIMULATOR。linux下会提示用户选择device或simulator。然后调用set_stuff_for_environment设置。

choosetype
配置环境变量TARGET_BUILD_TYPE_SIMULATOR。会提示用户选择release或debug。然后调用set_stuff_for_environment设置

function choosetype()

{

    echo "Build type choices are:"

    echo "     1. release"

    echo "     2. debug"

    echo


    local DEFAULT_NUM DEFAULT_VALUE

    DEFAULT_NUM=1

    DEFAULT_VALUE=release


    export TARGET_BUILD_TYPE=

    local ANSWER

    while [ -z $TARGET_BUILD_TYPE ]

    do

        echo -n "Which would you like? ["$DEFAULT_NUM"] "

        if [ -z "$1" ] ; then

            read ANSWER

        else

            echo $1

            ANSWER=$1

        fi

        case $ANSWER in

        "")

            export TARGET_BUILD_TYPE=$DEFAULT_VALUE

            ;;

        1)

            export TARGET_BUILD_TYPE=release

            ;;

        release)

            export TARGET_BUILD_TYPE=release

            ;;

        2)

            export TARGET_BUILD_TYPE=debug

            ;;

        debug)

            export TARGET_BUILD_TYPE=debug

            ;;

        *)

            echo

            echo "I didn't understand your response.  Please try again."

            echo

            ;;

        esac

        if [ -n "$1" ] ; then

            break

        fi

    done


    set_stuff_for_environment

}

chooseproduct
配置环境变量TARGET_PRODUCT。会提示用户选择release或debug。然后调用set_stuff_for_environment设置

#

# This function isn't really right:  It chooses a TARGET_PRODUCT

# based on the list of boards.  Usually, that gets you something

# that kinda works with a generic product, but really, you should

# pick a product by name.

#

function chooseproduct()

{

    if [ "x$TARGET_PRODUCT" != x ] ; then

        default_value=$TARGET_PRODUCT

    else

        default_value=full

    fi


    export TARGET_PRODUCT=

    local ANSWER

    while [ -z "$TARGET_PRODUCT" ]

    do

        echo -n "Which product would you like? [$default_value] "

        if [ -z "$1" ] ; then

            read ANSWER

        else

            echo $1

            ANSWER=$1

        fi


        if [ -z "$ANSWER" ] ; then

            export TARGET_PRODUCT=$default_value

        else

            if check_product $ANSWER

            then

                export TARGET_PRODUCT=$ANSWER

            else

                echo "** Not a valid product: $ANSWER"

            fi

        fi

        if [ -n "$1" ] ; then

            break

        fi

    done


    set_stuff_for_environment

}

choosevariant
配置环境变量TARGET_BUILD_VARIANT。会提示用户选择release或debug。

function choosevariant()

{

    echo "Variant choices are:"

    local index=1

    local v

    for v in ${VARIANT_CHOICES[@]}

    do

        # The product name is the name of the directory containing

        # the makefile we found, above.

        echo "     $index. $v"

        index=$(($index+1))

    done

    local default_value=eng

    local ANSWER


    export TARGET_BUILD_VARIANT=

    while [ -z "$TARGET_BUILD_VARIANT" ]

    do

        echo -n "Which would you like? [$default_value] "

        if [ -z "$1" ] ; then

            read ANSWER

        else

            echo $1

            ANSWER=$1

        fi

        if [ -z "$ANSWER" ] ; then

            export TARGET_BUILD_VARIANT=$default_value

        elif (echo -n $ANSWER | grep -q -e "^[0-9][0-9]*$") ; then

            if [ "$ANSWER" -le "${#VARIANT_CHOICES[@]}" ] ; then

                export TARGET_BUILD_VARIANT=${VARIANT_CHOICES[$(($ANSWER-1))]}

            fi

        else

            if check_variant $ANSWER

            then

                export TARGET_BUILD_VARIANT=$ANSWER

            else

                echo "** Not a valid variant: $ANSWER"

            fi

        fi

        if [ -n "$1" ] ; then

            break

        fi

    done

}

choosecombo
依次调用choosesim,choosetype,chooseproduct,choosevariant,set_stuff_for_environment配置,然后调用printconfig输出

function choosecombo()

{

    choosetype $1


    echo

    echo

    chooseproduct $2


    echo

    echo

    choosevariant $3


    echo

    set_stuff_for_environment

    printconfig

}

add_lunch_combo
向环境变量LUNCH_MENU_CHOICES标识的列表中添加项。envsetup.sh中默认添加了full-eng,full_x86-eng,和simulator。

unset LUNCH_MENU_CHOICES

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)

}

print_lunch_menu
列出LUNCH_MENU_CHOICES中的所有选项

add_lunch_combo aosp_arm-eng

add_lunch_combo aosp_x86-eng

add_lunch_combo aosp_mips-eng

add_lunch_combo vbox_x86-eng

function print_lunch_menu()

{

    local uname=$(uname)

    echo

    echo "You're building on" $uname

    echo

    echo "Lunch menu... pick a combo:"


    local i=1

    local choice

    for choice in ${LUNCH_MENU_CHOICES[@]}

    do

        echo "     $i. $choice"

        i=$(($i+1))

    done


    echo

}

lunch
点菜,用户选择/指定product,variant后,lunch命令设置环境变量TARGET_PRODUCT,TARGET_BUILD_VARIANT,TARGET_SIMULATOR,TARGET_BUILD_TYPE,随后调用set_stuff_for_environment设置,并printconfig显示。
Usage:
       lunch  [<YourProduct>-<YourBuildVariant>]

不给参数时,将提示用户选择。
 
Example:
       lunch
       lunch generic-eng

function lunch()

{

    local answer


    if [ "$1" ] ; then

        answer=$1

    else

        print_lunch_menu

        echo -n "Which would you like? [aosp_arm-eng] "

        read answer

    fi

    local selection=


    if [ -z "$answer" ]

    then

        selection=aosp_arm-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

}

# Tab completion for lunch.

function _lunch()

{

    local cur prev opts

    COMPREPLY=()

    cur="${COMP_WORDS[COMP_CWORD]}"

    prev="${COMP_WORDS[COMP_CWORD-1]}"


    COMPREPLY=( $(compgen -W "${LUNCH_MENU_CHOICES[*]}" -- ${cur}) )

    return 0

}

complete -F _lunch lunch

tapas
用户给定variant和一个或多个app name,就是LOCAL_PACKAGE_NAME的名字。tapas设定
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

function tapas()

{

    local arch=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E '^(arm|x86|mips|armv5)$'))

    local variant=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E '^(user|userdebug|eng)$'))

    local apps=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E -v '^(user|userdebug|eng|arm|x86|mips|armv5)$'))


    if [ $(echo $arch | wc -w) -gt 1 ]; then

        echo "tapas: Error: Multiple build archs supplied: $arch"

        return

    fi

    if [ $(echo $variant | wc -w) -gt 1 ]; then

        echo "tapas: Error: Multiple build variants supplied: $variant"

        return

    fi


    local product=full

    case $arch in

      x86)   product=full_x86;;

      mips)  product=full_mips;;

      armv5) product=generic_armv5;;

    esac

    if [ -z "$variant" ]; then

        variant=eng

    fi

    if [ -z "$apps" ]; then

        apps=all

    fi


    export TARGET_PRODUCT=$product

    export TARGET_BUILD_VARIANT=$variant

    export TARGET_BUILD_TYPE=release

    export TARGET_BUILD_APPS=$apps


    set_stuff_for_environment

    printconfig

}

gettop
返回当前android代码树的顶层路径。前提是当前路径位于android代码树中

function gettop

{

    local TOPFILE=build/core/envsetup.mk

    if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then

        echo $TOP

    else

        if [ -f $TOPFILE ] ; then

            # The following circumlocution (repeated below as well) ensures

            # that we record the true directory name and not one that is

            # faked up with symlink names.

            PWD= /bin/pwd

        else

            local HERE=$PWD

            T=

            while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do

                \cd ..

                T=`PWD= /bin/pwd`

            done

            \cd $HERE

            if [ -f "$T/$TOPFILE" ]; then

                echo $T

            fi

        fi

    fi

}

findmakefile
查找当前或最接近自己的祖辈路径上的Android.mk,返回Android.mk的路径,假设当前路径处于android代码树中

function findmakefile()

{

    TOPFILE=build/core/envsetup.mk

    local HERE=$PWD

    T=

    while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do

        T=`PWD= /bin/pwd`

        if [ -f "$T/Android.mk" ]; then

            echo $T/Android.mk

            \cd $HERE

            return

        fi

        \cd ..

    done

    \cd $HERE

}

croot
改变当前路径到代码树顶层。

function croot()

{

    T=$(gettop)

    if [ "$T" ]; then

        \cd $(gettop)

    else

        echo "Couldn't locate the top of the tree.  Try setting TOP."

    fi

}

cproj
改变当前路径到最近的还有Android.mk文件的祖父辈路径

function cproj()

{

    TOPFILE=build/core/envsetup.mk

    local HERE=$PWD

    T=

    while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do

        T=$PWD

        if [ -f "$T/Android.mk" ]; then

            \cd $T

            return

        fi

        \cd ..

    done

    \cd $HERE

    echo "can't find Android.mk"

}


pid
使用adb shell ps命令列出手机上指定名字的进程的pid。
Usage:
       pid <YourName>

function pid()

{

    local prepend=''

    local append=''

    if [ "$1" = "--exact" ]; then

        prepend=' '

        append='$'

        shift

    fi

    local EXE="$1"

    if [ "$EXE" ] ; then

        local PID=`adb shell ps \

            | tr -d '\r' \

            | \grep "$prepend$EXE$append" \

            | sed -e 's/^[^ ]* *\([0-9]*\).*$/\1/'`

        echo "$PID"

    else

        echo "usage: pid [--exact] <process name>"

return 255

    fi

}

systemstack
使用kill -3system_server将系统进程中的线程信息写入/data/anr/traces.txt。

# systemstack - dump the current stack trace of all threads in the system process

# to the usual ANR traces file

function systemstack()

{

    stacks system_server

}

gdbclient
建立gdb调试环境,包括两步,手机上运行gdbserver,本机上运行arm-eabi-gdb。
Usage:
       gdbclient <EXE> <PORT> <AppName>
EXE: AppName的执行名。

PORT:gdbserver的端口,例如, 192.168.2.102:5039
AppName:手机中ps列出的app名字,据此查pid。

sgrep
查找当前目录及子目录中所有.c,.h,.cpp,.S,.java,.mk,.xml,.sh文件,即源码文件中包含特定单词的行,并颜色显示输出。
Usage:
       sgrep <YourWord>
Example:
       sgrep Calendar
jgrep
同sgrep,但只查.java文件。
cgrep
同sgrep,但只查c相关的文件,即.c,.cc,.cpp,.h文件。
resgrep
同sgrep,但只查res相关的.xml文件。
mgrep
同sgrep,但只查make相关的脚本文件,包括Makefile文件,Makefile目录下的所有文件,.make文件,.mak文件和.mk文件。
treegrep
查找当前目录及子目录中所有.c,.h,.cpp,.S,.java,.xml文件,即源码文件中包含特定单词的行,并颜色显示输出。
getprebuilt
输出prebuilt的路径。
tracedmdump
生成dexlist文件qtrace.dexlit,dmtrace数据文件dmtrace,和调用dmtracedump工具生成的dmtrace解析文件dmtrace.html,将生成文件放到指定路径。
Usage:
       tracedmdump <YourDirName>
如果YourDirName中不含’\’,则将放置的路径是$ANDROID_PRODUCT_OUT/traces/YourDirName。
runhat
貌似使用kill -10的方法得到heap dump并取到本地。使用hat以http方式展现出来。hat可能是个lightweight http server,不曾用过。
getbugreports
将手机/sdcard/bugreports目录下的文件下载到本地并压缩打包。
startviewserver
用指定端口启动viewserver。
Usage:
       startviewserver <Port>
不指定端口,则默认4939。
stopviewserver
关闭viewserver。
isviewserverstarted
检查viewserver是否可用。
smoketest
编译smoketest并安装手机运行。
runtest
运行development/testrunner/runtest.py $@

godir
给出一个词,godir会输出一个路径列表供用户选择要进入的路径。路径列表包含的路径满足,路径名中包含这个词,或这路径下的文件有文件名含这个词。out/路径下不考虑。
Usage:
       godir <YourKey>
Usage:
       godir Calculator
set_java_home

设置JAVA_HOME环境变量为/usr/lib/jvm/java-6-sun


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值