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