Home | History | Annotate | Download | only in build
      1 function hmm() {
      2 cat <<EOF
      3 Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
      4 - lunch:   lunch <product_name>-<build_variant>
      5 - tapas:   tapas [<App1> <App2> ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user]
      6 - croot:   Changes directory to the top of the tree.
      7 - m:       Makes from the top of the tree.
      8 - mm:      Builds all of the modules in the current directory, but not their dependencies.
      9 - mmm:     Builds all of the modules in the supplied directories, but not their dependencies.
     10            To limit the modules being built use the syntax: mmm dir/:target1,target2.
     11 - mma:     Builds all of the modules in the current directory, and their dependencies.
     12 - mmma:    Builds all of the modules in the supplied directories, and their dependencies.
     13 - cgrep:   Greps on all local C/C++ files.
     14 - ggrep:   Greps on all local Gradle files.
     15 - jgrep:   Greps on all local Java files.
     16 - resgrep: Greps on all local res/*.xml files.
     17 - sgrep:   Greps on all local source files.
     18 - godir:   Go to the directory containing a file.
     19 
     20 Look at the source to view more functions. The complete list is:
     21 EOF
     22     T=$(gettop)
     23     local A
     24     A=""
     25     for i in `cat $T/build/envsetup.sh | sed -n "/^[ \t]*function /s/function \([a-z_]*\).*/\1/p" | sort | uniq`; do
     26       A="$A $i"
     27     done
     28     echo $A
     29 }
     30 
     31 # Get the value of a build variable as an absolute path.
     32 function get_abs_build_var()
     33 {
     34     T=$(gettop)
     35     if [ ! "$T" ]; then
     36         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
     37         return
     38     fi
     39     (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
     40       command make --no-print-directory -f build/core/config.mk dumpvar-abs-$1)
     41 }
     42 
     43 # Get the exact value of a build variable.
     44 function get_build_var()
     45 {
     46     T=$(gettop)
     47     if [ ! "$T" ]; then
     48         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
     49         return
     50     fi
     51     (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
     52       command make --no-print-directory -f build/core/config.mk dumpvar-$1)
     53 }
     54 
     55 # check to see if the supplied product is one we can build
     56 function check_product()
     57 {
     58     T=$(gettop)
     59     if [ ! "$T" ]; then
     60         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
     61         return
     62     fi
     63         TARGET_PRODUCT=$1 \
     64         TARGET_BUILD_VARIANT= \
     65         TARGET_BUILD_TYPE= \
     66         TARGET_BUILD_APPS= \
     67         get_build_var TARGET_DEVICE > /dev/null
     68     # hide successful answers, but allow the errors to show
     69 }
     70 
     71 VARIANT_CHOICES=(user userdebug eng)
     72 
     73 # check to see if the supplied variant is valid
     74 function check_variant()
     75 {
     76     for v in ${VARIANT_CHOICES[@]}
     77     do
     78         if [ "$v" = "$1" ]
     79         then
     80             return 0
     81         fi
     82     done
     83     return 1
     84 }
     85 
     86 function setpaths()
     87 {
     88     T=$(gettop)
     89     if [ ! "$T" ]; then
     90         echo "Couldn't locate the top of the tree.  Try setting TOP."
     91         return
     92     fi
     93 
     94     ##################################################################
     95     #                                                                #
     96     #              Read me before you modify this code               #
     97     #                                                                #
     98     #   This function sets ANDROID_BUILD_PATHS to what it is adding  #
     99     #   to PATH, and the next time it is run, it removes that from   #
    100     #   PATH.  This is required so lunch can be run more than once   #
    101     #   and still have working paths.                                #
    102     #                                                                #
    103     ##################################################################
    104 
    105     # Note: on windows/cygwin, ANDROID_BUILD_PATHS will contain spaces
    106     # due to "C:\Program Files" being in the path.
    107 
    108     # out with the old
    109     if [ -n "$ANDROID_BUILD_PATHS" ] ; then
    110         export PATH=${PATH/$ANDROID_BUILD_PATHS/}
    111     fi
    112     if [ -n "$ANDROID_PRE_BUILD_PATHS" ] ; then
    113         export PATH=${PATH/$ANDROID_PRE_BUILD_PATHS/}
    114         # strip leading ':', if any
    115         export PATH=${PATH/:%/}
    116     fi
    117 
    118     # and in with the new
    119     prebuiltdir=$(getprebuilt)
    120     gccprebuiltdir=$(get_abs_build_var ANDROID_GCC_PREBUILTS)
    121 
    122     # defined in core/config.mk
    123     targetgccversion=$(get_build_var TARGET_GCC_VERSION)
    124     targetgccversion2=$(get_build_var 2ND_TARGET_GCC_VERSION)
    125     export TARGET_GCC_VERSION=$targetgccversion
    126 
    127     # The gcc toolchain does not exists for windows/cygwin. In this case, do not reference it.
    128     export ANDROID_TOOLCHAIN=
    129     export ANDROID_TOOLCHAIN_2ND_ARCH=
    130     local ARCH=$(get_build_var TARGET_ARCH)
    131     case $ARCH in
    132         x86) toolchaindir=x86/x86_64-linux-android-$targetgccversion/bin
    133             ;;
    134         x86_64) toolchaindir=x86/x86_64-linux-android-$targetgccversion/bin
    135             ;;
    136         arm) toolchaindir=arm/arm-linux-androideabi-$targetgccversion/bin
    137             ;;
    138         arm64) toolchaindir=aarch64/aarch64-linux-android-$targetgccversion/bin;
    139                toolchaindir2=arm/arm-linux-androideabi-$targetgccversion2/bin
    140             ;;
    141         mips|mips64) toolchaindir=mips/mips64el-linux-android-$targetgccversion/bin
    142             ;;
    143         *)
    144             echo "Can't find toolchain for unknown architecture: $ARCH"
    145             toolchaindir=xxxxxxxxx
    146             ;;
    147     esac
    148     if [ -d "$gccprebuiltdir/$toolchaindir" ]; then
    149         export ANDROID_TOOLCHAIN=$gccprebuiltdir/$toolchaindir
    150     fi
    151 
    152     if [ -d "$gccprebuiltdir/$toolchaindir2" ]; then
    153         export ANDROID_TOOLCHAIN_2ND_ARCH=$gccprebuiltdir/$toolchaindir2
    154     fi
    155 
    156     unset ANDROID_KERNEL_TOOLCHAIN_PATH
    157     case $ARCH in
    158         arm)
    159             # Legacy toolchain configuration used for ARM kernel compilation
    160             toolchaindir=arm/arm-eabi-$targetgccversion/bin
    161             if [ -d "$gccprebuiltdir/$toolchaindir" ]; then
    162                  export ARM_EABI_TOOLCHAIN="$gccprebuiltdir/$toolchaindir"
    163                  ANDROID_KERNEL_TOOLCHAIN_PATH="$ARM_EABI_TOOLCHAIN":
    164             fi
    165             ;;
    166         *)
    167             # No need to set ARM_EABI_TOOLCHAIN for other ARCHs
    168             ;;
    169     esac
    170 
    171     export ANDROID_DEV_SCRIPTS=$T/development/scripts:$T/prebuilts/devtools/tools
    172     export ANDROID_BUILD_PATHS=$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_TOOLCHAIN:$ANDROID_TOOLCHAIN_2ND_ARCH:$ANDROID_KERNEL_TOOLCHAIN_PATH$ANDROID_DEV_SCRIPTS:
    173 
    174     # If prebuilts/android-emulator/<system>/ exists, prepend it to our PATH
    175     # to ensure that the corresponding 'emulator' binaries are used.
    176     case $(uname -s) in
    177         Darwin)
    178             ANDROID_EMULATOR_PREBUILTS=$T/prebuilts/android-emulator/darwin-x86_64
    179             ;;
    180         Linux)
    181             ANDROID_EMULATOR_PREBUILTS=$T/prebuilts/android-emulator/linux-x86_64
    182             ;;
    183         *)
    184             ANDROID_EMULATOR_PREBUILTS=
    185             ;;
    186     esac
    187     if [ -n "$ANDROID_EMULATOR_PREBUILTS" -a -d "$ANDROID_EMULATOR_PREBUILTS" ]; then
    188         ANDROID_BUILD_PATHS=$ANDROID_BUILD_PATHS$ANDROID_EMULATOR_PREBUILTS:
    189         export ANDROID_EMULATOR_PREBUILTS
    190     fi
    191 
    192     export PATH=$ANDROID_BUILD_PATHS$PATH
    193 
    194     unset ANDROID_JAVA_TOOLCHAIN
    195     unset ANDROID_PRE_BUILD_PATHS
    196     if [ -n "$JAVA_HOME" ]; then
    197         export ANDROID_JAVA_TOOLCHAIN=$JAVA_HOME/bin
    198         export ANDROID_PRE_BUILD_PATHS=$ANDROID_JAVA_TOOLCHAIN:
    199         export PATH=$ANDROID_PRE_BUILD_PATHS$PATH
    200     fi
    201 
    202     unset ANDROID_PRODUCT_OUT
    203     export ANDROID_PRODUCT_OUT=$(get_abs_build_var PRODUCT_OUT)
    204     export OUT=$ANDROID_PRODUCT_OUT
    205 
    206     unset ANDROID_HOST_OUT
    207     export ANDROID_HOST_OUT=$(get_abs_build_var HOST_OUT)
    208 
    209     # needed for building linux on MacOS
    210     # TODO: fix the path
    211     #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include
    212 }
    213 
    214 function printconfig()
    215 {
    216     T=$(gettop)
    217     if [ ! "$T" ]; then
    218         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
    219         return
    220     fi
    221     get_build_var report_config
    222 }
    223 
    224 function set_stuff_for_environment()
    225 {
    226     settitle
    227     set_java_home
    228     setpaths
    229     set_sequence_number
    230 
    231     export ANDROID_BUILD_TOP=$(gettop)
    232     # With this environment variable new GCC can apply colors to warnings/errors
    233     export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
    234 }
    235 
    236 function set_sequence_number()
    237 {
    238     export BUILD_ENV_SEQUENCE_NUMBER=10
    239 }
    240 
    241 function settitle()
    242 {
    243     if [ "$STAY_OFF_MY_LAWN" = "" ]; then
    244         local arch=$(gettargetarch)
    245         local product=$TARGET_PRODUCT
    246         local variant=$TARGET_BUILD_VARIANT
    247         local apps=$TARGET_BUILD_APPS
    248         if [ -z "$apps" ]; then
    249             export PROMPT_COMMAND="echo -ne \"\033]0;[${arch}-${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\""
    250         else
    251             export PROMPT_COMMAND="echo -ne \"\033]0;[$arch $apps $variant] ${USER}@${HOSTNAME}: ${PWD}\007\""
    252         fi
    253     fi
    254 }
    255 
    256 function addcompletions()
    257 {
    258     local T dir f
    259 
    260     # Keep us from trying to run in something that isn't bash.
    261     if [ -z "${BASH_VERSION}" ]; then
    262         return
    263     fi
    264 
    265     # Keep us from trying to run in bash that's too old.
    266     if [ ${BASH_VERSINFO[0]} -lt 3 ]; then
    267         return
    268     fi
    269 
    270     dir="sdk/bash_completion"
    271     if [ -d ${dir} ]; then
    272         for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do
    273             echo "including $f"
    274             . $f
    275         done
    276     fi
    277 }
    278 
    279 function choosetype()
    280 {
    281     echo "Build type choices are:"
    282     echo "     1. release"
    283     echo "     2. debug"
    284     echo
    285 
    286     local DEFAULT_NUM DEFAULT_VALUE
    287     DEFAULT_NUM=1
    288     DEFAULT_VALUE=release
    289 
    290     export TARGET_BUILD_TYPE=
    291     local ANSWER
    292     while [ -z $TARGET_BUILD_TYPE ]
    293     do
    294         echo -n "Which would you like? ["$DEFAULT_NUM"] "
    295         if [ -z "$1" ] ; then
    296             read ANSWER
    297         else
    298             echo $1
    299             ANSWER=$1
    300         fi
    301         case $ANSWER in
    302         "")
    303             export TARGET_BUILD_TYPE=$DEFAULT_VALUE
    304             ;;
    305         1)
    306             export TARGET_BUILD_TYPE=release
    307             ;;
    308         release)
    309             export TARGET_BUILD_TYPE=release
    310             ;;
    311         2)
    312             export TARGET_BUILD_TYPE=debug
    313             ;;
    314         debug)
    315             export TARGET_BUILD_TYPE=debug
    316             ;;
    317         *)
    318             echo
    319             echo "I didn't understand your response.  Please try again."
    320             echo
    321             ;;
    322         esac
    323         if [ -n "$1" ] ; then
    324             break
    325         fi
    326     done
    327 
    328     set_stuff_for_environment
    329 }
    330 
    331 #
    332 # This function isn't really right:  It chooses a TARGET_PRODUCT
    333 # based on the list of boards.  Usually, that gets you something
    334 # that kinda works with a generic product, but really, you should
    335 # pick a product by name.
    336 #
    337 function chooseproduct()
    338 {
    339     if [ "x$TARGET_PRODUCT" != x ] ; then
    340         default_value=$TARGET_PRODUCT
    341     else
    342         default_value=full
    343     fi
    344 
    345     export TARGET_PRODUCT=
    346     local ANSWER
    347     while [ -z "$TARGET_PRODUCT" ]
    348     do
    349         echo -n "Which product would you like? [$default_value] "
    350         if [ -z "$1" ] ; then
    351             read ANSWER
    352         else
    353             echo $1
    354             ANSWER=$1
    355         fi
    356 
    357         if [ -z "$ANSWER" ] ; then
    358             export TARGET_PRODUCT=$default_value
    359         else
    360             if check_product $ANSWER
    361             then
    362                 export TARGET_PRODUCT=$ANSWER
    363             else
    364                 echo "** Not a valid product: $ANSWER"
    365             fi
    366         fi
    367         if [ -n "$1" ] ; then
    368             break
    369         fi
    370     done
    371 
    372     set_stuff_for_environment
    373 }
    374 
    375 function choosevariant()
    376 {
    377     echo "Variant choices are:"
    378     local index=1
    379     local v
    380     for v in ${VARIANT_CHOICES[@]}
    381     do
    382         # The product name is the name of the directory containing
    383         # the makefile we found, above.
    384         echo "     $index. $v"
    385         index=$(($index+1))
    386     done
    387 
    388     local default_value=eng
    389     local ANSWER
    390 
    391     export TARGET_BUILD_VARIANT=
    392     while [ -z "$TARGET_BUILD_VARIANT" ]
    393     do
    394         echo -n "Which would you like? [$default_value] "
    395         if [ -z "$1" ] ; then
    396             read ANSWER
    397         else
    398             echo $1
    399             ANSWER=$1
    400         fi
    401 
    402         if [ -z "$ANSWER" ] ; then
    403             export TARGET_BUILD_VARIANT=$default_value
    404         elif (echo -n $ANSWER | grep -q -e "^[0-9][0-9]*$") ; then
    405             if [ "$ANSWER" -le "${#VARIANT_CHOICES[@]}" ] ; then
    406                 export TARGET_BUILD_VARIANT=${VARIANT_CHOICES[$(($ANSWER-1))]}
    407             fi
    408         else
    409             if check_variant $ANSWER
    410             then
    411                 export TARGET_BUILD_VARIANT=$ANSWER
    412             else
    413                 echo "** Not a valid variant: $ANSWER"
    414             fi
    415         fi
    416         if [ -n "$1" ] ; then
    417             break
    418         fi
    419     done
    420 }
    421 
    422 function choosecombo()
    423 {
    424     choosetype $1
    425 
    426     echo
    427     echo
    428     chooseproduct $2
    429 
    430     echo
    431     echo
    432     choosevariant $3
    433 
    434     echo
    435     set_stuff_for_environment
    436     printconfig
    437 }
    438 
    439 # Clear this variable.  It will be built up again when the vendorsetup.sh
    440 # files are included at the end of this file.
    441 unset LUNCH_MENU_CHOICES
    442 function add_lunch_combo()
    443 {
    444     local new_combo=$1
    445     local c
    446     for c in ${LUNCH_MENU_CHOICES[@]} ; do
    447         if [ "$new_combo" = "$c" ] ; then
    448             return
    449         fi
    450     done
    451     LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)
    452 }
    453 
    454 # add the default one here
    455 add_lunch_combo aosp_arm-eng
    456 add_lunch_combo aosp_arm64-eng
    457 add_lunch_combo aosp_mips-eng
    458 add_lunch_combo aosp_mips64-eng
    459 add_lunch_combo aosp_x86-eng
    460 add_lunch_combo aosp_x86_64-eng
    461 
    462 function print_lunch_menu()
    463 {
    464     local uname=$(uname)
    465     echo
    466     echo "You're building on" $uname
    467     echo
    468     echo "Lunch menu... pick a combo:"
    469 
    470     local i=1
    471     local choice
    472     for choice in ${LUNCH_MENU_CHOICES[@]}
    473     do
    474         echo "     $i. $choice"
    475         i=$(($i+1))
    476     done
    477 
    478     echo
    479 }
    480 
    481 function lunch()
    482 {
    483     local answer
    484 
    485     if [ "$1" ] ; then
    486         answer=$1
    487     else
    488         print_lunch_menu
    489         echo -n "Which would you like? [aosp_arm-eng] "
    490         read answer
    491     fi
    492 
    493     local selection=
    494 
    495     if [ -z "$answer" ]
    496     then
    497         selection=aosp_arm-eng
    498     elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
    499     then
    500         if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
    501         then
    502             selection=${LUNCH_MENU_CHOICES[$(($answer-1))]}
    503         fi
    504     elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")
    505     then
    506         selection=$answer
    507     fi
    508 
    509     if [ -z "$selection" ]
    510     then
    511         echo
    512         echo "Invalid lunch combo: $answer"
    513         return 1
    514     fi
    515 
    516     export TARGET_BUILD_APPS=
    517 
    518     local product=$(echo -n $selection | sed -e "s/-.*$//")
    519     check_product $product
    520     if [ $? -ne 0 ]
    521     then
    522         echo
    523         echo "** Don't have a product spec for: '$product'"
    524         echo "** Do you have the right repo manifest?"
    525         product=
    526     fi
    527 
    528     local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")
    529     check_variant $variant
    530     if [ $? -ne 0 ]
    531     then
    532         echo
    533         echo "** Invalid variant: '$variant'"
    534         echo "** Must be one of ${VARIANT_CHOICES[@]}"
    535         variant=
    536     fi
    537 
    538     if [ -z "$product" -o -z "$variant" ]
    539     then
    540         echo
    541         return 1
    542     fi
    543 
    544     export TARGET_PRODUCT=$product
    545     export TARGET_BUILD_VARIANT=$variant
    546     export TARGET_BUILD_TYPE=release
    547 
    548     echo
    549 
    550     set_stuff_for_environment
    551     printconfig
    552 }
    553 
    554 # Tab completion for lunch.
    555 function _lunch()
    556 {
    557     local cur prev opts
    558     COMPREPLY=()
    559     cur="${COMP_WORDS[COMP_CWORD]}"
    560     prev="${COMP_WORDS[COMP_CWORD-1]}"
    561 
    562     COMPREPLY=( $(compgen -W "${LUNCH_MENU_CHOICES[*]}" -- ${cur}) )
    563     return 0
    564 }
    565 complete -F _lunch lunch
    566 
    567 # Configures the build to build unbundled apps.
    568 # Run tapas with one or more app names (from LOCAL_PACKAGE_NAME)
    569 function tapas()
    570 {
    571     local arch="$(echo $* | xargs -n 1 echo | \grep -E '^(arm|x86|mips|armv5|arm64|x86_64|mips64)$' | xargs)"
    572     local variant="$(echo $* | xargs -n 1 echo | \grep -E '^(user|userdebug|eng)$' | xargs)"
    573     local apps="$(echo $* | xargs -n 1 echo | \grep -E -v '^(user|userdebug|eng|arm|x86|mips|armv5|arm64|x86_64|mips64)$' | xargs)"
    574 
    575     if [ $(echo $arch | wc -w) -gt 1 ]; then
    576         echo "tapas: Error: Multiple build archs supplied: $arch"
    577         return
    578     fi
    579     if [ $(echo $variant | wc -w) -gt 1 ]; then
    580         echo "tapas: Error: Multiple build variants supplied: $variant"
    581         return
    582     fi
    583 
    584     local product=full
    585     case $arch in
    586       x86)    product=full_x86;;
    587       mips)   product=full_mips;;
    588       armv5)  product=generic_armv5;;
    589       arm64)  product=aosp_arm64;;
    590       x86_64) product=aosp_x86_64;;
    591       mips64)  product=aosp_mips64;;
    592     esac
    593     if [ -z "$variant" ]; then
    594         variant=eng
    595     fi
    596     if [ -z "$apps" ]; then
    597         apps=all
    598     fi
    599 
    600     export TARGET_PRODUCT=$product
    601     export TARGET_BUILD_VARIANT=$variant
    602     export TARGET_BUILD_TYPE=release
    603     export TARGET_BUILD_APPS=$apps
    604 
    605     set_stuff_for_environment
    606     printconfig
    607 }
    608 
    609 function gettop
    610 {
    611     local TOPFILE=build/core/envsetup.mk
    612     if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then
    613         # The following circumlocution ensures we remove symlinks from TOP.
    614         (cd $TOP; PWD= /bin/pwd)
    615     else
    616         if [ -f $TOPFILE ] ; then
    617             # The following circumlocution (repeated below as well) ensures
    618             # that we record the true directory name and not one that is
    619             # faked up with symlink names.
    620             PWD= /bin/pwd
    621         else
    622             local HERE=$PWD
    623             T=
    624             while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
    625                 \cd ..
    626                 T=`PWD= /bin/pwd -P`
    627             done
    628             \cd $HERE
    629             if [ -f "$T/$TOPFILE" ]; then
    630                 echo $T
    631             fi
    632         fi
    633     fi
    634 }
    635 
    636 # Return driver for "make", if any (eg. static analyzer)
    637 function getdriver()
    638 {
    639     local T="$1"
    640     test "$WITH_STATIC_ANALYZER" = "0" && unset WITH_STATIC_ANALYZER
    641     if [ -n "$WITH_STATIC_ANALYZER" ]; then
    642         echo "\
    643 $T/prebuilts/misc/linux-x86/analyzer/tools/scan-build/scan-build \
    644 --use-analyzer $T/prebuilts/misc/linux-x86/analyzer/bin/analyzer \
    645 --status-bugs \
    646 --top=$T"
    647     fi
    648 }
    649 
    650 function m()
    651 {
    652     local T=$(gettop)
    653     local DRV=$(getdriver $T)
    654     if [ "$T" ]; then
    655         $DRV make -C $T -f build/core/main.mk $@
    656     else
    657         echo "Couldn't locate the top of the tree.  Try setting TOP."
    658     fi
    659 }
    660 
    661 function findmakefile()
    662 {
    663     TOPFILE=build/core/envsetup.mk
    664     local HERE=$PWD
    665     T=
    666     while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
    667         T=`PWD= /bin/pwd`
    668         if [ -f "$T/Android.mk" ]; then
    669             echo $T/Android.mk
    670             \cd $HERE
    671             return
    672         fi
    673         \cd ..
    674     done
    675     \cd $HERE
    676 }
    677 
    678 function mm()
    679 {
    680     local T=$(gettop)
    681     local DRV=$(getdriver $T)
    682     # If we're sitting in the root of the build tree, just do a
    683     # normal make.
    684     if [ -f build/core/envsetup.mk -a -f Makefile ]; then
    685         $DRV make $@
    686     else
    687         # Find the closest Android.mk file.
    688         local M=$(findmakefile)
    689         local MODULES=
    690         local GET_INSTALL_PATH=
    691         local ARGS=
    692         # Remove the path to top as the makefilepath needs to be relative
    693         local M=`echo $M|sed 's:'$T'/::'`
    694         if [ ! "$T" ]; then
    695             echo "Couldn't locate the top of the tree.  Try setting TOP."
    696         elif [ ! "$M" ]; then
    697             echo "Couldn't locate a makefile from the current directory."
    698         else
    699             for ARG in $@; do
    700                 case $ARG in
    701                   GET-INSTALL-PATH) GET_INSTALL_PATH=$ARG;;
    702                 esac
    703             done
    704             if [ -n "$GET_INSTALL_PATH" ]; then
    705               MODULES=
    706               ARGS=GET-INSTALL-PATH
    707             else
    708               MODULES=all_modules
    709               ARGS=$@
    710             fi
    711             ONE_SHOT_MAKEFILE=$M $DRV make -C $T -f build/core/main.mk $MODULES $ARGS
    712         fi
    713     fi
    714 }
    715 
    716 function mmm()
    717 {
    718     local T=$(gettop)
    719     local DRV=$(getdriver $T)
    720     if [ "$T" ]; then
    721         local MAKEFILE=
    722         local MODULES=
    723         local ARGS=
    724         local DIR TO_CHOP
    725         local GET_INSTALL_PATH=
    726         local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
    727         local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
    728         for DIR in $DIRS ; do
    729             MODULES=`echo $DIR | sed -n -e 's/.*:\(.*$\)/\1/p' | sed 's/,/ /'`
    730             if [ "$MODULES" = "" ]; then
    731                 MODULES=all_modules
    732             fi
    733             DIR=`echo $DIR | sed -e 's/:.*//' -e 's:/$::'`
    734             if [ -f $DIR/Android.mk ]; then
    735                 local TO_CHOP=`(\cd -P -- $T && pwd -P) | wc -c | tr -d ' '`
    736                 local TO_CHOP=`expr $TO_CHOP + 1`
    737                 local START=`PWD= /bin/pwd`
    738                 local MFILE=`echo $START | cut -c${TO_CHOP}-`
    739                 if [ "$MFILE" = "" ] ; then
    740                     MFILE=$DIR/Android.mk
    741                 else
    742                     MFILE=$MFILE/$DIR/Android.mk
    743                 fi
    744                 MAKEFILE="$MAKEFILE $MFILE"
    745             else
    746                 case $DIR in
    747                   showcommands | snod | dist | incrementaljavac) ARGS="$ARGS $DIR";;
    748                   GET-INSTALL-PATH) GET_INSTALL_PATH=$DIR;;
    749                   *) echo "No Android.mk in $DIR."; return 1;;
    750                 esac
    751             fi
    752         done
    753         if [ -n "$GET_INSTALL_PATH" ]; then
    754           ARGS=$GET_INSTALL_PATH
    755           MODULES=
    756         fi
    757         ONE_SHOT_MAKEFILE="$MAKEFILE" $DRV make -C $T -f build/core/main.mk $DASH_ARGS $MODULES $ARGS
    758     else
    759         echo "Couldn't locate the top of the tree.  Try setting TOP."
    760     fi
    761 }
    762 
    763 function mma()
    764 {
    765   local T=$(gettop)
    766   local DRV=$(getdriver $T)
    767   if [ -f build/core/envsetup.mk -a -f Makefile ]; then
    768     $DRV make $@
    769   else
    770     if [ ! "$T" ]; then
    771       echo "Couldn't locate the top of the tree.  Try setting TOP."
    772     fi
    773     local MY_PWD=`PWD= /bin/pwd|sed 's:'$T'/::'`
    774     $DRV make -C $T -f build/core/main.mk $@ all_modules BUILD_MODULES_IN_PATHS="$MY_PWD"
    775   fi
    776 }
    777 
    778 function mmma()
    779 {
    780   local T=$(gettop)
    781   local DRV=$(getdriver $T)
    782   if [ "$T" ]; then
    783     local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
    784     local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
    785     local MY_PWD=`PWD= /bin/pwd`
    786     if [ "$MY_PWD" = "$T" ]; then
    787       MY_PWD=
    788     else
    789       MY_PWD=`echo $MY_PWD|sed 's:'$T'/::'`
    790     fi
    791     local DIR=
    792     local MODULE_PATHS=
    793     local ARGS=
    794     for DIR in $DIRS ; do
    795       if [ -d $DIR ]; then
    796         if [ "$MY_PWD" = "" ]; then
    797           MODULE_PATHS="$MODULE_PATHS $DIR"
    798         else
    799           MODULE_PATHS="$MODULE_PATHS $MY_PWD/$DIR"
    800         fi
    801       else
    802         case $DIR in
    803           showcommands | snod | dist | incrementaljavac) ARGS="$ARGS $DIR";;
    804           *) echo "Couldn't find directory $DIR"; return 1;;
    805         esac
    806       fi
    807     done
    808     $DRV make -C $T -f build/core/main.mk $DASH_ARGS $ARGS all_modules BUILD_MODULES_IN_PATHS="$MODULE_PATHS"
    809   else
    810     echo "Couldn't locate the top of the tree.  Try setting TOP."
    811   fi
    812 }
    813 
    814 function croot()
    815 {
    816     T=$(gettop)
    817     if [ "$T" ]; then
    818         \cd $(gettop)
    819     else
    820         echo "Couldn't locate the top of the tree.  Try setting TOP."
    821     fi
    822 }
    823 
    824 function cproj()
    825 {
    826     TOPFILE=build/core/envsetup.mk
    827     local HERE=$PWD
    828     T=
    829     while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
    830         T=$PWD
    831         if [ -f "$T/Android.mk" ]; then
    832             \cd $T
    833             return
    834         fi
    835         \cd ..
    836     done
    837     \cd $HERE
    838     echo "can't find Android.mk"
    839 }
    840 
    841 # simplified version of ps; output in the form
    842 # <pid> <procname>
    843 function qpid() {
    844     local prepend=''
    845     local append=''
    846     if [ "$1" = "--exact" ]; then
    847         prepend=' '
    848         append='$'
    849         shift
    850     elif [ "$1" = "--help" -o "$1" = "-h" ]; then
    851 		echo "usage: qpid [[--exact] <process name|pid>"
    852 		return 255
    853 	fi
    854 
    855     local EXE="$1"
    856     if [ "$EXE" ] ; then
    857 		qpid | \grep "$prepend$EXE$append"
    858 	else
    859 		adb shell ps \
    860 			| tr -d '\r' \
    861 			| sed -e 1d -e 's/^[^ ]* *\([0-9]*\).* \([^ ]*\)$/\1 \2/'
    862 	fi
    863 }
    864 
    865 function pid()
    866 {
    867     local prepend=''
    868     local append=''
    869     if [ "$1" = "--exact" ]; then
    870         prepend=' '
    871         append='$'
    872         shift
    873     fi
    874     local EXE="$1"
    875     if [ "$EXE" ] ; then
    876         local PID=`adb shell ps \
    877             | tr -d '\r' \
    878             | \grep "$prepend$EXE$append" \
    879             | sed -e 's/^[^ ]* *\([0-9]*\).*$/\1/'`
    880         echo "$PID"
    881     else
    882         echo "usage: pid [--exact] <process name>"
    883 		return 255
    884     fi
    885 }
    886 
    887 # systemstack - dump the current stack trace of all threads in the system process
    888 # to the usual ANR traces file
    889 function systemstack()
    890 {
    891     stacks system_server
    892 }
    893 
    894 function stacks()
    895 {
    896     if [[ $1 =~ ^[0-9]+$ ]] ; then
    897         local PID="$1"
    898     elif [ "$1" ] ; then
    899         local PIDLIST="$(pid $1)"
    900         if [[ $PIDLIST =~ ^[0-9]+$ ]] ; then
    901             local PID="$PIDLIST"
    902         elif [ "$PIDLIST" ] ; then
    903             echo "more than one process: $1"
    904         else
    905             echo "no such process: $1"
    906         fi
    907     else
    908         echo "usage: stacks [pid|process name]"
    909     fi
    910 
    911     if [ "$PID" ] ; then
    912         # Determine whether the process is native
    913         if adb shell ls -l /proc/$PID/exe | grep -q /system/bin/app_process ; then
    914             # Dump stacks of Dalvik process
    915             local TRACES=/data/anr/traces.txt
    916             local ORIG=/data/anr/traces.orig
    917             local TMP=/data/anr/traces.tmp
    918 
    919             # Keep original traces to avoid clobbering
    920             adb shell mv $TRACES $ORIG
    921 
    922             # Make sure we have a usable file
    923             adb shell touch $TRACES
    924             adb shell chmod 666 $TRACES
    925 
    926             # Dump stacks and wait for dump to finish
    927             adb shell kill -3 $PID
    928             adb shell notify $TRACES >/dev/null
    929 
    930             # Restore original stacks, and show current output
    931             adb shell mv $TRACES $TMP
    932             adb shell mv $ORIG $TRACES
    933             adb shell cat $TMP
    934         else
    935             # Dump stacks of native process
    936             local USE64BIT="$(is64bit $PID)"
    937             adb shell debuggerd$USE64BIT -b $PID
    938         fi
    939     fi
    940 }
    941 
    942 function gdbwrapper()
    943 {
    944     local GDB_CMD="$1"
    945     shift 1
    946     $GDB_CMD -x "$@"
    947 }
    948 
    949 function get_symbols_directory()
    950 {
    951     echo $(get_abs_build_var TARGET_OUT_UNSTRIPPED)
    952 }
    953 
    954 # Read the ELF header from /proc/$PID/exe to determine if the process is
    955 # 64-bit.
    956 function is64bit()
    957 {
    958     local PID="$1"
    959     if [ "$PID" ] ; then
    960         if [[ "$(adb shell cat /proc/$PID/exe | xxd -l 1 -s 4 -ps)" -eq "02" ]] ; then
    961             echo "64"
    962         else
    963             echo ""
    964         fi
    965     else
    966         echo ""
    967     fi
    968 }
    969 
    970 # gdbclient now determines whether the user wants to debug a 32-bit or 64-bit
    971 # executable, set up the approriate gdbserver, then invokes the proper host
    972 # gdb.
    973 function gdbclient()
    974 {
    975    local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT)
    976    local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED)
    977    local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED)
    978    local OUT_VENDOR_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_VENDOR_SHARED_LIBRARIES_UNSTRIPPED)
    979    local OUT_EXE_SYMBOLS=$(get_symbols_directory)
    980    local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS)
    981    local ARCH=$(get_build_var TARGET_ARCH)
    982    local GDB
    983    case "$ARCH" in
    984        arm) GDB=arm-linux-androideabi-gdb;;
    985        arm64) GDB=arm-linux-androideabi-gdb; GDB64=aarch64-linux-android-gdb;;
    986        mips|mips64) GDB=mips64el-linux-android-gdb;;
    987        x86) GDB=x86_64-linux-android-gdb;;
    988        x86_64) GDB=x86_64-linux-android-gdb;;
    989        *) echo "Unknown arch $ARCH"; return 1;;
    990    esac
    991 
    992    if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then
    993        local EXE="$1"
    994        if [ "$EXE" ] ; then
    995            EXE=$1
    996            if [[ $EXE =~ ^[^/].* ]] ; then
    997                EXE="system/bin/"$EXE
    998            fi
    999        else
   1000            EXE="app_process"
   1001        fi
   1002 
   1003        local PORT="$2"
   1004        if [ "$PORT" ] ; then
   1005            PORT=$2
   1006        else
   1007            PORT=":5039"
   1008        fi
   1009 
   1010        local PID="$3"
   1011        if [ "$PID" ] ; then
   1012            if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then
   1013                PID=`pid $3`
   1014                if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then
   1015                    # that likely didn't work because of returning multiple processes
   1016                    # try again, filtering by root processes (don't contain colon)
   1017                    PID=`adb shell ps | \grep $3 | \grep -v ":" | awk '{print $2}'`
   1018                    if [[ ! "$PID" =~ ^[0-9]+$ ]]
   1019                    then
   1020                        echo "Couldn't resolve '$3' to single PID"
   1021                        return 1
   1022                    else
   1023                        echo ""
   1024                        echo "WARNING: multiple processes matching '$3' observed, using root process"
   1025                        echo ""
   1026                    fi
   1027                fi
   1028            fi
   1029            adb forward "tcp$PORT" "tcp$PORT"
   1030            local USE64BIT="$(is64bit $PID)"
   1031            adb shell gdbserver$USE64BIT $PORT --attach $PID &
   1032            sleep 2
   1033        else
   1034                echo ""
   1035                echo "If you haven't done so already, do this first on the device:"
   1036                echo "    gdbserver $PORT /system/bin/$EXE"
   1037                    echo " or"
   1038                echo "    gdbserver $PORT --attach <PID>"
   1039                echo ""
   1040        fi
   1041 
   1042        OUT_SO_SYMBOLS=$OUT_SO_SYMBOLS$USE64BIT
   1043        OUT_VENDOR_SO_SYMBOLS=$OUT_VENDOR_SO_SYMBOLS$USE64BIT
   1044 
   1045        echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS"
   1046        echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines:$OUT_SO_SYMBOLS/drm:$OUT_SO_SYMBOLS/egl:$OUT_SO_SYMBOLS/soundfx:$OUT_VENDOR_SO_SYMBOLS:$OUT_VENDOR_SO_SYMBOLS/hw:$OUT_VENDOR_SO_SYMBOLS/egl"
   1047        echo >>"$OUT_ROOT/gdbclient.cmds" "source $ANDROID_BUILD_TOP/development/scripts/gdb/dalvik.gdb"
   1048        echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT"
   1049        # Enable special debugging for ART processes.
   1050        if [[ $EXE =~ (^|/)(app_process|dalvikvm)(|32|64)$ ]]; then
   1051           echo >> "$OUT_ROOT/gdbclient.cmds" "art-on"
   1052        fi
   1053        echo >>"$OUT_ROOT/gdbclient.cmds" ""
   1054 
   1055        local WHICH_GDB=
   1056        # 64-bit exe found
   1057        if [ "$USE64BIT" != "" ] ; then
   1058            WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB64
   1059        # 32-bit exe / 32-bit platform
   1060        elif [ "$(get_build_var TARGET_2ND_ARCH)" = "" ]; then
   1061            WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB
   1062        # 32-bit exe / 64-bit platform
   1063        else
   1064            WHICH_GDB=$ANDROID_TOOLCHAIN_2ND_ARCH/$GDB
   1065        fi
   1066 
   1067        gdbwrapper $WHICH_GDB "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE"
   1068   else
   1069        echo "Unable to determine build system output dir."
   1070    fi
   1071 
   1072 }
   1073 
   1074 case `uname -s` in
   1075     Darwin)
   1076         function sgrep()
   1077         {
   1078             find -E . -name .repo -prune -o -name .git -prune -o  -type f -iregex '.*\.(c|h|cc|cpp|S|java|xml|sh|mk|aidl)' -print0 | xargs -0 grep --color -n "$@"
   1079         }
   1080 
   1081         ;;
   1082     *)
   1083         function sgrep()
   1084         {
   1085             find . -name .repo -prune -o -name .git -prune -o  -type f -iregex '.*\.\(c\|h\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\)' -print0 | xargs -0 grep --color -n "$@"
   1086         }
   1087         ;;
   1088 esac
   1089 
   1090 function gettargetarch
   1091 {
   1092     get_build_var TARGET_ARCH
   1093 }
   1094 
   1095 function ggrep()
   1096 {
   1097     find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.gradle" -print0 | xargs -0 grep --color -n "$@"
   1098 }
   1099 
   1100 function jgrep()
   1101 {
   1102     find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@"
   1103 }
   1104 
   1105 function cgrep()
   1106 {
   1107     find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' \) -print0 | xargs -0 grep --color -n "$@"
   1108 }
   1109 
   1110 function resgrep()
   1111 {
   1112     for dir in `find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -name res -type d`; do find $dir -type f -name '*\.xml' -print0 | xargs -0 grep --color -n "$@"; done;
   1113 }
   1114 
   1115 function mangrep()
   1116 {
   1117     find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -name 'AndroidManifest.xml' -print0 | xargs -0 grep --color -n "$@"
   1118 }
   1119 
   1120 function sepgrep()
   1121 {
   1122     find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -name sepolicy -type d -print0 | xargs -0 grep --color -n -r --exclude-dir=\.git "$@"
   1123 }
   1124 
   1125 case `uname -s` in
   1126     Darwin)
   1127         function mgrep()
   1128         {
   1129             find -E . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -print0 | xargs -0 grep --color -n "$@"
   1130         }
   1131 
   1132         function treegrep()
   1133         {
   1134             find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cpp|S|java|xml)' -print0 | xargs -0 grep --color -n -i "$@"
   1135         }
   1136 
   1137         ;;
   1138     *)
   1139         function mgrep()
   1140         {
   1141             find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -type f -print0 | xargs -0 grep --color -n "$@"
   1142         }
   1143 
   1144         function treegrep()
   1145         {
   1146             find . -name .repo -prune -o -name .git -prune -o -regextype posix-egrep -iregex '.*\.(c|h|cpp|S|java|xml)' -type f -print0 | xargs -0 grep --color -n -i "$@"
   1147         }
   1148 
   1149         ;;
   1150 esac
   1151 
   1152 function getprebuilt
   1153 {
   1154     get_abs_build_var ANDROID_PREBUILTS
   1155 }
   1156 
   1157 function tracedmdump()
   1158 {
   1159     T=$(gettop)
   1160     if [ ! "$T" ]; then
   1161         echo "Couldn't locate the top of the tree.  Try setting TOP."
   1162         return
   1163     fi
   1164     local prebuiltdir=$(getprebuilt)
   1165     local arch=$(gettargetarch)
   1166     local KERNEL=$T/prebuilts/qemu-kernel/$arch/vmlinux-qemu
   1167 
   1168     local TRACE=$1
   1169     if [ ! "$TRACE" ] ; then
   1170         echo "usage:  tracedmdump  tracename"
   1171         return
   1172     fi
   1173 
   1174     if [ ! -r "$KERNEL" ] ; then
   1175         echo "Error: cannot find kernel: '$KERNEL'"
   1176         return
   1177     fi
   1178 
   1179     local BASETRACE=$(basename $TRACE)
   1180     if [ "$BASETRACE" = "$TRACE" ] ; then
   1181         TRACE=$ANDROID_PRODUCT_OUT/traces/$TRACE
   1182     fi
   1183 
   1184     echo "post-processing traces..."
   1185     rm -f $TRACE/qtrace.dexlist
   1186     post_trace $TRACE
   1187     if [ $? -ne 0 ]; then
   1188         echo "***"
   1189         echo "*** Error: malformed trace.  Did you remember to exit the emulator?"
   1190         echo "***"
   1191         return
   1192     fi
   1193     echo "generating dexlist output..."
   1194     /bin/ls $ANDROID_PRODUCT_OUT/system/framework/*.jar $ANDROID_PRODUCT_OUT/system/app/*.apk $ANDROID_PRODUCT_OUT/data/app/*.apk 2>/dev/null | xargs dexlist > $TRACE/qtrace.dexlist
   1195     echo "generating dmtrace data..."
   1196     q2dm -r $ANDROID_PRODUCT_OUT/symbols $TRACE $KERNEL $TRACE/dmtrace || return
   1197     echo "generating html file..."
   1198     dmtracedump -h $TRACE/dmtrace >| $TRACE/dmtrace.html || return
   1199     echo "done, see $TRACE/dmtrace.html for details"
   1200     echo "or run:"
   1201     echo "    traceview $TRACE/dmtrace"
   1202 }
   1203 
   1204 # communicate with a running device or emulator, set up necessary state,
   1205 # and run the hat command.
   1206 function runhat()
   1207 {
   1208     # process standard adb options
   1209     local adbTarget=""
   1210     if [ "$1" = "-d" -o "$1" = "-e" ]; then
   1211         adbTarget=$1
   1212         shift 1
   1213     elif [ "$1" = "-s" ]; then
   1214         adbTarget="$1 $2"
   1215         shift 2
   1216     fi
   1217     local adbOptions=${adbTarget}
   1218     #echo adbOptions = ${adbOptions}
   1219 
   1220     # runhat options
   1221     local targetPid=$1
   1222 
   1223     if [ "$targetPid" = "" ]; then
   1224         echo "Usage: runhat [ -d | -e | -s serial ] target-pid"
   1225         return
   1226     fi
   1227 
   1228     # confirm hat is available
   1229     if [ -z $(which hat) ]; then
   1230         echo "hat is not available in this configuration."
   1231         return
   1232     fi
   1233 
   1234     # issue "am" command to cause the hprof dump
   1235     local devFile=/data/local/tmp/hprof-$targetPid
   1236     echo "Poking $targetPid and waiting for data..."
   1237     echo "Storing data at $devFile"
   1238     adb ${adbOptions} shell am dumpheap $targetPid $devFile
   1239     echo "Press enter when logcat shows \"hprof: heap dump completed\""
   1240     echo -n "> "
   1241     read
   1242 
   1243     local localFile=/tmp/$$-hprof
   1244 
   1245     echo "Retrieving file $devFile..."
   1246     adb ${adbOptions} pull $devFile $localFile
   1247 
   1248     adb ${adbOptions} shell rm $devFile
   1249 
   1250     echo "Running hat on $localFile"
   1251     echo "View the output by pointing your browser at http://localhost:7000/"
   1252     echo ""
   1253     hat -JXmx512m $localFile
   1254 }
   1255 
   1256 function getbugreports()
   1257 {
   1258     local reports=(`adb shell ls /sdcard/bugreports | tr -d '\r'`)
   1259 
   1260     if [ ! "$reports" ]; then
   1261         echo "Could not locate any bugreports."
   1262         return
   1263     fi
   1264 
   1265     local report
   1266     for report in ${reports[@]}
   1267     do
   1268         echo "/sdcard/bugreports/${report}"
   1269         adb pull /sdcard/bugreports/${report} ${report}
   1270         gunzip ${report}
   1271     done
   1272 }
   1273 
   1274 function getsdcardpath()
   1275 {
   1276     adb ${adbOptions} shell echo -n \$\{EXTERNAL_STORAGE\}
   1277 }
   1278 
   1279 function getscreenshotpath()
   1280 {
   1281     echo "$(getsdcardpath)/Pictures/Screenshots"
   1282 }
   1283 
   1284 function getlastscreenshot()
   1285 {
   1286     local screenshot_path=$(getscreenshotpath)
   1287     local screenshot=`adb ${adbOptions} ls ${screenshot_path} | grep Screenshot_[0-9-]*.*\.png | sort -rk 3 | cut -d " " -f 4 | head -n 1`
   1288     if [ "$screenshot" = "" ]; then
   1289         echo "No screenshots found."
   1290         return
   1291     fi
   1292     echo "${screenshot}"
   1293     adb ${adbOptions} pull ${screenshot_path}/${screenshot}
   1294 }
   1295 
   1296 function startviewserver()
   1297 {
   1298     local port=4939
   1299     if [ $# -gt 0 ]; then
   1300             port=$1
   1301     fi
   1302     adb shell service call window 1 i32 $port
   1303 }
   1304 
   1305 function stopviewserver()
   1306 {
   1307     adb shell service call window 2
   1308 }
   1309 
   1310 function isviewserverstarted()
   1311 {
   1312     adb shell service call window 3
   1313 }
   1314 
   1315 function key_home()
   1316 {
   1317     adb shell input keyevent 3
   1318 }
   1319 
   1320 function key_back()
   1321 {
   1322     adb shell input keyevent 4
   1323 }
   1324 
   1325 function key_menu()
   1326 {
   1327     adb shell input keyevent 82
   1328 }
   1329 
   1330 function smoketest()
   1331 {
   1332     if [ ! "$ANDROID_PRODUCT_OUT" ]; then
   1333         echo "Couldn't locate output files.  Try running 'lunch' first." >&2
   1334         return
   1335     fi
   1336     T=$(gettop)
   1337     if [ ! "$T" ]; then
   1338         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
   1339         return
   1340     fi
   1341 
   1342     (\cd "$T" && mmm tests/SmokeTest) &&
   1343       adb uninstall com.android.smoketest > /dev/null &&
   1344       adb uninstall com.android.smoketest.tests > /dev/null &&
   1345       adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTestApp.apk &&
   1346       adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTest.apk &&
   1347       adb shell am instrument -w com.android.smoketest.tests/android.test.InstrumentationTestRunner
   1348 }
   1349 
   1350 # simple shortcut to the runtest command
   1351 function runtest()
   1352 {
   1353     T=$(gettop)
   1354     if [ ! "$T" ]; then
   1355         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
   1356         return
   1357     fi
   1358     ("$T"/development/testrunner/runtest.py $@)
   1359 }
   1360 
   1361 function godir () {
   1362     if [[ -z "$1" ]]; then
   1363         echo "Usage: godir <regex>"
   1364         return
   1365     fi
   1366     T=$(gettop)
   1367     if [[ ! -f $T/filelist ]]; then
   1368         echo -n "Creating index..."
   1369         (\cd $T; find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > filelist)
   1370         echo " Done"
   1371         echo ""
   1372     fi
   1373     local lines
   1374     lines=($(\grep "$1" $T/filelist | sed -e 's/\/[^/]*$//' | sort | uniq))
   1375     if [[ ${#lines[@]} = 0 ]]; then
   1376         echo "Not found"
   1377         return
   1378     fi
   1379     local pathname
   1380     local choice
   1381     if [[ ${#lines[@]} > 1 ]]; then
   1382         while [[ -z "$pathname" ]]; do
   1383             local index=1
   1384             local line
   1385             for line in ${lines[@]}; do
   1386                 printf "%6s %s\n" "[$index]" $line
   1387                 index=$(($index + 1))
   1388             done
   1389             echo
   1390             echo -n "Select one: "
   1391             unset choice
   1392             read choice
   1393             if [[ $choice -gt ${#lines[@]} || $choice -lt 1 ]]; then
   1394                 echo "Invalid choice"
   1395                 continue
   1396             fi
   1397             pathname=${lines[$(($choice-1))]}
   1398         done
   1399     else
   1400         pathname=${lines[0]}
   1401     fi
   1402     \cd $T/$pathname
   1403 }
   1404 
   1405 # Force JAVA_HOME to point to java 1.7 or java 1.6  if it isn't already set.
   1406 #
   1407 # Note that the MacOS path for java 1.7 includes a minor revision number (sigh).
   1408 # For some reason, installing the JDK doesn't make it show up in the
   1409 # JavaVM.framework/Versions/1.7/ folder.
   1410 function set_java_home() {
   1411     # Clear the existing JAVA_HOME value if we set it ourselves, so that
   1412     # we can reset it later, depending on the version of java the build
   1413     # system needs.
   1414     #
   1415     # If we don't do this, the JAVA_HOME value set by the first call to
   1416     # build/envsetup.sh will persist forever.
   1417     if [ -n "$ANDROID_SET_JAVA_HOME" ]; then
   1418       export JAVA_HOME=""
   1419     fi
   1420 
   1421     if [ ! "$JAVA_HOME" ]; then
   1422       if [ -n "$LEGACY_USE_JAVA6" ]; then
   1423         case `uname -s` in
   1424             Darwin)
   1425                 export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
   1426                 ;;
   1427             *)
   1428                 export JAVA_HOME=/usr/lib/jvm/java-6-sun
   1429                 ;;
   1430         esac
   1431       else
   1432         case `uname -s` in
   1433             Darwin)
   1434                 export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
   1435                 ;;
   1436             *)
   1437                 export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
   1438                 ;;
   1439         esac
   1440       fi
   1441 
   1442       # Keep track of the fact that we set JAVA_HOME ourselves, so that
   1443       # we can change it on the next envsetup.sh, if required.
   1444       export ANDROID_SET_JAVA_HOME=true
   1445     fi
   1446 }
   1447 
   1448 # Print colored exit condition
   1449 function pez {
   1450     "$@"
   1451     local retval=$?
   1452     if [ $retval -ne 0 ]
   1453     then
   1454         echo -e "\e[0;31mFAILURE\e[00m"
   1455     else
   1456         echo -e "\e[0;32mSUCCESS\e[00m"
   1457     fi
   1458     return $retval
   1459 }
   1460 
   1461 function get_make_command()
   1462 {
   1463   echo command make
   1464 }
   1465 
   1466 function make()
   1467 {
   1468     local start_time=$(date +"%s")
   1469     $(get_make_command) "$@"
   1470     local ret=$?
   1471     local end_time=$(date +"%s")
   1472     local tdiff=$(($end_time-$start_time))
   1473     local hours=$(($tdiff / 3600 ))
   1474     local mins=$((($tdiff % 3600) / 60))
   1475     local secs=$(($tdiff % 60))
   1476     echo
   1477     if [ $ret -eq 0 ] ; then
   1478         echo -n -e "#### make completed successfully "
   1479     else
   1480         echo -n -e "#### make failed to build some targets "
   1481     fi
   1482     if [ $hours -gt 0 ] ; then
   1483         printf "(%02g:%02g:%02g (hh:mm:ss))" $hours $mins $secs
   1484     elif [ $mins -gt 0 ] ; then
   1485         printf "(%02g:%02g (mm:ss))" $mins $secs
   1486     elif [ $secs -gt 0 ] ; then
   1487         printf "(%s seconds)" $secs
   1488     fi
   1489     echo -e " ####"
   1490     echo
   1491     return $ret
   1492 }
   1493 
   1494 
   1495 
   1496 if [ "x$SHELL" != "x/bin/bash" ]; then
   1497     case `ps -o command -p $$` in
   1498         *bash*)
   1499             ;;
   1500         *)
   1501             echo "WARNING: Only bash is supported, use of other shell would lead to erroneous results"
   1502             ;;
   1503     esac
   1504 fi
   1505 
   1506 # Execute the contents of any vendorsetup.sh files we can find.
   1507 for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null` \
   1508          `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null`
   1509 do
   1510     echo "including $f"
   1511     . $f
   1512 done
   1513 unset f
   1514 
   1515 addcompletions
   1516