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