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