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