envsetup.sh revision dfff170148f9d8d93a459fc58d712f192dc8a97a
1function hmm() { 2cat <<EOF 3Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment: 4- lunch: lunch <product_name>-<build_variant> 5- tapas: tapas [<App1> <App2> ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user] 6- croot: Changes directory to the top of the tree. 7- m: Makes from the top of the tree. 8- mm: Builds all of the modules in the current directory, but not their dependencies. 9- mmm: Builds all of the modules in the supplied directories, but not their dependencies. 10 To limit the modules being built use the syntax: mmm dir/:target1,target2. 11- mma: Builds all of the modules in the current directory, and their dependencies. 12- mmma: Builds all of the modules in the supplied directories, and their dependencies. 13- cgrep: Greps on all local C/C++ files. 14- ggrep: Greps on all local Gradle files. 15- jgrep: Greps on all local Java files. 16- resgrep: Greps on all local res/*.xml files. 17- sgrep: Greps on all local source files. 18- godir: Go to the directory containing a file. 19 20Environemnt options: 21- SANITIZE_HOST: Set to 'true' to use ASAN for all host modules. Note that 22 ASAN_OPTIONS=detect_leaks=0 will be set by default until the 23 build is leak-check clean. 24 25Look at the source to view more functions. The complete list is: 26EOF 27 T=$(gettop) 28 local A 29 A="" 30 for i in `cat $T/build/envsetup.sh | sed -n "/^[ \t]*function /s/function \([a-z_]*\).*/\1/p" | sort | uniq`; do 31 A="$A $i" 32 done 33 echo $A 34} 35 36# Get the value of a build variable as an absolute path. 37function get_abs_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 (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \ 45 command make --no-print-directory -f build/core/config.mk dumpvar-abs-$1) 46} 47 48# Get the exact value of a build variable. 49function get_build_var() 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 (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \ 57 command make --no-print-directory -f build/core/config.mk dumpvar-$1) 58} 59 60# check to see if the supplied product is one we can build 61function check_product() 62{ 63 T=$(gettop) 64 if [ ! "$T" ]; then 65 echo "Couldn't locate the top of the tree. Try setting TOP." >&2 66 return 67 fi 68 TARGET_PRODUCT=$1 \ 69 TARGET_BUILD_VARIANT= \ 70 TARGET_BUILD_TYPE= \ 71 TARGET_BUILD_APPS= \ 72 get_build_var TARGET_DEVICE > /dev/null 73 # hide successful answers, but allow the errors to show 74} 75 76VARIANT_CHOICES=(user userdebug eng) 77 78# check to see if the supplied variant is valid 79function check_variant() 80{ 81 for v in ${VARIANT_CHOICES[@]} 82 do 83 if [ "$v" = "$1" ] 84 then 85 return 0 86 fi 87 done 88 return 1 89} 90 91function setpaths() 92{ 93 T=$(gettop) 94 if [ ! "$T" ]; then 95 echo "Couldn't locate the top of the tree. Try setting TOP." 96 return 97 fi 98 99 ################################################################## 100 # # 101 # Read me before you modify this code # 102 # # 103 # This function sets ANDROID_BUILD_PATHS to what it is adding # 104 # to PATH, and the next time it is run, it removes that from # 105 # PATH. This is required so lunch can be run more than once # 106 # and still have working paths. # 107 # # 108 ################################################################## 109 110 # Note: on windows/cygwin, ANDROID_BUILD_PATHS will contain spaces 111 # due to "C:\Program Files" being in the path. 112 113 # out with the old 114 if [ -n "$ANDROID_BUILD_PATHS" ] ; then 115 export PATH=${PATH/$ANDROID_BUILD_PATHS/} 116 fi 117 if [ -n "$ANDROID_PRE_BUILD_PATHS" ] ; then 118 export PATH=${PATH/$ANDROID_PRE_BUILD_PATHS/} 119 # strip leading ':', if any 120 export PATH=${PATH/:%/} 121 fi 122 123 # and in with the new 124 prebuiltdir=$(getprebuilt) 125 gccprebuiltdir=$(get_abs_build_var ANDROID_GCC_PREBUILTS) 126 127 # defined in core/config.mk 128 targetgccversion=$(get_build_var TARGET_GCC_VERSION) 129 targetgccversion2=$(get_build_var 2ND_TARGET_GCC_VERSION) 130 export TARGET_GCC_VERSION=$targetgccversion 131 132 # The gcc toolchain does not exists for windows/cygwin. In this case, do not reference it. 133 export ANDROID_TOOLCHAIN= 134 export ANDROID_TOOLCHAIN_2ND_ARCH= 135 local ARCH=$(get_build_var TARGET_ARCH) 136 case $ARCH in 137 x86) toolchaindir=x86/x86_64-linux-android-$targetgccversion/bin 138 ;; 139 x86_64) toolchaindir=x86/x86_64-linux-android-$targetgccversion/bin 140 ;; 141 arm) toolchaindir=arm/arm-linux-androideabi-$targetgccversion/bin 142 ;; 143 arm64) toolchaindir=aarch64/aarch64-linux-android-$targetgccversion/bin; 144 toolchaindir2=arm/arm-linux-androideabi-$targetgccversion2/bin 145 ;; 146 mips|mips64) toolchaindir=mips/mips64el-linux-android-$targetgccversion/bin 147 ;; 148 *) 149 echo "Can't find toolchain for unknown architecture: $ARCH" 150 toolchaindir=xxxxxxxxx 151 ;; 152 esac 153 if [ -d "$gccprebuiltdir/$toolchaindir" ]; then 154 export ANDROID_TOOLCHAIN=$gccprebuiltdir/$toolchaindir 155 fi 156 157 if [ -d "$gccprebuiltdir/$toolchaindir2" ]; then 158 export ANDROID_TOOLCHAIN_2ND_ARCH=$gccprebuiltdir/$toolchaindir2 159 fi 160 161 unset ANDROID_KERNEL_TOOLCHAIN_PATH 162 case $ARCH in 163 arm) 164 # Legacy toolchain configuration used for ARM kernel compilation 165 toolchaindir=arm/arm-eabi-$targetgccversion/bin 166 if [ -d "$gccprebuiltdir/$toolchaindir" ]; then 167 export ARM_EABI_TOOLCHAIN="$gccprebuiltdir/$toolchaindir" 168 ANDROID_KERNEL_TOOLCHAIN_PATH="$ARM_EABI_TOOLCHAIN": 169 fi 170 ;; 171 *) 172 # No need to set ARM_EABI_TOOLCHAIN for other ARCHs 173 ;; 174 esac 175 176 export ANDROID_DEV_SCRIPTS=$T/development/scripts:$T/prebuilts/devtools/tools 177 export ANDROID_BUILD_PATHS=$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_TOOLCHAIN:$ANDROID_TOOLCHAIN_2ND_ARCH:$ANDROID_KERNEL_TOOLCHAIN_PATH$ANDROID_DEV_SCRIPTS: 178 179 # If prebuilts/android-emulator/<system>/ exists, prepend it to our PATH 180 # to ensure that the corresponding 'emulator' binaries are used. 181 case $(uname -s) in 182 Darwin) 183 ANDROID_EMULATOR_PREBUILTS=$T/prebuilts/android-emulator/darwin-x86_64 184 ;; 185 Linux) 186 ANDROID_EMULATOR_PREBUILTS=$T/prebuilts/android-emulator/linux-x86_64 187 ;; 188 *) 189 ANDROID_EMULATOR_PREBUILTS= 190 ;; 191 esac 192 if [ -n "$ANDROID_EMULATOR_PREBUILTS" -a -d "$ANDROID_EMULATOR_PREBUILTS" ]; then 193 ANDROID_BUILD_PATHS=$ANDROID_BUILD_PATHS$ANDROID_EMULATOR_PREBUILTS: 194 export ANDROID_EMULATOR_PREBUILTS 195 fi 196 197 export PATH=$ANDROID_BUILD_PATHS$PATH 198 199 unset ANDROID_JAVA_TOOLCHAIN 200 unset ANDROID_PRE_BUILD_PATHS 201 if [ -n "$JAVA_HOME" ]; then 202 export ANDROID_JAVA_TOOLCHAIN=$JAVA_HOME/bin 203 export ANDROID_PRE_BUILD_PATHS=$ANDROID_JAVA_TOOLCHAIN: 204 export PATH=$ANDROID_PRE_BUILD_PATHS$PATH 205 fi 206 207 unset ANDROID_PRODUCT_OUT 208 export ANDROID_PRODUCT_OUT=$(get_abs_build_var PRODUCT_OUT) 209 export OUT=$ANDROID_PRODUCT_OUT 210 211 unset ANDROID_HOST_OUT 212 export ANDROID_HOST_OUT=$(get_abs_build_var HOST_OUT) 213 214 # needed for building linux on MacOS 215 # TODO: fix the path 216 #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include 217} 218 219function printconfig() 220{ 221 T=$(gettop) 222 if [ ! "$T" ]; then 223 echo "Couldn't locate the top of the tree. Try setting TOP." >&2 224 return 225 fi 226 get_build_var report_config 227} 228 229function set_stuff_for_environment() 230{ 231 settitle 232 set_java_home 233 setpaths 234 set_sequence_number 235 236 export ANDROID_BUILD_TOP=$(gettop) 237 # With this environment variable new GCC can apply colors to warnings/errors 238 export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' 239 export ASAN_OPTIONS=detect_leaks=0 240} 241 242function set_sequence_number() 243{ 244 export BUILD_ENV_SEQUENCE_NUMBER=10 245} 246 247function settitle() 248{ 249 if [ "$STAY_OFF_MY_LAWN" = "" ]; then 250 local arch=$(gettargetarch) 251 local product=$TARGET_PRODUCT 252 local variant=$TARGET_BUILD_VARIANT 253 local apps=$TARGET_BUILD_APPS 254 if [ -z "$apps" ]; then 255 export PROMPT_COMMAND="echo -ne \"\033]0;[${arch}-${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\"" 256 else 257 export PROMPT_COMMAND="echo -ne \"\033]0;[$arch $apps $variant] ${USER}@${HOSTNAME}: ${PWD}\007\"" 258 fi 259 fi 260} 261 262function addcompletions() 263{ 264 local T dir f 265 266 # Keep us from trying to run in something that isn't bash. 267 if [ -z "${BASH_VERSION}" ]; then 268 return 269 fi 270 271 # Keep us from trying to run in bash that's too old. 272 if [ ${BASH_VERSINFO[0]} -lt 3 ]; then 273 return 274 fi 275 276 dir="sdk/bash_completion" 277 if [ -d ${dir} ]; then 278 for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do 279 echo "including $f" 280 . $f 281 done 282 fi 283} 284 285function choosetype() 286{ 287 echo "Build type choices are:" 288 echo " 1. release" 289 echo " 2. debug" 290 echo 291 292 local DEFAULT_NUM DEFAULT_VALUE 293 DEFAULT_NUM=1 294 DEFAULT_VALUE=release 295 296 export TARGET_BUILD_TYPE= 297 local ANSWER 298 while [ -z $TARGET_BUILD_TYPE ] 299 do 300 echo -n "Which would you like? ["$DEFAULT_NUM"] " 301 if [ -z "$1" ] ; then 302 read ANSWER 303 else 304 echo $1 305 ANSWER=$1 306 fi 307 case $ANSWER in 308 "") 309 export TARGET_BUILD_TYPE=$DEFAULT_VALUE 310 ;; 311 1) 312 export TARGET_BUILD_TYPE=release 313 ;; 314 release) 315 export TARGET_BUILD_TYPE=release 316 ;; 317 2) 318 export TARGET_BUILD_TYPE=debug 319 ;; 320 debug) 321 export TARGET_BUILD_TYPE=debug 322 ;; 323 *) 324 echo 325 echo "I didn't understand your response. Please try again." 326 echo 327 ;; 328 esac 329 if [ -n "$1" ] ; then 330 break 331 fi 332 done 333 334 set_stuff_for_environment 335} 336 337# 338# This function isn't really right: It chooses a TARGET_PRODUCT 339# based on the list of boards. Usually, that gets you something 340# that kinda works with a generic product, but really, you should 341# pick a product by name. 342# 343function chooseproduct() 344{ 345 if [ "x$TARGET_PRODUCT" != x ] ; then 346 default_value=$TARGET_PRODUCT 347 else 348 default_value=full 349 fi 350 351 export TARGET_PRODUCT= 352 local ANSWER 353 while [ -z "$TARGET_PRODUCT" ] 354 do 355 echo -n "Which product would you like? [$default_value] " 356 if [ -z "$1" ] ; then 357 read ANSWER 358 else 359 echo $1 360 ANSWER=$1 361 fi 362 363 if [ -z "$ANSWER" ] ; then 364 export TARGET_PRODUCT=$default_value 365 else 366 if check_product $ANSWER 367 then 368 export TARGET_PRODUCT=$ANSWER 369 else 370 echo "** Not a valid product: $ANSWER" 371 fi 372 fi 373 if [ -n "$1" ] ; then 374 break 375 fi 376 done 377 378 set_stuff_for_environment 379} 380 381function choosevariant() 382{ 383 echo "Variant choices are:" 384 local index=1 385 local v 386 for v in ${VARIANT_CHOICES[@]} 387 do 388 # The product name is the name of the directory containing 389 # the makefile we found, above. 390 echo " $index. $v" 391 index=$(($index+1)) 392 done 393 394 local default_value=eng 395 local ANSWER 396 397 export TARGET_BUILD_VARIANT= 398 while [ -z "$TARGET_BUILD_VARIANT" ] 399 do 400 echo -n "Which would you like? [$default_value] " 401 if [ -z "$1" ] ; then 402 read ANSWER 403 else 404 echo $1 405 ANSWER=$1 406 fi 407 408 if [ -z "$ANSWER" ] ; then 409 export TARGET_BUILD_VARIANT=$default_value 410 elif (echo -n $ANSWER | grep -q -e "^[0-9][0-9]*$") ; then 411 if [ "$ANSWER" -le "${#VARIANT_CHOICES[@]}" ] ; then 412 export TARGET_BUILD_VARIANT=${VARIANT_CHOICES[$(($ANSWER-1))]} 413 fi 414 else 415 if check_variant $ANSWER 416 then 417 export TARGET_BUILD_VARIANT=$ANSWER 418 else 419 echo "** Not a valid variant: $ANSWER" 420 fi 421 fi 422 if [ -n "$1" ] ; then 423 break 424 fi 425 done 426} 427 428function choosecombo() 429{ 430 choosetype $1 431 432 echo 433 echo 434 chooseproduct $2 435 436 echo 437 echo 438 choosevariant $3 439 440 echo 441 set_stuff_for_environment 442 printconfig 443} 444 445# Clear this variable. It will be built up again when the vendorsetup.sh 446# files are included at the end of this file. 447unset LUNCH_MENU_CHOICES 448function add_lunch_combo() 449{ 450 local new_combo=$1 451 local c 452 for c in ${LUNCH_MENU_CHOICES[@]} ; do 453 if [ "$new_combo" = "$c" ] ; then 454 return 455 fi 456 done 457 LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo) 458} 459 460# add the default one here 461add_lunch_combo aosp_arm-eng 462add_lunch_combo aosp_arm64-eng 463add_lunch_combo aosp_mips-eng 464add_lunch_combo aosp_mips64-eng 465add_lunch_combo aosp_x86-eng 466add_lunch_combo aosp_x86_64-eng 467 468function print_lunch_menu() 469{ 470 local uname=$(uname) 471 echo 472 echo "You're building on" $uname 473 echo 474 echo "Lunch menu... pick a combo:" 475 476 local i=1 477 local choice 478 for choice in ${LUNCH_MENU_CHOICES[@]} 479 do 480 echo " $i. $choice" 481 i=$(($i+1)) 482 done 483 484 echo 485} 486 487function lunch() 488{ 489 local answer 490 491 if [ "$1" ] ; then 492 answer=$1 493 else 494 print_lunch_menu 495 echo -n "Which would you like? [aosp_arm-eng] " 496 read answer 497 fi 498 499 local selection= 500 501 if [ -z "$answer" ] 502 then 503 selection=aosp_arm-eng 504 elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$") 505 then 506 if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ] 507 then 508 selection=${LUNCH_MENU_CHOICES[$(($answer-1))]} 509 fi 510 elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$") 511 then 512 selection=$answer 513 fi 514 515 if [ -z "$selection" ] 516 then 517 echo 518 echo "Invalid lunch combo: $answer" 519 return 1 520 fi 521 522 export TARGET_BUILD_APPS= 523 524 local product=$(echo -n $selection | sed -e "s/-.*$//") 525 check_product $product 526 if [ $? -ne 0 ] 527 then 528 echo 529 echo "** Don't have a product spec for: '$product'" 530 echo "** Do you have the right repo manifest?" 531 product= 532 fi 533 534 local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//") 535 check_variant $variant 536 if [ $? -ne 0 ] 537 then 538 echo 539 echo "** Invalid variant: '$variant'" 540 echo "** Must be one of ${VARIANT_CHOICES[@]}" 541 variant= 542 fi 543 544 if [ -z "$product" -o -z "$variant" ] 545 then 546 echo 547 return 1 548 fi 549 550 export TARGET_PRODUCT=$product 551 export TARGET_BUILD_VARIANT=$variant 552 export TARGET_BUILD_TYPE=release 553 554 echo 555 556 set_stuff_for_environment 557 printconfig 558} 559 560# Tab completion for lunch. 561function _lunch() 562{ 563 local cur prev opts 564 COMPREPLY=() 565 cur="${COMP_WORDS[COMP_CWORD]}" 566 prev="${COMP_WORDS[COMP_CWORD-1]}" 567 568 COMPREPLY=( $(compgen -W "${LUNCH_MENU_CHOICES[*]}" -- ${cur}) ) 569 return 0 570} 571complete -F _lunch lunch 572 573# Configures the build to build unbundled apps. 574# Run tapas with one or more app names (from LOCAL_PACKAGE_NAME) 575function tapas() 576{ 577 local arch="$(echo $* | xargs -n 1 echo | \grep -E '^(arm|x86|mips|armv5|arm64|x86_64|mips64)$' | xargs)" 578 local variant="$(echo $* | xargs -n 1 echo | \grep -E '^(user|userdebug|eng)$' | xargs)" 579 local apps="$(echo $* | xargs -n 1 echo | \grep -E -v '^(user|userdebug|eng|arm|x86|mips|armv5|arm64|x86_64|mips64)$' | xargs)" 580 581 if [ $(echo $arch | wc -w) -gt 1 ]; then 582 echo "tapas: Error: Multiple build archs supplied: $arch" 583 return 584 fi 585 if [ $(echo $variant | wc -w) -gt 1 ]; then 586 echo "tapas: Error: Multiple build variants supplied: $variant" 587 return 588 fi 589 590 local product=full 591 case $arch in 592 x86) product=full_x86;; 593 mips) product=full_mips;; 594 armv5) product=generic_armv5;; 595 arm64) product=aosp_arm64;; 596 x86_64) product=aosp_x86_64;; 597 mips64) product=aosp_mips64;; 598 esac 599 if [ -z "$variant" ]; then 600 variant=eng 601 fi 602 if [ -z "$apps" ]; then 603 apps=all 604 fi 605 606 export TARGET_PRODUCT=$product 607 export TARGET_BUILD_VARIANT=$variant 608 export TARGET_BUILD_TYPE=release 609 export TARGET_BUILD_APPS=$apps 610 611 set_stuff_for_environment 612 printconfig 613} 614 615function gettop 616{ 617 local TOPFILE=build/core/envsetup.mk 618 if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then 619 # The following circumlocution ensures we remove symlinks from TOP. 620 (cd $TOP; PWD= /bin/pwd) 621 else 622 if [ -f $TOPFILE ] ; then 623 # The following circumlocution (repeated below as well) ensures 624 # that we record the true directory name and not one that is 625 # faked up with symlink names. 626 PWD= /bin/pwd 627 else 628 local HERE=$PWD 629 T= 630 while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do 631 \cd .. 632 T=`PWD= /bin/pwd -P` 633 done 634 \cd $HERE 635 if [ -f "$T/$TOPFILE" ]; then 636 echo $T 637 fi 638 fi 639 fi 640} 641 642# Return driver for "make", if any (eg. static analyzer) 643function getdriver() 644{ 645 local T="$1" 646 test "$WITH_STATIC_ANALYZER" = "0" && unset WITH_STATIC_ANALYZER 647 if [ -n "$WITH_STATIC_ANALYZER" ]; then 648 echo "\ 649$T/prebuilts/misc/linux-x86/analyzer/tools/scan-build/scan-build \ 650--use-analyzer $T/prebuilts/misc/linux-x86/analyzer/bin/analyzer \ 651--status-bugs \ 652--top=$T" 653 fi 654} 655 656function m() 657{ 658 local T=$(gettop) 659 local DRV=$(getdriver $T) 660 if [ "$T" ]; then 661 $DRV make -C $T -f build/core/main.mk $@ 662 else 663 echo "Couldn't locate the top of the tree. Try setting TOP." 664 fi 665} 666 667function findmakefile() 668{ 669 TOPFILE=build/core/envsetup.mk 670 local HERE=$PWD 671 T= 672 while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do 673 T=`PWD= /bin/pwd` 674 if [ -f "$T/Android.mk" ]; then 675 echo $T/Android.mk 676 \cd $HERE 677 return 678 fi 679 \cd .. 680 done 681 \cd $HERE 682} 683 684function mm() 685{ 686 local T=$(gettop) 687 local DRV=$(getdriver $T) 688 # If we're sitting in the root of the build tree, just do a 689 # normal make. 690 if [ -f build/core/envsetup.mk -a -f Makefile ]; then 691 $DRV make $@ 692 else 693 # Find the closest Android.mk file. 694 local M=$(findmakefile) 695 local MODULES= 696 local GET_INSTALL_PATH= 697 local ARGS= 698 # Remove the path to top as the makefilepath needs to be relative 699 local M=`echo $M|sed 's:'$T'/::'` 700 if [ ! "$T" ]; then 701 echo "Couldn't locate the top of the tree. Try setting TOP." 702 elif [ ! "$M" ]; then 703 echo "Couldn't locate a makefile from the current directory." 704 else 705 for ARG in $@; do 706 case $ARG in 707 GET-INSTALL-PATH) GET_INSTALL_PATH=$ARG;; 708 esac 709 done 710 if [ -n "$GET_INSTALL_PATH" ]; then 711 MODULES= 712 ARGS=GET-INSTALL-PATH 713 else 714 MODULES=all_modules 715 ARGS=$@ 716 fi 717 ONE_SHOT_MAKEFILE=$M $DRV make -C $T -f build/core/main.mk $MODULES $ARGS 718 fi 719 fi 720} 721 722function mmm() 723{ 724 local T=$(gettop) 725 local DRV=$(getdriver $T) 726 if [ "$T" ]; then 727 local MAKEFILE= 728 local MODULES= 729 local ARGS= 730 local DIR TO_CHOP 731 local GET_INSTALL_PATH= 732 local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') 733 local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') 734 for DIR in $DIRS ; do 735 MODULES=`echo $DIR | sed -n -e 's/.*:\(.*$\)/\1/p' | sed 's/,/ /'` 736 if [ "$MODULES" = "" ]; then 737 MODULES=all_modules 738 fi 739 DIR=`echo $DIR | sed -e 's/:.*//' -e 's:/$::'` 740 if [ -f $DIR/Android.mk ]; then 741 local TO_CHOP=`(\cd -P -- $T && pwd -P) | wc -c | tr -d ' '` 742 local TO_CHOP=`expr $TO_CHOP + 1` 743 local START=`PWD= /bin/pwd` 744 local MFILE=`echo $START | cut -c${TO_CHOP}-` 745 if [ "$MFILE" = "" ] ; then 746 MFILE=$DIR/Android.mk 747 else 748 MFILE=$MFILE/$DIR/Android.mk 749 fi 750 MAKEFILE="$MAKEFILE $MFILE" 751 else 752 case $DIR in 753 showcommands | snod | dist | incrementaljavac) ARGS="$ARGS $DIR";; 754 GET-INSTALL-PATH) GET_INSTALL_PATH=$DIR;; 755 *) echo "No Android.mk in $DIR."; return 1;; 756 esac 757 fi 758 done 759 if [ -n "$GET_INSTALL_PATH" ]; then 760 ARGS=$GET_INSTALL_PATH 761 MODULES= 762 fi 763 ONE_SHOT_MAKEFILE="$MAKEFILE" $DRV make -C $T -f build/core/main.mk $DASH_ARGS $MODULES $ARGS 764 else 765 echo "Couldn't locate the top of the tree. Try setting TOP." 766 fi 767} 768 769function mma() 770{ 771 local T=$(gettop) 772 local DRV=$(getdriver $T) 773 if [ -f build/core/envsetup.mk -a -f Makefile ]; then 774 $DRV make $@ 775 else 776 if [ ! "$T" ]; then 777 echo "Couldn't locate the top of the tree. Try setting TOP." 778 fi 779 local MY_PWD=`PWD= /bin/pwd|sed 's:'$T'/::'` 780 $DRV make -C $T -f build/core/main.mk $@ all_modules BUILD_MODULES_IN_PATHS="$MY_PWD" 781 fi 782} 783 784function mmma() 785{ 786 local T=$(gettop) 787 local DRV=$(getdriver $T) 788 if [ "$T" ]; then 789 local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') 790 local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') 791 local MY_PWD=`PWD= /bin/pwd` 792 if [ "$MY_PWD" = "$T" ]; then 793 MY_PWD= 794 else 795 MY_PWD=`echo $MY_PWD|sed 's:'$T'/::'` 796 fi 797 local DIR= 798 local MODULE_PATHS= 799 local ARGS= 800 for DIR in $DIRS ; do 801 if [ -d $DIR ]; then 802 if [ "$MY_PWD" = "" ]; then 803 MODULE_PATHS="$MODULE_PATHS $DIR" 804 else 805 MODULE_PATHS="$MODULE_PATHS $MY_PWD/$DIR" 806 fi 807 else 808 case $DIR in 809 showcommands | snod | dist | incrementaljavac) ARGS="$ARGS $DIR";; 810 *) echo "Couldn't find directory $DIR"; return 1;; 811 esac 812 fi 813 done 814 $DRV make -C $T -f build/core/main.mk $DASH_ARGS $ARGS all_modules BUILD_MODULES_IN_PATHS="$MODULE_PATHS" 815 else 816 echo "Couldn't locate the top of the tree. Try setting TOP." 817 fi 818} 819 820function croot() 821{ 822 T=$(gettop) 823 if [ "$T" ]; then 824 \cd $(gettop) 825 else 826 echo "Couldn't locate the top of the tree. Try setting TOP." 827 fi 828} 829 830function cproj() 831{ 832 TOPFILE=build/core/envsetup.mk 833 local HERE=$PWD 834 T= 835 while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do 836 T=$PWD 837 if [ -f "$T/Android.mk" ]; then 838 \cd $T 839 return 840 fi 841 \cd .. 842 done 843 \cd $HERE 844 echo "can't find Android.mk" 845} 846 847# simplified version of ps; output in the form 848# <pid> <procname> 849function qpid() { 850 local prepend='' 851 local append='' 852 if [ "$1" = "--exact" ]; then 853 prepend=' ' 854 append='$' 855 shift 856 elif [ "$1" = "--help" -o "$1" = "-h" ]; then 857 echo "usage: qpid [[--exact] <process name|pid>" 858 return 255 859 fi 860 861 local EXE="$1" 862 if [ "$EXE" ] ; then 863 qpid | \grep "$prepend$EXE$append" 864 else 865 adb shell ps \ 866 | tr -d '\r' \ 867 | sed -e 1d -e 's/^[^ ]* *\([0-9]*\).* \([^ ]*\)$/\1 \2/' 868 fi 869} 870 871function pid() 872{ 873 local prepend='' 874 local append='' 875 if [ "$1" = "--exact" ]; then 876 prepend=' ' 877 append='$' 878 shift 879 fi 880 local EXE="$1" 881 if [ "$EXE" ] ; then 882 local PID=`adb shell ps \ 883 | tr -d '\r' \ 884 | \grep "$prepend$EXE$append" \ 885 | sed -e 's/^[^ ]* *\([0-9]*\).*$/\1/'` 886 echo "$PID" 887 else 888 echo "usage: pid [--exact] <process name>" 889 return 255 890 fi 891} 892 893# systemstack - dump the current stack trace of all threads in the system process 894# to the usual ANR traces file 895function systemstack() 896{ 897 stacks system_server 898} 899 900function stacks() 901{ 902 if [[ $1 =~ ^[0-9]+$ ]] ; then 903 local PID="$1" 904 elif [ "$1" ] ; then 905 local PIDLIST="$(pid $1)" 906 if [[ $PIDLIST =~ ^[0-9]+$ ]] ; then 907 local PID="$PIDLIST" 908 elif [ "$PIDLIST" ] ; then 909 echo "more than one process: $1" 910 else 911 echo "no such process: $1" 912 fi 913 else 914 echo "usage: stacks [pid|process name]" 915 fi 916 917 if [ "$PID" ] ; then 918 # Determine whether the process is native 919 if adb shell ls -l /proc/$PID/exe | grep -q /system/bin/app_process ; then 920 # Dump stacks of Dalvik process 921 local TRACES=/data/anr/traces.txt 922 local ORIG=/data/anr/traces.orig 923 local TMP=/data/anr/traces.tmp 924 925 # Keep original traces to avoid clobbering 926 adb shell mv $TRACES $ORIG 927 928 # Make sure we have a usable file 929 adb shell touch $TRACES 930 adb shell chmod 666 $TRACES 931 932 # Dump stacks and wait for dump to finish 933 adb shell kill -3 $PID 934 adb shell notify $TRACES >/dev/null 935 936 # Restore original stacks, and show current output 937 adb shell mv $TRACES $TMP 938 adb shell mv $ORIG $TRACES 939 adb shell cat $TMP 940 else 941 # Dump stacks of native process 942 local USE64BIT="$(is64bit $PID)" 943 adb shell debuggerd$USE64BIT -b $PID 944 fi 945 fi 946} 947 948function gdbwrapper() 949{ 950 local GDB_CMD="$1" 951 shift 1 952 $GDB_CMD -x "$@" 953} 954 955function get_symbols_directory() 956{ 957 echo $(get_abs_build_var TARGET_OUT_UNSTRIPPED) 958} 959 960# Read the ELF header from /proc/$PID/exe to determine if the process is 961# 64-bit. 962function is64bit() 963{ 964 local PID="$1" 965 if [ "$PID" ] ; then 966 if [[ "$(adb shell cat /proc/$PID/exe | xxd -l 1 -s 4 -ps)" -eq "02" ]] ; then 967 echo "64" 968 else 969 echo "" 970 fi 971 else 972 echo "" 973 fi 974} 975 976function adb_get_product_device() { 977 local candidate=`adb shell getprop ro.product.device | sed s/.$//` 978 if [ -z $candidate ]; then 979 candidate=`adb shell getprop ro.hardware | sed s/.$//` 980 fi 981 echo $candidate 982} 983 984# returns 0 when process is not traced 985function adb_get_traced_by() { 986 echo `adb shell cat /proc/$1/status | grep -e "^TracerPid:" | sed "s/^TracerPid:\t//" | sed s/.$//` 987} 988 989function gdbclient() { 990 # TODO: 991 # 1. Check for ANDROID_SERIAL/multiple devices 992 local PROCESS_NAME="n/a" 993 local PID=$1 994 local PORT=5039 995 if [ -z "$PID" ]; then 996 echo "Usage: gdbclient <pid|processname> [port number]" 997 return -1 998 fi 999 local DEVICE=$(adb_get_product_device) 1000 1001 if [ -z "$DEVICE" ]; then 1002 echo "Error: Unable to get device name. Please check if device is connected and ANDROID_SERIAL is set." 1003 return -2 1004 fi 1005 1006 if [ -n "$2" ]; then 1007 PORT=$2 1008 fi 1009 1010 local ROOT=$(gettop) 1011 if [ -z "$ROOT" ]; then 1012 # This is for the situation with downloaded symbols (from the build server) 1013 # we check if they are available. 1014 ROOT=`realpath .` 1015 fi 1016 1017 local OUT_ROOT="$ROOT/out/target/product/$DEVICE" 1018 local SYMBOLS_DIR="$OUT_ROOT/symbols" 1019 local IS_TAPAS_USER="$(get_build_var TARGET_BUILD_APPS)" 1020 local TAPAS_SYMBOLS_DIR= 1021 1022 if [ $IS_TAPAS_USER ]; then 1023 TAPAS_SYMBOLS_DIR=$(get_symbols_directory) 1024 fi 1025 1026 if [ ! -d $SYMBOLS_DIR ]; then 1027 if [ $IS_TAPAS_USER ]; then 1028 mkdir -p $SYMBOLS_DIR/system/bin 1029 else 1030 echo "Error: couldn't find symbols: $SYMBOLS_DIR does not exist or is not a directory." 1031 return -3 1032 fi 1033 fi 1034 1035 # let's figure out which executable we are about to debug 1036 1037 # check if user specified a name -> resolve to pid 1038 if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then 1039 PROCESS_NAME=$PID 1040 PID=$(pid --exact $PROCESS_NAME) 1041 if [ -z "$PID" ]; then 1042 echo "Error: couldn't resolve pid by process name: $PROCESS_NAME" 1043 return -4 1044 else 1045 echo "Resolved pid for $PROCESS_NAME is $PID" 1046 fi 1047 fi 1048 1049 local EXE=`adb shell readlink /proc/$PID/exe | sed s/.$//` 1050 1051 if [ -z "$EXE" ]; then 1052 echo "Error: no such pid=$PID - is process still alive?" 1053 return -4 1054 fi 1055 1056 local LOCAL_EXE_PATH=$SYMBOLS_DIR$EXE 1057 1058 if [ ! -f $LOCAL_EXE_PATH ]; then 1059 if [ $IS_TAPAS_USER ]; then 1060 adb pull $EXE $LOCAL_EXE_PATH 1061 else 1062 echo "Error: unable to find symbols for executable $EXE: file $LOCAL_EXE_PATH does not exist" 1063 return -5 1064 fi 1065 fi 1066 1067 local USE64BIT="" 1068 1069 if [[ "$(file $LOCAL_EXE_PATH)" =~ 64-bit ]]; then 1070 USE64BIT="64" 1071 fi 1072 1073 # and now linker for tapas users... 1074 if [ -n "$IS_TAPAS_USER" -a ! -f "$SYMBOLS_DIR/system/bin/linker$USE64BIT" ]; then 1075 adb pull /system/bin/linker$USE64BIT $SYMBOLS_DIR/system/bin/linker$USE64BIT 1076 fi 1077 1078 local GDB= 1079 local GDB64= 1080 local CPU_ABI=`adb shell getprop ro.product.cpu.abilist | sed s/.$//` 1081 # TODO: we assume these are available via $PATH 1082 if [[ $CPU_ABI =~ (^|,)arm64 ]]; then 1083 GDB=arm-linux-androideabi-gdb 1084 GDB64=aarch64-linux-android-gdb 1085 elif [[ $CPU_ABI =~ (^|,)arm ]]; then 1086 GDB=arm-linux-androideabi-gdb 1087 elif [[ $CPU_ABI =~ (^|,)x86_64 ]]; then 1088 GDB=x86_64-linux-android-gdb 1089 elif [[ $CPU_ABI =~ (^|,)x86 ]]; then 1090 GDB=x86_64-linux-android-gdb 1091 elif [[ $CPU_ABI =~ (^|,)mips64 ]]; then 1092 GDB=mipsel-linux-android-gdb 1093 GDB64=mips64el-linux-android-gdb 1094 elif [[ $CPU_ABI =~ (^|,)mips ]]; then 1095 GDB=mipsel-linux-android-gdb 1096 else 1097 echo "Error: unrecognized cpu.abilist: $CPU_ABI" 1098 return -6 1099 fi 1100 1101 # TODO: check if tracing process is gdbserver and not some random strace... 1102 if [ "$(adb_get_traced_by $PID)" -eq 0 ]; then 1103 # start gdbserver 1104 echo "Starting gdbserver..." 1105 # TODO: check if adb is already listening $PORT 1106 # to avoid unnecessary calls 1107 echo ". adb forward for port=$PORT..." 1108 adb forward tcp:$PORT tcp:$PORT 1109 echo ". starting gdbserver to attach to pid=$PID..." 1110 adb shell gdbserver$USE64BIT :$PORT --attach $PID & 1111 echo ". give it couple of seconds to start..." 1112 sleep 2 1113 echo ". done" 1114 else 1115 echo "It looks like gdbserver is already attached to $PID (process is traced), trying to connect to it using local port=$PORT" 1116 adb forward tcp:$PORT tcp:$PORT 1117 fi 1118 1119 local OUT_SO_SYMBOLS=$SYMBOLS_DIR/system/lib$USE64BIT 1120 local TAPAS_OUT_SO_SYMBOLS=$TAPAS_SYMBOLS_DIR/system/lib$USE64BIT 1121 local OUT_VENDOR_SO_SYMBOLS=$SYMBOLS_DIR/vendor/lib$USE64BIT 1122 local ART_CMD="" 1123 1124 local SOLIB_SYSROOT=$SYMBOLS_DIR 1125 local SOLIB_SEARCHPATH=$OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines:$OUT_SO_SYMBOLS/drm:$OUT_SO_SYMBOLS/egl:$OUT_SO_SYMBOLS/soundfx:$OUT_VENDOR_SO_SYMBOLS:$OUT_VENDOR_SO_SYMBOLS/hw:$OUT_VENDOR_SO_SYMBOLS/egl 1126 1127 if [ $IS_TAPAS_USER ]; then 1128 SOLIB_SYSROOT=$TAPAS_SYMBOLS_DIR:$SOLIB_SYSROOT 1129 SOLIB_SEARCHPATH=$TAPAS_OUT_SO_SYMBOLS:$SOLIB_SEARCHPATH 1130 fi 1131 1132 echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $SOLIB_SYSROOT" 1133 echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $SOLIB_SEARCHPATH" 1134 local DALVIK_GDB_SCRIPT=$ROOT/development/scripts/gdb/dalvik.gdb 1135 if [ -f $DALVIK_GDB_SCRIPT ]; then 1136 echo >>"$OUT_ROOT/gdbclient.cmds" "source $DALVIK_GDB_SCRIPT" 1137 ART_CMD="art-on" 1138 else 1139 echo "Warning: couldn't find $DALVIK_GDB_SCRIPT - ART debugging options will not be available" 1140 fi 1141 echo >>"$OUT_ROOT/gdbclient.cmds" "target remote :$PORT" 1142 if [[ $EXE =~ (^|/)(app_process|dalvikvm)(|32|64)$ ]]; then 1143 echo >> "$OUT_ROOT/gdbclient.cmds" $ART_CMD 1144 fi 1145 1146 echo >>"$OUT_ROOT/gdbclient.cmds" "" 1147 1148 local WHICH_GDB=$GDB 1149 1150 if [ -n "$USE64BIT" -a -n "$GDB64" ]; then 1151 WHICH_GDB=$GDB64 1152 fi 1153 1154 gdbwrapper $WHICH_GDB "$OUT_ROOT/gdbclient.cmds" "$LOCAL_EXE_PATH" 1155} 1156 1157# gdbclient now determines whether the user wants to debug a 32-bit or 64-bit 1158# executable, set up the approriate gdbserver, then invokes the proper host 1159# gdb. 1160function gdbclient_old() 1161{ 1162 local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT) 1163 local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED) 1164 local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED) 1165 local OUT_VENDOR_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_VENDOR_SHARED_LIBRARIES_UNSTRIPPED) 1166 local OUT_EXE_SYMBOLS=$(get_symbols_directory) 1167 local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS) 1168 local ARCH=$(get_build_var TARGET_ARCH) 1169 local GDB 1170 case "$ARCH" in 1171 arm) GDB=arm-linux-androideabi-gdb;; 1172 arm64) GDB=arm-linux-androideabi-gdb; GDB64=aarch64-linux-android-gdb;; 1173 mips|mips64) GDB=mips64el-linux-android-gdb;; 1174 x86) GDB=x86_64-linux-android-gdb;; 1175 x86_64) GDB=x86_64-linux-android-gdb;; 1176 *) echo "Unknown arch $ARCH"; return 1;; 1177 esac 1178 1179 if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then 1180 local EXE="$1" 1181 if [ "$EXE" ] ; then 1182 EXE=$1 1183 if [[ $EXE =~ ^[^/].* ]] ; then 1184 EXE="system/bin/"$EXE 1185 fi 1186 else 1187 EXE="app_process" 1188 fi 1189 1190 local PORT="$2" 1191 if [ "$PORT" ] ; then 1192 PORT=$2 1193 else 1194 PORT=":5039" 1195 fi 1196 1197 local PID="$3" 1198 if [ "$PID" ] ; then 1199 if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then 1200 PID=`pid $3` 1201 if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then 1202 # that likely didn't work because of returning multiple processes 1203 # try again, filtering by root processes (don't contain colon) 1204 PID=`adb shell ps | \grep $3 | \grep -v ":" | awk '{print $2}'` 1205 if [[ ! "$PID" =~ ^[0-9]+$ ]] 1206 then 1207 echo "Couldn't resolve '$3' to single PID" 1208 return 1 1209 else 1210 echo "" 1211 echo "WARNING: multiple processes matching '$3' observed, using root process" 1212 echo "" 1213 fi 1214 fi 1215 fi 1216 adb forward "tcp$PORT" "tcp$PORT" 1217 local USE64BIT="$(is64bit $PID)" 1218 adb shell gdbserver$USE64BIT $PORT --attach $PID & 1219 sleep 2 1220 else 1221 echo "" 1222 echo "If you haven't done so already, do this first on the device:" 1223 echo " gdbserver $PORT /system/bin/$EXE" 1224 echo " or" 1225 echo " gdbserver $PORT --attach <PID>" 1226 echo "" 1227 fi 1228 1229 OUT_SO_SYMBOLS=$OUT_SO_SYMBOLS$USE64BIT 1230 OUT_VENDOR_SO_SYMBOLS=$OUT_VENDOR_SO_SYMBOLS$USE64BIT 1231 1232 echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS" 1233 echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines:$OUT_SO_SYMBOLS/drm:$OUT_SO_SYMBOLS/egl:$OUT_SO_SYMBOLS/soundfx:$OUT_VENDOR_SO_SYMBOLS:$OUT_VENDOR_SO_SYMBOLS/hw:$OUT_VENDOR_SO_SYMBOLS/egl" 1234 echo >>"$OUT_ROOT/gdbclient.cmds" "source $ANDROID_BUILD_TOP/development/scripts/gdb/dalvik.gdb" 1235 echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT" 1236 # Enable special debugging for ART processes. 1237 if [[ $EXE =~ (^|/)(app_process|dalvikvm)(|32|64)$ ]]; then 1238 echo >> "$OUT_ROOT/gdbclient.cmds" "art-on" 1239 fi 1240 echo >>"$OUT_ROOT/gdbclient.cmds" "" 1241 1242 local WHICH_GDB= 1243 # 64-bit exe found 1244 if [ "$USE64BIT" != "" ] ; then 1245 WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB64 1246 # 32-bit exe / 32-bit platform 1247 elif [ "$(get_build_var TARGET_2ND_ARCH)" = "" ]; then 1248 WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB 1249 # 32-bit exe / 64-bit platform 1250 else 1251 WHICH_GDB=$ANDROID_TOOLCHAIN_2ND_ARCH/$GDB 1252 fi 1253 1254 gdbwrapper $WHICH_GDB "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE" 1255 else 1256 echo "Unable to determine build system output dir." 1257 fi 1258 1259} 1260 1261case `uname -s` in 1262 Darwin) 1263 function sgrep() 1264 { 1265 find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cc|cpp|S|java|xml|sh|mk|aidl)' -print0 | xargs -0 grep --color -n "$@" 1266 } 1267 1268 ;; 1269 *) 1270 function sgrep() 1271 { 1272 find . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.\(c\|h\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\)' -print0 | xargs -0 grep --color -n "$@" 1273 } 1274 ;; 1275esac 1276 1277function gettargetarch 1278{ 1279 get_build_var TARGET_ARCH 1280} 1281 1282function ggrep() 1283{ 1284 find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.gradle" -print0 | xargs -0 grep --color -n "$@" 1285} 1286 1287function jgrep() 1288{ 1289 find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@" 1290} 1291 1292function cgrep() 1293{ 1294 find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' -o -name '*.hpp' \) -print0 | xargs -0 grep --color -n "$@" 1295} 1296 1297function resgrep() 1298{ 1299 for dir in `find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -name res -type d`; do find $dir -type f -name '*\.xml' -print0 | xargs -0 grep --color -n "$@"; done; 1300} 1301 1302function mangrep() 1303{ 1304 find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -name 'AndroidManifest.xml' -print0 | xargs -0 grep --color -n "$@" 1305} 1306 1307function sepgrep() 1308{ 1309 find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -name sepolicy -type d -print0 | xargs -0 grep --color -n -r --exclude-dir=\.git "$@" 1310} 1311 1312case `uname -s` in 1313 Darwin) 1314 function mgrep() 1315 { 1316 find -E . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -print0 | xargs -0 grep --color -n "$@" 1317 } 1318 1319 function treegrep() 1320 { 1321 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 "$@" 1322 } 1323 1324 ;; 1325 *) 1326 function mgrep() 1327 { 1328 find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -type f -print0 | xargs -0 grep --color -n "$@" 1329 } 1330 1331 function treegrep() 1332 { 1333 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 "$@" 1334 } 1335 1336 ;; 1337esac 1338 1339function getprebuilt 1340{ 1341 get_abs_build_var ANDROID_PREBUILTS 1342} 1343 1344function tracedmdump() 1345{ 1346 T=$(gettop) 1347 if [ ! "$T" ]; then 1348 echo "Couldn't locate the top of the tree. Try setting TOP." 1349 return 1350 fi 1351 local prebuiltdir=$(getprebuilt) 1352 local arch=$(gettargetarch) 1353 local KERNEL=$T/prebuilts/qemu-kernel/$arch/vmlinux-qemu 1354 1355 local TRACE=$1 1356 if [ ! "$TRACE" ] ; then 1357 echo "usage: tracedmdump tracename" 1358 return 1359 fi 1360 1361 if [ ! -r "$KERNEL" ] ; then 1362 echo "Error: cannot find kernel: '$KERNEL'" 1363 return 1364 fi 1365 1366 local BASETRACE=$(basename $TRACE) 1367 if [ "$BASETRACE" = "$TRACE" ] ; then 1368 TRACE=$ANDROID_PRODUCT_OUT/traces/$TRACE 1369 fi 1370 1371 echo "post-processing traces..." 1372 rm -f $TRACE/qtrace.dexlist 1373 post_trace $TRACE 1374 if [ $? -ne 0 ]; then 1375 echo "***" 1376 echo "*** Error: malformed trace. Did you remember to exit the emulator?" 1377 echo "***" 1378 return 1379 fi 1380 echo "generating dexlist output..." 1381 /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 1382 echo "generating dmtrace data..." 1383 q2dm -r $ANDROID_PRODUCT_OUT/symbols $TRACE $KERNEL $TRACE/dmtrace || return 1384 echo "generating html file..." 1385 dmtracedump -h $TRACE/dmtrace >| $TRACE/dmtrace.html || return 1386 echo "done, see $TRACE/dmtrace.html for details" 1387 echo "or run:" 1388 echo " traceview $TRACE/dmtrace" 1389} 1390 1391# communicate with a running device or emulator, set up necessary state, 1392# and run the hat command. 1393function runhat() 1394{ 1395 # process standard adb options 1396 local adbTarget="" 1397 if [ "$1" = "-d" -o "$1" = "-e" ]; then 1398 adbTarget=$1 1399 shift 1 1400 elif [ "$1" = "-s" ]; then 1401 adbTarget="$1 $2" 1402 shift 2 1403 fi 1404 local adbOptions=${adbTarget} 1405 #echo adbOptions = ${adbOptions} 1406 1407 # runhat options 1408 local targetPid=$1 1409 1410 if [ "$targetPid" = "" ]; then 1411 echo "Usage: runhat [ -d | -e | -s serial ] target-pid" 1412 return 1413 fi 1414 1415 # confirm hat is available 1416 if [ -z $(which hat) ]; then 1417 echo "hat is not available in this configuration." 1418 return 1419 fi 1420 1421 # issue "am" command to cause the hprof dump 1422 local devFile=/data/local/tmp/hprof-$targetPid 1423 echo "Poking $targetPid and waiting for data..." 1424 echo "Storing data at $devFile" 1425 adb ${adbOptions} shell am dumpheap $targetPid $devFile 1426 echo "Press enter when logcat shows \"hprof: heap dump completed\"" 1427 echo -n "> " 1428 read 1429 1430 local localFile=/tmp/$$-hprof 1431 1432 echo "Retrieving file $devFile..." 1433 adb ${adbOptions} pull $devFile $localFile 1434 1435 adb ${adbOptions} shell rm $devFile 1436 1437 echo "Running hat on $localFile" 1438 echo "View the output by pointing your browser at http://localhost:7000/" 1439 echo "" 1440 hat -JXmx512m $localFile 1441} 1442 1443function getbugreports() 1444{ 1445 local reports=(`adb shell ls /sdcard/bugreports | tr -d '\r'`) 1446 1447 if [ ! "$reports" ]; then 1448 echo "Could not locate any bugreports." 1449 return 1450 fi 1451 1452 local report 1453 for report in ${reports[@]} 1454 do 1455 echo "/sdcard/bugreports/${report}" 1456 adb pull /sdcard/bugreports/${report} ${report} 1457 gunzip ${report} 1458 done 1459} 1460 1461function getsdcardpath() 1462{ 1463 adb ${adbOptions} shell echo -n \$\{EXTERNAL_STORAGE\} 1464} 1465 1466function getscreenshotpath() 1467{ 1468 echo "$(getsdcardpath)/Pictures/Screenshots" 1469} 1470 1471function getlastscreenshot() 1472{ 1473 local screenshot_path=$(getscreenshotpath) 1474 local screenshot=`adb ${adbOptions} ls ${screenshot_path} | grep Screenshot_[0-9-]*.*\.png | sort -rk 3 | cut -d " " -f 4 | head -n 1` 1475 if [ "$screenshot" = "" ]; then 1476 echo "No screenshots found." 1477 return 1478 fi 1479 echo "${screenshot}" 1480 adb ${adbOptions} pull ${screenshot_path}/${screenshot} 1481} 1482 1483function startviewserver() 1484{ 1485 local port=4939 1486 if [ $# -gt 0 ]; then 1487 port=$1 1488 fi 1489 adb shell service call window 1 i32 $port 1490} 1491 1492function stopviewserver() 1493{ 1494 adb shell service call window 2 1495} 1496 1497function isviewserverstarted() 1498{ 1499 adb shell service call window 3 1500} 1501 1502function key_home() 1503{ 1504 adb shell input keyevent 3 1505} 1506 1507function key_back() 1508{ 1509 adb shell input keyevent 4 1510} 1511 1512function key_menu() 1513{ 1514 adb shell input keyevent 82 1515} 1516 1517function smoketest() 1518{ 1519 if [ ! "$ANDROID_PRODUCT_OUT" ]; then 1520 echo "Couldn't locate output files. Try running 'lunch' first." >&2 1521 return 1522 fi 1523 T=$(gettop) 1524 if [ ! "$T" ]; then 1525 echo "Couldn't locate the top of the tree. Try setting TOP." >&2 1526 return 1527 fi 1528 1529 (\cd "$T" && mmm tests/SmokeTest) && 1530 adb uninstall com.android.smoketest > /dev/null && 1531 adb uninstall com.android.smoketest.tests > /dev/null && 1532 adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTestApp.apk && 1533 adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTest.apk && 1534 adb shell am instrument -w com.android.smoketest.tests/android.test.InstrumentationTestRunner 1535} 1536 1537# simple shortcut to the runtest command 1538function runtest() 1539{ 1540 T=$(gettop) 1541 if [ ! "$T" ]; then 1542 echo "Couldn't locate the top of the tree. Try setting TOP." >&2 1543 return 1544 fi 1545 ("$T"/development/testrunner/runtest.py $@) 1546} 1547 1548function godir () { 1549 if [[ -z "$1" ]]; then 1550 echo "Usage: godir <regex>" 1551 return 1552 fi 1553 T=$(gettop) 1554 if [[ ! -f $T/filelist ]]; then 1555 echo -n "Creating index..." 1556 (\cd $T; find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > filelist) 1557 echo " Done" 1558 echo "" 1559 fi 1560 local lines 1561 lines=($(\grep "$1" $T/filelist | sed -e 's/\/[^/]*$//' | sort | uniq)) 1562 if [[ ${#lines[@]} = 0 ]]; then 1563 echo "Not found" 1564 return 1565 fi 1566 local pathname 1567 local choice 1568 if [[ ${#lines[@]} > 1 ]]; then 1569 while [[ -z "$pathname" ]]; do 1570 local index=1 1571 local line 1572 for line in ${lines[@]}; do 1573 printf "%6s %s\n" "[$index]" $line 1574 index=$(($index + 1)) 1575 done 1576 echo 1577 echo -n "Select one: " 1578 unset choice 1579 read choice 1580 if [[ $choice -gt ${#lines[@]} || $choice -lt 1 ]]; then 1581 echo "Invalid choice" 1582 continue 1583 fi 1584 pathname=${lines[$(($choice-1))]} 1585 done 1586 else 1587 pathname=${lines[0]} 1588 fi 1589 \cd $T/$pathname 1590} 1591 1592# Force JAVA_HOME to point to java 1.7 if it isn't already set. 1593# 1594# Note that the MacOS path for java 1.7 includes a minor revision number (sigh). 1595# For some reason, installing the JDK doesn't make it show up in the 1596# JavaVM.framework/Versions/1.7/ folder. 1597function set_java_home() { 1598 # Clear the existing JAVA_HOME value if we set it ourselves, so that 1599 # we can reset it later, depending on the version of java the build 1600 # system needs. 1601 # 1602 # If we don't do this, the JAVA_HOME value set by the first call to 1603 # build/envsetup.sh will persist forever. 1604 if [ -n "$ANDROID_SET_JAVA_HOME" ]; then 1605 export JAVA_HOME="" 1606 fi 1607 1608 if [ ! "$JAVA_HOME" ]; then 1609 case `uname -s` in 1610 Darwin) 1611 export JAVA_HOME=$(/usr/libexec/java_home -v 1.7) 1612 ;; 1613 *) 1614 export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 1615 ;; 1616 esac 1617 1618 # Keep track of the fact that we set JAVA_HOME ourselves, so that 1619 # we can change it on the next envsetup.sh, if required. 1620 export ANDROID_SET_JAVA_HOME=true 1621 fi 1622} 1623 1624# Print colored exit condition 1625function pez { 1626 "$@" 1627 local retval=$? 1628 if [ $retval -ne 0 ] 1629 then 1630 echo -e "\e[0;31mFAILURE\e[00m" 1631 else 1632 echo -e "\e[0;32mSUCCESS\e[00m" 1633 fi 1634 return $retval 1635} 1636 1637function get_make_command() 1638{ 1639 echo command make 1640} 1641 1642function make() 1643{ 1644 local start_time=$(date +"%s") 1645 $(get_make_command) "$@" 1646 local ret=$? 1647 local end_time=$(date +"%s") 1648 local tdiff=$(($end_time-$start_time)) 1649 local hours=$(($tdiff / 3600 )) 1650 local mins=$((($tdiff % 3600) / 60)) 1651 local secs=$(($tdiff % 60)) 1652 echo 1653 if [ $ret -eq 0 ] ; then 1654 if [ $(uname) != "Darwin" ]; then 1655 echo -n -e "\e[0;32m#### make completed successfully " 1656 else 1657 echo -n -e "#### make completed successfully " 1658 fi 1659 else 1660 if [ $(uname) != "Darwin" ]; then 1661 echo -n -e "\e[0;31m#### make failed to build some targets " 1662 else 1663 echo -n -e "#### make failed to build some targets " 1664 fi 1665 fi 1666 if [ $hours -gt 0 ] ; then 1667 printf "(%02g:%02g:%02g (hh:mm:ss))" $hours $mins $secs 1668 elif [ $mins -gt 0 ] ; then 1669 printf "(%02g:%02g (mm:ss))" $mins $secs 1670 elif [ $secs -gt 0 ] ; then 1671 printf "(%s seconds)" $secs 1672 fi 1673 if [ $(uname) != "Darwin" ]; then 1674 echo -e " ####\e[00m" 1675 fi 1676 echo 1677 return $ret 1678} 1679 1680if [ "x$SHELL" != "x/bin/bash" ]; then 1681 case `ps -o command -p $$` in 1682 *bash*) 1683 ;; 1684 *) 1685 echo "WARNING: Only bash is supported, use of other shell would lead to erroneous results" 1686 ;; 1687 esac 1688fi 1689 1690# Execute the contents of any vendorsetup.sh files we can find. 1691for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null` \ 1692 `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null` 1693do 1694 echo "including $f" 1695 . $f 1696done 1697unset f 1698 1699addcompletions 1700