envsetup.sh revision 0188414bc634798fa429be627cdb697daee68966
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 TARGET_BUILD_APPS= \ 60 get_build_var TARGET_DEVICE > /dev/null 61 # hide successful answers, but allow the errors to show 62} 63 64VARIANT_CHOICES=(user userdebug eng) 65 66# check to see if the supplied variant is valid 67function 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 79function 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 124function 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 134function 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 146function set_sequence_number() 147{ 148 export BUILD_ENV_SEQUENCE_NUMBER=9 149} 150 151function 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 165case `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 ;; 231esac 232 233function 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# 296function 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 338function 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 385function 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. 408unset LUNCH_MENU_CHOICES 409function 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 422add_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 426if [ "$(uname)" = "Linux" ] ; then 427 add_lunch_combo simulator 428fi 429 430function 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 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 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) 537function 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 if [ -z "$apps" ]; then 550 apps=all 551 fi 552 553 export TARGET_PRODUCT=generic 554 export TARGET_BUILD_VARIANT=$variant 555 export TARGET_SIMULATOR=false 556 export TARGET_BUILD_TYPE=release 557 export TARGET_BUILD_APPS=$apps 558 559 set_stuff_for_environment 560 printconfig 561} 562 563function gettop 564{ 565 local TOPFILE=build/core/envsetup.mk 566 if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then 567 echo $TOP 568 else 569 if [ -f $TOPFILE ] ; then 570 # The following circumlocution (repeated below as well) ensures 571 # that we record the true directory name and not one that is 572 # faked up with symlink names. 573 PWD= /bin/pwd 574 else 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 cd .. > /dev/null 582 T=`PWD= /bin/pwd` 583 done 584 cd $HERE > /dev/null 585 if [ -f "$T/$TOPFILE" ]; then 586 echo $T 587 fi 588 fi 589 fi 590} 591 592function m() 593{ 594 T=$(gettop) 595 if [ "$T" ]; then 596 make -C $T $@ 597 else 598 echo "Couldn't locate the top of the tree. Try setting TOP." 599 fi 600} 601 602function findmakefile() 603{ 604 TOPFILE=build/core/envsetup.mk 605 # We redirect cd to /dev/null in case it's aliased to 606 # a command that prints something as a side-effect 607 # (like pushd) 608 local HERE=$PWD 609 T= 610 while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do 611 T=$PWD 612 if [ -f "$T/Android.mk" ]; then 613 echo $T/Android.mk 614 cd $HERE > /dev/null 615 return 616 fi 617 cd .. > /dev/null 618 done 619 cd $HERE > /dev/null 620} 621 622function mm() 623{ 624 # If we're sitting in the root of the build tree, just do a 625 # normal make. 626 if [ -f build/core/envsetup.mk -a -f Makefile ]; then 627 make $@ 628 else 629 # Find the closest Android.mk file. 630 T=$(gettop) 631 local M=$(findmakefile) 632 # Remove the path to top as the makefilepath needs to be relative 633 local M=`echo $M|sed 's:'$T'/::'` 634 if [ ! "$T" ]; then 635 echo "Couldn't locate the top of the tree. Try setting TOP." 636 elif [ ! "$M" ]; then 637 echo "Couldn't locate a makefile from the current directory." 638 else 639 ONE_SHOT_MAKEFILE=$M make -C $T all_modules $@ 640 fi 641 fi 642} 643 644function mmm() 645{ 646 T=$(gettop) 647 if [ "$T" ]; then 648 local MAKEFILE= 649 local ARGS= 650 local DIR TO_CHOP 651 local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') 652 local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') 653 for DIR in $DIRS ; do 654 DIR=`echo $DIR | sed -e 's:/$::'` 655 if [ -f $DIR/Android.mk ]; then 656 TO_CHOP=`echo $T | wc -c | tr -d ' '` 657 TO_CHOP=`expr $TO_CHOP + 1` 658 START=`PWD= /bin/pwd` 659 MFILE=`echo $START | cut -c${TO_CHOP}-` 660 if [ "$MFILE" = "" ] ; then 661 MFILE=$DIR/Android.mk 662 else 663 MFILE=$MFILE/$DIR/Android.mk 664 fi 665 MAKEFILE="$MAKEFILE $MFILE" 666 else 667 if [ "$DIR" = snod ]; then 668 ARGS="$ARGS snod" 669 elif [ "$DIR" = showcommands ]; then 670 ARGS="$ARGS showcommands" 671 elif [ "$DIR" = dist ]; then 672 ARGS="$ARGS dist" 673 else 674 echo "No Android.mk in $DIR." 675 return 1 676 fi 677 fi 678 done 679 ONE_SHOT_MAKEFILE="$MAKEFILE" make -C $T $DASH_ARGS all_modules $ARGS 680 else 681 echo "Couldn't locate the top of the tree. Try setting TOP." 682 fi 683} 684 685function croot() 686{ 687 T=$(gettop) 688 if [ "$T" ]; then 689 cd $(gettop) 690 else 691 echo "Couldn't locate the top of the tree. Try setting TOP." 692 fi 693} 694 695function cproj() 696{ 697 TOPFILE=build/core/envsetup.mk 698 # We redirect cd to /dev/null in case it's aliased to 699 # a command that prints something as a side-effect 700 # (like pushd) 701 local HERE=$PWD 702 T= 703 while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do 704 T=$PWD 705 if [ -f "$T/Android.mk" ]; then 706 cd $T 707 return 708 fi 709 cd .. > /dev/null 710 done 711 cd $HERE > /dev/null 712 echo "can't find Android.mk" 713} 714 715function pid() 716{ 717 local EXE="$1" 718 if [ "$EXE" ] ; then 719 local PID=`adb shell ps | fgrep $1 | sed -e 's/[^ ]* *\([0-9]*\).*/\1/'` 720 echo "$PID" 721 else 722 echo "usage: pid name" 723 fi 724} 725 726# systemstack - dump the current stack trace of all threads in the system process 727# to the usual ANR traces file 728function systemstack() 729{ 730 adb shell echo '""' '>>' /data/anr/traces.txt && adb shell chmod 776 /data/anr/traces.txt && adb shell kill -3 $(pid system_server) 731} 732 733function gdbclient() 734{ 735 local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT) 736 local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED) 737 local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED) 738 local OUT_EXE_SYMBOLS=$(get_abs_build_var TARGET_OUT_EXECUTABLES_UNSTRIPPED) 739 local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS) 740 if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then 741 local EXE="$1" 742 if [ "$EXE" ] ; then 743 EXE=$1 744 else 745 EXE="app_process" 746 fi 747 748 local PORT="$2" 749 if [ "$PORT" ] ; then 750 PORT=$2 751 else 752 PORT=":5039" 753 fi 754 755 local PID 756 local PROG="$3" 757 if [ "$PROG" ] ; then 758 PID=`pid $3` 759 adb forward "tcp$PORT" "tcp$PORT" 760 adb shell gdbserver $PORT --attach $PID & 761 sleep 2 762 else 763 echo "" 764 echo "If you haven't done so already, do this first on the device:" 765 echo " gdbserver $PORT /system/bin/$EXE" 766 echo " or" 767 echo " gdbserver $PORT --attach $PID" 768 echo "" 769 fi 770 771 echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS" 772 echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS" 773 echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT" 774 echo >>"$OUT_ROOT/gdbclient.cmds" "" 775 776 arm-eabi-gdb -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE" 777 else 778 echo "Unable to determine build system output dir." 779 fi 780 781} 782 783case `uname -s` in 784 Darwin) 785 function sgrep() 786 { 787 find -E . -type f -iregex '.*\.(c|h|cpp|S|java|xml|sh|mk)' -print0 | xargs -0 grep --color -n "$@" 788 } 789 790 ;; 791 *) 792 function sgrep() 793 { 794 find . -type f -iregex '.*\.\(c\|h\|cpp\|S\|java\|xml\|sh\|mk\)' -print0 | xargs -0 grep --color -n "$@" 795 } 796 ;; 797esac 798 799function jgrep() 800{ 801 find . -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@" 802} 803 804function cgrep() 805{ 806 find . -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' \) -print0 | xargs -0 grep --color -n "$@" 807} 808 809function resgrep() 810{ 811 for dir in `find . -name res -type d`; do find $dir -type f -name '*\.xml' -print0 | xargs -0 grep --color -n "$@"; done; 812} 813 814case `uname -s` in 815 Darwin) 816 function mgrep() 817 { 818 find -E . -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -print0 | xargs -0 grep --color -n "$@" 819 } 820 821 function treegrep() 822 { 823 find -E . -type f -iregex '.*\.(c|h|cpp|S|java|xml)' -print0 | xargs -0 grep --color -n -i "$@" 824 } 825 826 ;; 827 *) 828 function mgrep() 829 { 830 find . -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -type f -print0 | xargs -0 grep --color -n "$@" 831 } 832 833 function treegrep() 834 { 835 find . -regextype posix-egrep -iregex '.*\.(c|h|cpp|S|java|xml)' -type f -print0 | xargs -0 grep --color -n -i "$@" 836 } 837 838 ;; 839esac 840 841function getprebuilt 842{ 843 get_abs_build_var ANDROID_PREBUILTS 844} 845 846function tracedmdump() 847{ 848 T=$(gettop) 849 if [ ! "$T" ]; then 850 echo "Couldn't locate the top of the tree. Try setting TOP." 851 return 852 fi 853 local prebuiltdir=$(getprebuilt) 854 local KERNEL=$T/prebuilt/android-arm/kernel/vmlinux-qemu 855 856 local TRACE=$1 857 if [ ! "$TRACE" ] ; then 858 echo "usage: tracedmdump tracename" 859 return 860 fi 861 862 if [ ! -r "$KERNEL" ] ; then 863 echo "Error: cannot find kernel: '$KERNEL'" 864 return 865 fi 866 867 local BASETRACE=$(basename $TRACE) 868 if [ "$BASETRACE" = "$TRACE" ] ; then 869 TRACE=$ANDROID_PRODUCT_OUT/traces/$TRACE 870 fi 871 872 echo "post-processing traces..." 873 rm -f $TRACE/qtrace.dexlist 874 post_trace $TRACE 875 if [ $? -ne 0 ]; then 876 echo "***" 877 echo "*** Error: malformed trace. Did you remember to exit the emulator?" 878 echo "***" 879 return 880 fi 881 echo "generating dexlist output..." 882 /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 883 echo "generating dmtrace data..." 884 q2dm -r $ANDROID_PRODUCT_OUT/symbols $TRACE $KERNEL $TRACE/dmtrace || return 885 echo "generating html file..." 886 dmtracedump -h $TRACE/dmtrace >| $TRACE/dmtrace.html || return 887 echo "done, see $TRACE/dmtrace.html for details" 888 echo "or run:" 889 echo " traceview $TRACE/dmtrace" 890} 891 892# communicate with a running device or emulator, set up necessary state, 893# and run the hat command. 894function runhat() 895{ 896 # process standard adb options 897 local adbTarget="" 898 if [ $1 = "-d" -o $1 = "-e" ]; then 899 adbTarget=$1 900 shift 1 901 elif [ $1 = "-s" ]; then 902 adbTarget="$1 $2" 903 shift 2 904 fi 905 local adbOptions=${adbTarget} 906 echo adbOptions = ${adbOptions} 907 908 # runhat options 909 local targetPid=$1 910 local outputFile=$2 911 912 if [ "$targetPid" = "" ]; then 913 echo "Usage: runhat [ -d | -e | -s serial ] target-pid [output-file]" 914 return 915 fi 916 917 # confirm hat is available 918 if [ -z $(which hat) ]; then 919 echo "hat is not available in this configuration." 920 return 921 fi 922 923 adb ${adbOptions} shell >/dev/null mkdir /data/misc 924 adb ${adbOptions} shell chmod 777 /data/misc 925 926 # send a SIGUSR1 to cause the hprof dump 927 echo "Poking $targetPid and waiting for data..." 928 adb ${adbOptions} shell kill -10 $targetPid 929 echo "Press enter when logcat shows \"hprof: heap dump completed\"" 930 echo -n "> " 931 read 932 933 local availFiles=( $(adb ${adbOptions} shell ls /data/misc | grep '^heap-dump' | sed -e 's/.*heap-dump-/heap-dump-/' | sort -r | tr '[:space:][:cntrl:]' ' ') ) 934 local devFile=/data/misc/${availFiles[0]} 935 local localFile=/tmp/$$-hprof 936 937 echo "Retrieving file $devFile..." 938 adb ${adbOptions} pull $devFile $localFile 939 940 adb ${adbOptions} shell rm $devFile 941 942 echo "Running hat on $localFile" 943 echo "View the output by pointing your browser at http://localhost:7000/" 944 echo "" 945 hat $localFile 946} 947 948function getbugreports() 949{ 950 local reports=(`adb shell ls /sdcard/bugreports | tr -d '\r'`) 951 952 if [ ! "$reports" ]; then 953 echo "Could not locate any bugreports." 954 return 955 fi 956 957 local report 958 for report in ${reports[@]} 959 do 960 echo "/sdcard/bugreports/${report}" 961 adb pull /sdcard/bugreports/${report} ${report} 962 gunzip ${report} 963 done 964} 965 966function startviewserver() 967{ 968 local port=4939 969 if [ $# -gt 0 ]; then 970 port=$1 971 fi 972 adb shell service call window 1 i32 $port 973} 974 975function stopviewserver() 976{ 977 adb shell service call window 2 978} 979 980function isviewserverstarted() 981{ 982 adb shell service call window 3 983} 984 985function smoketest() 986{ 987 if [ ! "$ANDROID_PRODUCT_OUT" ]; then 988 echo "Couldn't locate output files. Try running 'lunch' first." >&2 989 return 990 fi 991 T=$(gettop) 992 if [ ! "$T" ]; then 993 echo "Couldn't locate the top of the tree. Try setting TOP." >&2 994 return 995 fi 996 997 (cd "$T" && mmm tests/SmokeTest) && 998 adb uninstall com.android.smoketest > /dev/null && 999 adb uninstall com.android.smoketest.tests > /dev/null && 1000 adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTestApp.apk && 1001 adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTest.apk && 1002 adb shell am instrument -w com.android.smoketest.tests/android.test.InstrumentationTestRunner 1003} 1004 1005# simple shortcut to the runtest command 1006function runtest() 1007{ 1008 T=$(gettop) 1009 if [ ! "$T" ]; then 1010 echo "Couldn't locate the top of the tree. Try setting TOP." >&2 1011 return 1012 fi 1013 ("$T"/development/testrunner/runtest.py $@) 1014} 1015 1016function godir () { 1017 if [[ -z "$1" ]]; then 1018 echo "Usage: godir <regex>" 1019 return 1020 fi 1021 T=$(gettop) 1022 if [[ ! -f $T/filelist ]]; then 1023 echo -n "Creating index..." 1024 (cd $T; find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > filelist) 1025 echo " Done" 1026 echo "" 1027 fi 1028 local lines 1029 lines=($(grep "$1" $T/filelist | sed -e 's/\/[^/]*$//' | sort | uniq)) 1030 if [[ ${#lines[@]} = 0 ]]; then 1031 echo "Not found" 1032 return 1033 fi 1034 local pathname 1035 local choice 1036 if [[ ${#lines[@]} > 1 ]]; then 1037 while [[ -z "$pathname" ]]; do 1038 local index=1 1039 local line 1040 for line in ${lines[@]}; do 1041 printf "%6s %s\n" "[$index]" $line 1042 index=$(($index + 1)) 1043 done 1044 echo 1045 echo -n "Select one: " 1046 unset choice 1047 read choice 1048 if [[ $choice -gt ${#lines[@]} || $choice -lt 1 ]]; then 1049 echo "Invalid choice" 1050 continue 1051 fi 1052 pathname=${lines[$(($choice-$_arrayoffset))]} 1053 done 1054 else 1055 # even though zsh arrays are 1-based, $foo[0] is an alias for $foo[1] 1056 pathname=${lines[0]} 1057 fi 1058 cd $T/$pathname 1059} 1060 1061# Force JAVA_HOME to point to java 1.5 if it isn't already set 1062if [ "$STAY_OFF_MY_LAWN" = "" ]; then 1063 if [ ! "$JAVA_HOME" ]; then 1064 case `uname -s` in 1065 Darwin) 1066 export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.5/Home 1067 ;; 1068 *) 1069 export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun 1070 ;; 1071 esac 1072 fi 1073fi 1074 1075# determine whether arrays are zero-based (bash) or one-based (zsh) 1076_xarray=(a b c) 1077if [ -z "${_xarray[${#_xarray[@]}]}" ] 1078then 1079 _arrayoffset=1 1080else 1081 _arrayoffset=0 1082fi 1083unset _xarray 1084 1085# Execute the contents of any vendorsetup.sh files we can find. 1086for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/build/vendorsetup.sh device/*/*/vendorsetup.sh 2> /dev/null` 1087do 1088 echo "including $f" 1089 . $f 1090done 1091unset f 1092