envsetup.sh revision a8c14e8c33c5af8a388f40517dfb40d6305c6386
1function help() {
2cat <<EOF
3Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
4- croot:   Changes directory to the top of the tree.
5- m:       Makes from the top of the tree.
6- mm:      Builds all of the modules in the current directory.
7- mmm:     Builds all of the modules in the supplied directories.
8- cgrep:   Greps on all local C/C++ files.
9- jgrep:   Greps on all local Java files.
10- resgrep: Greps on all local res/*.xml files.
11- godir:   Go to the directory containing a file.
12
13Look at the source to view more functions. The complete list is:
14EOF
15    T=$(gettop)
16    local A
17    A=""
18    for i in `cat $T/build/envsetup.sh | sed -n "/^function /s/function \([a-z_]*\).*/\1/p" | sort`; do
19      A="$A $i"
20    done
21    echo $A
22}
23
24# Get the value of a build variable as an absolute path.
25function get_abs_build_var()
26{
27    T=$(gettop)
28    if [ ! "$T" ]; then
29        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
30        return
31    fi
32    CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
33      make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-abs-$1
34}
35
36# Get the exact value of a build variable.
37function get_build_var()
38{
39    T=$(gettop)
40    if [ ! "$T" ]; then
41        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
42        return
43    fi
44    CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
45      make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$1
46}
47
48# check to see if the supplied product is one we can build
49function check_product()
50{
51    T=$(gettop)
52    if [ ! "$T" ]; then
53        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
54        return
55    fi
56    CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
57        TARGET_PRODUCT=$1 TARGET_BUILD_VARIANT= \
58        TARGET_SIMULATOR= TARGET_BUILD_TYPE= \
59        get_build_var TARGET_DEVICE > /dev/null
60    # hide successful answers, but allow the errors to show
61}
62
63VARIANT_CHOICES=(user userdebug eng)
64
65# check to see if the supplied variant is valid
66function check_variant()
67{
68    for v in ${VARIANT_CHOICES[@]}
69    do
70        if [ "$v" = "$1" ]
71        then
72            return 0
73        fi
74    done
75    return 1
76}
77
78function setpaths()
79{
80    T=$(gettop)
81    if [ ! "$T" ]; then
82        echo "Couldn't locate the top of the tree.  Try setting TOP."
83        return
84    fi
85
86    ##################################################################
87    #                                                                #
88    #              Read me before you modify this code               #
89    #                                                                #
90    #   This function sets ANDROID_BUILD_PATHS to what it is adding  #
91    #   to PATH, and the next time it is run, it removes that from   #
92    #   PATH.  This is required so lunch can be run more than once   #
93    #   and still have working paths.                                #
94    #                                                                #
95    ##################################################################
96
97    # out with the old
98    if [ -n $ANDROID_BUILD_PATHS ] ; then
99        export PATH=${PATH/$ANDROID_BUILD_PATHS/}
100    fi
101
102    # and in with the new
103    CODE_REVIEWS=
104    prebuiltdir=$(getprebuilt)
105    export ANDROID_EABI_TOOLCHAIN=$prebuiltdir/toolchain/arm-eabi-4.2.1/bin
106    export ANDROID_TOOLCHAIN=$ANDROID_EABI_TOOLCHAIN
107    export ANDROID_QTOOLS=$T/development/emulator/qtools
108    export ANDROID_BUILD_PATHS=:$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_QTOOLS:$ANDROID_TOOLCHAIN:$ANDROID_EABI_TOOLCHAIN$CODE_REVIEWS
109    export PATH=$PATH$ANDROID_BUILD_PATHS
110
111    unset ANDROID_PRODUCT_OUT
112    export ANDROID_PRODUCT_OUT=$(get_abs_build_var PRODUCT_OUT)
113    export OUT=$ANDROID_PRODUCT_OUT
114
115    # needed for building linux on MacOS
116    # TODO: fix the path
117    #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include
118
119    # needed for OProfile to post-process collected samples
120    export OPROFILE_EVENTS_DIR=$prebuiltdir/oprofile
121}
122
123function printconfig()
124{
125    T=$(gettop)
126    if [ ! "$T" ]; then
127        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
128        return
129    fi
130    get_build_var report_config
131}
132
133function set_stuff_for_environment()
134{
135    settitle
136    setpaths
137    set_sequence_number
138
139    # Don't try to do preoptimization until it works better on OSX.
140    export DISABLE_DEXPREOPT=true
141
142    export ANDROID_BUILD_TOP=$(gettop)
143}
144
145function set_sequence_number()
146{
147    export BUILD_ENV_SEQUENCE_NUMBER=9
148}
149
150function settitle()
151{
152    if [ "$STAY_OFF_MY_LAWN" = "" ]; then
153        local product=$(get_build_var TARGET_PRODUCT)
154        local variant=$(get_build_var TARGET_BUILD_VARIANT)
155        export PROMPT_COMMAND="echo -ne \"\033]0;[${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\""
156    fi
157}
158
159case `uname -s` in
160    Linux)
161        function choosesim()
162        {
163            echo "Build for the simulator or the device?"
164            echo "     1. Device"
165            echo "     2. Simulator"
166            echo
167
168            export TARGET_SIMULATOR=
169            local ANSWER
170            while [ -z $TARGET_SIMULATOR ]
171            do
172                echo -n "Which would you like? [1] "
173                if [ -z "$1" ] ; then
174                    read ANSWER
175                else
176                    echo $1
177                    ANSWER=$1
178                fi
179                case $ANSWER in
180                "")
181                    export TARGET_SIMULATOR=false
182                    ;;
183                1)
184                    export TARGET_SIMULATOR=false
185                    ;;
186                Device)
187                    export TARGET_SIMULATOR=false
188                    ;;
189                2)
190                    export TARGET_SIMULATOR=true
191                    ;;
192                Simulator)
193                    export TARGET_SIMULATOR=true
194                    ;;
195                *)
196                    echo
197                    echo "I didn't understand your response.  Please try again."
198                    echo
199                    ;;
200                esac
201                if [ -n "$1" ] ; then
202                    break
203                fi
204            done
205
206            set_stuff_for_environment
207        }
208        ;;
209    *)
210        function choosesim()
211        {
212            echo "Only device builds are supported for" `uname -s`
213            echo "     Forcing TARGET_SIMULATOR=false"
214            echo
215            if [ -z "$1" ]
216            then
217                echo -n "Press enter: "
218                read
219            fi
220
221            export TARGET_SIMULATOR=false
222            set_stuff_for_environment
223        }
224        ;;
225esac
226
227function choosetype()
228{
229    echo "Build type choices are:"
230    echo "     1. release"
231    echo "     2. debug"
232    echo
233
234    local DEFAULT_NUM DEFAULT_VALUE
235    if [ $TARGET_SIMULATOR = "false" ] ; then
236        DEFAULT_NUM=1
237        DEFAULT_VALUE=release
238    else
239        DEFAULT_NUM=2
240        DEFAULT_VALUE=debug
241    fi
242
243    export TARGET_BUILD_TYPE=
244    local ANSWER
245    while [ -z $TARGET_BUILD_TYPE ]
246    do
247        echo -n "Which would you like? ["$DEFAULT_NUM"] "
248        if [ -z "$1" ] ; then
249            read ANSWER
250        else
251            echo $1
252            ANSWER=$1
253        fi
254        case $ANSWER in
255        "")
256            export TARGET_BUILD_TYPE=$DEFAULT_VALUE
257            ;;
258        1)
259            export TARGET_BUILD_TYPE=release
260            ;;
261        release)
262            export TARGET_BUILD_TYPE=release
263            ;;
264        2)
265            export TARGET_BUILD_TYPE=debug
266            ;;
267        debug)
268            export TARGET_BUILD_TYPE=debug
269            ;;
270        *)
271            echo
272            echo "I didn't understand your response.  Please try again."
273            echo
274            ;;
275        esac
276        if [ -n "$1" ] ; then
277            break
278        fi
279    done
280
281    set_stuff_for_environment
282}
283
284#
285# This function isn't really right:  It chooses a TARGET_PRODUCT
286# based on the list of boards.  Usually, that gets you something
287# that kinda works with a generic product, but really, you should
288# pick a product by name.
289#
290function chooseproduct()
291{
292    if [ "x$TARGET_PRODUCT" != x ] ; then
293        default_value=$TARGET_PRODUCT
294    else
295        if [ "$TARGET_SIMULATOR" = true ] ; then
296            default_value=sim
297        else
298            default_value=generic
299        fi
300    fi
301
302    export TARGET_PRODUCT=
303    local ANSWER
304    while [ -z "$TARGET_PRODUCT" ]
305    do
306        echo -n "Which product would you like? [$default_value] "
307        if [ -z "$1" ] ; then
308            read ANSWER
309        else
310            echo $1
311            ANSWER=$1
312        fi
313
314        if [ -z "$ANSWER" ] ; then
315            export TARGET_PRODUCT=$default_value
316        else
317            if check_product $ANSWER
318            then
319                export TARGET_PRODUCT=$ANSWER
320            else
321                echo "** Not a valid product: $ANSWER"
322            fi
323        fi
324        if [ -n "$1" ] ; then
325            break
326        fi
327    done
328
329    set_stuff_for_environment
330}
331
332function choosevariant()
333{
334    echo "Variant choices are:"
335    local index=1
336    local v
337    for v in ${VARIANT_CHOICES[@]}
338    do
339        # The product name is the name of the directory containing
340        # the makefile we found, above.
341        echo "     $index. $v"
342        index=$(($index+1))
343    done
344
345    local default_value=eng
346    local ANSWER
347
348    export TARGET_BUILD_VARIANT=
349    while [ -z "$TARGET_BUILD_VARIANT" ]
350    do
351        echo -n "Which would you like? [$default_value] "
352        if [ -z "$1" ] ; then
353            read ANSWER
354        else
355            echo $1
356            ANSWER=$1
357        fi
358
359        if [ -z "$ANSWER" ] ; then
360            export TARGET_BUILD_VARIANT=$default_value
361        elif (echo -n $ANSWER | grep -q -e "^[0-9][0-9]*$") ; then
362            if [ "$ANSWER" -le "${#VARIANT_CHOICES[@]}" ] ; then
363                export TARGET_BUILD_VARIANT=${VARIANT_CHOICES[$(($ANSWER-$_arrayoffset))]}
364            fi
365        else
366            if check_variant $ANSWER
367            then
368                export TARGET_BUILD_VARIANT=$ANSWER
369            else
370                echo "** Not a valid variant: $ANSWER"
371            fi
372        fi
373        if [ -n "$1" ] ; then
374            break
375        fi
376    done
377}
378
379function tapas()
380{
381    choosecombo
382}
383
384function choosecombo()
385{
386    choosesim $1
387
388    echo
389    echo
390    choosetype $2
391
392    echo
393    echo
394    chooseproduct $3
395
396    echo
397    echo
398    choosevariant $4
399
400    echo
401    set_stuff_for_environment
402    printconfig
403}
404
405# Clear this variable.  It will be built up again when the vendorsetup.sh
406# files are included at the end of this file.
407unset LUNCH_MENU_CHOICES
408function add_lunch_combo()
409{
410    local new_combo=$1
411    local c
412    for c in ${LUNCH_MENU_CHOICES[@]} ; do
413        if [ "$new_combo" = "$c" ] ; then
414            return
415        fi
416    done
417    LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)
418}
419
420# add the default one here
421add_lunch_combo generic-eng
422
423# if we're on linux, add the simulator.  There is a special case
424# in lunch to deal with the simulator
425if [ "$(uname)" = "Linux" ] ; then
426    add_lunch_combo simulator
427fi
428
429function print_lunch_menu()
430{
431    local uname=$(uname)
432    echo
433    echo "You're building on" $uname
434    echo
435    echo ${LUNCH_MENU_CHOICES[@]}
436    echo "Lunch menu... pick a combo:"
437
438    local i=1
439    local choice
440    for choice in ${LUNCH_MENU_CHOICES[@]}
441    do
442        echo "     $i. $choice"
443        i=$(($i+1))
444    done
445
446    echo
447}
448
449function lunch()
450{
451    local answer
452
453    if [ "$1" ] ; then
454        answer=$1
455    else
456        print_lunch_menu
457        echo -n "Which would you like? [generic-eng] "
458        read answer
459    fi
460
461    local selection=
462
463    if [ -z "$answer" ]
464    then
465        selection=generic-eng
466    elif [ "$answer" = "simulator" ]
467    then
468        selection=simulator
469    elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
470    then
471        if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
472        then
473            selection=${LUNCH_MENU_CHOICES[$(($answer-$_arrayoffset))]}
474        fi
475    elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")
476    then
477        selection=$answer
478    fi
479
480    if [ -z "$selection" ]
481    then
482        echo
483        echo "Invalid lunch combo: $answer"
484        return 1
485    fi
486
487    # special case the simulator
488    if [ "$selection" = "simulator" ]
489    then
490        export TARGET_PRODUCT=sim
491        export TARGET_BUILD_VARIANT=eng
492        export TARGET_SIMULATOR=true
493        export TARGET_BUILD_TYPE=debug
494    else
495        local product=$(echo -n $selection | sed -e "s/-.*$//")
496        check_product $product
497        if [ $? -ne 0 ]
498        then
499            echo
500            echo "** Don't have a product spec for: '$product'"
501            echo "** Do you have the right repo manifest?"
502            product=
503        fi
504
505        local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")
506        check_variant $variant
507        if [ $? -ne 0 ]
508        then
509            echo
510            echo "** Invalid variant: '$variant'"
511            echo "** Must be one of ${VARIANT_CHOICES[@]}"
512            variant=
513        fi
514
515        if [ -z "$product" -o -z "$variant" ]
516        then
517            echo
518            return 1
519        fi
520
521        export TARGET_PRODUCT=$product
522        export TARGET_BUILD_VARIANT=$variant
523        export TARGET_SIMULATOR=false
524        export TARGET_BUILD_TYPE=release
525    fi # !simulator
526
527    echo
528
529    set_stuff_for_environment
530    printconfig
531}
532
533function gettop
534{
535    local TOPFILE=build/core/envsetup.mk
536    if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then
537        echo $TOP
538    else
539        if [ -f $TOPFILE ] ; then
540            echo $PWD
541        else
542            # We redirect cd to /dev/null in case it's aliased to
543            # a command that prints something as a side-effect
544            # (like pushd)
545            local HERE=$PWD
546            T=
547            while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
548                cd .. > /dev/null
549                T=$PWD
550            done
551            cd $HERE > /dev/null
552            if [ -f "$T/$TOPFILE" ]; then
553                echo $T
554            fi
555        fi
556    fi
557}
558
559function m()
560{
561    T=$(gettop)
562    if [ "$T" ]; then
563        make -C $T $@
564    else
565        echo "Couldn't locate the top of the tree.  Try setting TOP."
566    fi
567}
568
569function findmakefile()
570{
571    TOPFILE=build/core/envsetup.mk
572    # We redirect cd to /dev/null in case it's aliased to
573    # a command that prints something as a side-effect
574    # (like pushd)
575    local HERE=$PWD
576    T=
577    while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
578        T=$PWD
579        if [ -f "$T/Android.mk" ]; then
580            echo $T/Android.mk
581            cd $HERE > /dev/null
582            return
583        fi
584        cd .. > /dev/null
585    done
586    cd $HERE > /dev/null
587}
588
589function mm()
590{
591    # If we're sitting in the root of the build tree, just do a
592    # normal make.
593    if [ -f build/core/envsetup.mk -a -f Makefile ]; then
594        make $@
595    else
596        # Find the closest Android.mk file.
597        T=$(gettop)
598        local M=$(findmakefile)
599        if [ ! "$T" ]; then
600            echo "Couldn't locate the top of the tree.  Try setting TOP."
601        elif [ ! "$M" ]; then
602            echo "Couldn't locate a makefile from the current directory."
603        else
604            ONE_SHOT_MAKEFILE=$M make -C $T files $@
605        fi
606    fi
607}
608
609function mmm()
610{
611    T=$(gettop)
612    if [ "$T" ]; then
613        local MAKEFILE=
614        local ARGS=
615        local DIR TO_CHOP
616        local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
617        local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
618        for DIR in $DIRS ; do
619            DIR=`echo $DIR | sed -e 's:/$::'`
620            if [ -f $DIR/Android.mk ]; then
621                TO_CHOP=`echo $T | wc -c | tr -d ' '`
622                TO_CHOP=`expr $TO_CHOP + 1`
623                MFILE=`echo $PWD | cut -c${TO_CHOP}-`
624                if [ "$MFILE" = "" ] ; then
625                    MFILE=$DIR/Android.mk
626                else
627                    MFILE=$MFILE/$DIR/Android.mk
628                fi
629                MAKEFILE="$MAKEFILE $MFILE"
630            else
631                if [ "$DIR" = snod ]; then
632                    ARGS="$ARGS snod"
633                elif [ "$DIR" = showcommands ]; then
634                    ARGS="$ARGS showcommands"
635                else
636                    echo "No Android.mk in $DIR."
637                fi
638            fi
639        done
640        ONE_SHOT_MAKEFILE="$MAKEFILE" make -C $T $DASH_ARGS files $ARGS
641    else
642        echo "Couldn't locate the top of the tree.  Try setting TOP."
643    fi
644}
645
646function croot()
647{
648    T=$(gettop)
649    if [ "$T" ]; then
650        cd $(gettop)
651    else
652        echo "Couldn't locate the top of the tree.  Try setting TOP."
653    fi
654}
655
656function pid()
657{
658   local EXE="$1"
659   if [ "$EXE" ] ; then
660       local PID=`adb shell ps | fgrep $1 | sed -e 's/[^ ]* *\([0-9]*\).*/\1/'`
661       echo "$PID"
662   else
663       echo "usage: pid name"
664   fi
665}
666
667function gdbclient()
668{
669   local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT)
670   local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED)
671   local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED)
672   local OUT_EXE_SYMBOLS=$(get_abs_build_var TARGET_OUT_EXECUTABLES_UNSTRIPPED)
673   local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS)
674   if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then
675       local EXE="$1"
676       if [ "$EXE" ] ; then
677           EXE=$1
678       else
679           EXE="app_process"
680       fi
681
682       local PORT="$2"
683       if [ "$PORT" ] ; then
684           PORT=$2
685       else
686           PORT=":5039"
687       fi
688
689       local PID
690       local PROG="$3"
691       if [ "$PROG" ] ; then
692           PID=`pid $3`
693           adb forward "tcp$PORT" "tcp$PORT"
694           adb shell gdbserver $PORT --attach $PID &
695           sleep 2
696       else
697               echo ""
698               echo "If you haven't done so already, do this first on the device:"
699               echo "    gdbserver $PORT /system/bin/$EXE"
700                   echo " or"
701               echo "    gdbserver $PORT --attach $PID"
702               echo ""
703       fi
704
705       echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS"
706       echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS"
707       echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT"
708       echo >>"$OUT_ROOT/gdbclient.cmds" ""
709
710       arm-eabi-gdb -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE"
711  else
712       echo "Unable to determine build system output dir."
713   fi
714
715}
716
717case `uname -s` in
718    Darwin)
719        function sgrep()
720        {
721            find -E . -type f -iregex '.*\.(c|h|cpp|S|java|xml)' -print0 | xargs -0 grep --color -n "$@"
722        }
723
724        ;;
725    *)
726        function sgrep()
727        {
728            find . -type f -iregex '.*\.\(c\|h\|cpp\|S\|java\|xml\)' -print0 | xargs -0 grep --color -n "$@"
729        }
730        ;;
731esac
732
733function jgrep()
734{
735    find . -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@"
736}
737
738function cgrep()
739{
740    find . -type f -name "*\.c*" -print0 | xargs -0 grep --color -n "$@"
741}
742
743function resgrep()
744{
745    for dir in `find . -name res -type d`; do find $dir -type f -name '*\.xml' -print0 | xargs -0 grep --color -n "$@"; done;
746}
747
748case `uname -s` in
749    Darwin)
750        function mgrep()
751        {
752            find -E . -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -print0 | xargs -0 grep --color -n "$@"
753        }
754
755        function treegrep()
756        {
757            find -E . -type f -iregex '.*\.(c|h|cpp|S|java|xml)' -print0 | xargs -0 grep --color -n -i "$@"
758        }
759
760        ;;
761    *)
762        function mgrep()
763        {
764            find . -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -type f -print0 | xargs -0 grep --color -n "$@"
765        }
766
767        function treegrep()
768        {
769            find . -regextype posix-egrep -iregex '.*\.(c|h|cpp|S|java|xml)' -type f -print0 | xargs -0 grep --color -n -i "$@"
770        }
771
772        ;;
773esac
774
775function getprebuilt
776{
777    get_abs_build_var ANDROID_PREBUILTS
778}
779
780function tracedmdump()
781{
782    T=$(gettop)
783    if [ ! "$T" ]; then
784        echo "Couldn't locate the top of the tree.  Try setting TOP."
785        return
786    fi
787    local prebuiltdir=$(getprebuilt)
788    local KERNEL=$T/prebuilt/android-arm/kernel/vmlinux-qemu
789
790    local TRACE=$1
791    if [ ! "$TRACE" ] ; then
792        echo "usage:  tracedmdump  tracename"
793        return
794    fi
795
796    if [ ! -r "$KERNEL" ] ; then
797        echo "Error: cannot find kernel: '$KERNEL'"
798        return
799    fi
800
801    local BASETRACE=$(basename $TRACE)
802    if [ "$BASETRACE" = "$TRACE" ] ; then
803        TRACE=$ANDROID_PRODUCT_OUT/traces/$TRACE
804    fi
805
806    echo "post-processing traces..."
807    rm -f $TRACE/qtrace.dexlist
808    post_trace $TRACE
809    if [ $? -ne 0 ]; then
810        echo "***"
811        echo "*** Error: malformed trace.  Did you remember to exit the emulator?"
812        echo "***"
813        return
814    fi
815    echo "generating dexlist output..."
816    /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
817    echo "generating dmtrace data..."
818    q2dm -r $ANDROID_PRODUCT_OUT/symbols $TRACE $KERNEL $TRACE/dmtrace || return
819    echo "generating html file..."
820    dmtracedump -h $TRACE/dmtrace >| $TRACE/dmtrace.html || return
821    echo "done, see $TRACE/dmtrace.html for details"
822    echo "or run:"
823    echo "    traceview $TRACE/dmtrace"
824}
825
826# communicate with a running device or emulator, set up necessary state,
827# and run the hat command.
828function runhat()
829{
830    # process standard adb options
831    local adbTarget=""
832    if [ $1 = "-d" -o $1 = "-e" ]; then
833        adbTarget=$1
834        shift 1
835    elif [ $1 = "-s" ]; then
836        adbTarget="$1 $2"
837        shift 2
838    fi
839    local adbOptions=${adbTarget}
840    echo adbOptions = ${adbOptions}
841
842    # runhat options
843    local targetPid=$1
844    local outputFile=$2
845
846    if [ "$targetPid" = "" ]; then
847        echo "Usage: runhat [ -d | -e | -s serial ] target-pid [output-file]"
848        return
849    fi
850
851    # confirm hat is available
852    if [ -z $(which hat) ]; then
853        echo "hat is not available in this configuration."
854        return
855    fi
856
857    adb ${adbOptions} shell >/dev/null mkdir /data/misc
858    adb ${adbOptions} shell chmod 777 /data/misc
859
860    # send a SIGUSR1 to cause the hprof dump
861    echo "Poking $targetPid and waiting for data..."
862    adb ${adbOptions} shell kill -10 $targetPid
863    echo "Press enter when logcat shows \"hprof: heap dump completed\""
864    echo -n "> "
865    read
866
867    local availFiles=( $(adb ${adbOptions} shell ls /data/misc | grep '^heap-dump' | sed -e 's/.*heap-dump-/heap-dump-/' | sort -r | tr '[:space:][:cntrl:]' ' ') )
868    local devFile=/data/misc/${availFiles[0]}
869    local localFile=/tmp/$$-hprof
870
871    echo "Retrieving file $devFile..."
872    adb ${adbOptions} pull $devFile $localFile
873
874    adb ${adbOptions} shell rm $devFile
875
876    echo "Running hat on $localFile"
877    echo "View the output by pointing your browser at http://localhost:7000/"
878    echo ""
879    hat $localFile
880}
881
882function getbugreports()
883{
884    local reports=(`adb shell ls /sdcard/bugreports | tr -d '\r'`)
885
886    if [ ! "$reports" ]; then
887        echo "Could not locate any bugreports."
888        return
889    fi
890
891    local report
892    for report in ${reports[@]}
893    do
894        echo "/sdcard/bugreports/${report}"
895        adb pull /sdcard/bugreports/${report} ${report}
896        gunzip ${report}
897    done
898}
899
900function startviewserver()
901{
902    local port=4939
903    if [ $# -gt 0 ]; then
904            port=$1
905    fi
906    adb shell service call window 1 i32 $port
907}
908
909function stopviewserver()
910{
911    adb shell service call window 2
912}
913
914function isviewserverstarted()
915{
916    adb shell service call window 3
917}
918
919function smoketest()
920{
921    if [ ! "$ANDROID_PRODUCT_OUT" ]; then
922        echo "Couldn't locate output files.  Try running 'lunch' first." >&2
923        return
924    fi
925    T=$(gettop)
926    if [ ! "$T" ]; then
927        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
928        return
929    fi
930
931    (cd "$T" && mmm tests/SmokeTest) &&
932      adb uninstall com.android.smoketest > /dev/null &&
933      adb uninstall com.android.smoketest.tests > /dev/null &&
934      adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTestApp.apk &&
935      adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTest.apk &&
936      adb shell am instrument -w com.android.smoketest.tests/android.test.InstrumentationTestRunner
937}
938
939# simple shortcut to the runtest command
940function runtest()
941{
942    T=$(gettop)
943    if [ ! "$T" ]; then
944        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
945        return
946    fi
947    (cd "$T" && development/testrunner/runtest.py $@)
948}
949
950# TODO: Remove this some time after 1 June 2009
951function runtest_py()
952{
953    echo "runtest_py is obsolete; use runtest instead" >&2
954    return 1
955}
956
957function godir () {
958    if [[ -z "$1" ]]; then
959        echo "Usage: godir <regex>"
960        return
961    fi
962    if [[ ! -f $T/filelist ]]; then
963        echo -n "Creating index..."
964        (cd $T; find . -wholename ./out -prune -o -type f > filelist)
965        echo " Done"
966        echo ""
967    fi
968    local lines
969    lines=($(grep "$1" $T/filelist | sed -e 's/\/[^/]*$//' | sort | uniq)) 
970    if [[ ${#lines[@]} = 0 ]]; then
971        echo "Not found"
972        return
973    fi
974    local pathname
975    local choice
976    if [[ ${#lines[@]} > 1 ]]; then
977        while [[ -z "$pathname" ]]; do
978            local index=1
979            local line
980            for line in ${lines[@]}; do
981                printf "%6s %s\n" "[$index]" $line
982                index=$(($index + 1)) 
983            done
984            echo
985            echo -n "Select one: "
986            unset choice
987            read choice
988            if [[ $choice -gt ${#lines[@]} || $choice -lt 1 ]]; then
989                echo "Invalid choice"
990                continue
991            fi
992            pathname=${lines[$(($choice-$_arrayoffset))]}
993        done
994    else
995        # even though zsh arrays are 1-based, $foo[0] is an alias for $foo[1]
996        pathname=${lines[0]}
997    fi
998    cd $T/$pathname
999}
1000
1001# determine whether arrays are zero-based (bash) or one-based (zsh)
1002_xarray=(a b c)
1003if [ -z "${_xarray[${#_xarray[@]}]}" ]
1004then
1005    _arrayoffset=1
1006else
1007    _arrayoffset=0
1008fi
1009unset _xarray
1010
1011# Execute the contents of any vendorsetup.sh files we can find.
1012for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/build/vendorsetup.sh 2> /dev/null`
1013do
1014    echo "including $f"
1015    . $f
1016done
1017unset f
1018