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