X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=envsetup.sh;h=35df2d5f3e1877c0ffaa8136944b5c40d5cb59bf;hb=aac2f5e8baa5334cffeea254b186061aa6679eae;hp=368872f6d0dbd2034645e938020d976e9286e44a;hpb=a50e96923c45670c4adbdb2deb1e47dcb8029729;p=android-x86%2Fbuild.git diff --git a/envsetup.sh b/envsetup.sh index 368872f6d..35df2d5f3 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1,34 +1,98 @@ function hmm() { cat <- -- tapas: tapas [ ...] [arm|x86|mips|armv5] [eng|userdebug|user] -- croot: Changes directory to the top of the tree. -- m: Makes from the top of the tree. -- mm: Builds all of the modules in the current directory, but not their dependencies. -- mmm: Builds all of the modules in the supplied directories, but not their dependencies. -- mma: Builds all of the modules in the current directory, and their dependencies. -- mmma: Builds all of the modules in the supplied directories, and their dependencies. -- cgrep: Greps on all local C/C++ files. -- ggrep: Greps on all local Gradle files. -- jgrep: Greps on all local Java files. -- resgrep: Greps on all local res/*.xml files. -- godir: Go to the directory containing a file. +- lunch: lunch - +- tapas: tapas [ ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user] +- croot: Changes directory to the top of the tree. +- m: Makes from the top of the tree. +- mm: Builds all of the modules in the current directory, but not their dependencies. +- mmm: Builds all of the modules in the supplied directories, but not their dependencies. + To limit the modules being built use the syntax: mmm dir/:target1,target2. +- mma: Builds all of the modules in the current directory, and their dependencies. +- mmma: Builds all of the modules in the supplied directories, and their dependencies. +- provision: Flash device with all required partitions. Options will be passed on to fastboot. +- cgrep: Greps on all local C/C++ files. +- ggrep: Greps on all local Gradle files. +- jgrep: Greps on all local Java files. +- resgrep: Greps on all local res/*.xml files. +- mangrep: Greps on all local AndroidManifest.xml files. +- mgrep: Greps on all local Makefiles files. +- sepgrep: Greps on all local sepolicy files. +- sgrep: Greps on all local source files. +- godir: Go to the directory containing a file. + +Environment options: +- SANITIZE_HOST: Set to 'true' to use ASAN for all host modules. Note that + ASAN_OPTIONS=detect_leaks=0 will be set by default until the + build is leak-check clean. Look at the source to view more functions. The complete list is: EOF T=$(gettop) local A A="" - for i in `cat $T/build/envsetup.sh | sed -n "/^function /s/function \([a-z_]*\).*/\1/p" | sort`; do + for i in `cat $T/build/envsetup.sh | sed -n "/^[[:blank:]]*function /s/function \([a-z_]*\).*/\1/p" | sort | uniq`; do A="$A $i" done echo $A } +# Get all the build variables needed by this script in a single call to the build system. +function build_build_var_cache() +{ + T=$(gettop) + # Grep out the variable names from the script. + 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' ' '` + 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' ' '` + # Call the build system to dump the "=" pairs as a shell script. + build_dicts_script=`\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \ + command make --no-print-directory -f build/core/config.mk \ + dump-many-vars \ + DUMP_MANY_VARS="$cached_vars" \ + DUMP_MANY_ABS_VARS="$cached_abs_vars" \ + DUMP_VAR_PREFIX="var_cache_" \ + DUMP_ABS_VAR_PREFIX="abs_var_cache_"` + local ret=$? + if [ $ret -ne 0 ] + then + unset build_dicts_script + return $ret + fi + # Excute the script to store the "=" pairs as shell variables. + eval "$build_dicts_script" + ret=$? + unset build_dicts_script + if [ $ret -ne 0 ] + then + return $ret + fi + BUILD_VAR_CACHE_READY="true" +} + +# Delete the build var cache, so that we can still call into the build system +# to get build variables not listed in this script. +function destroy_build_var_cache() +{ + unset BUILD_VAR_CACHE_READY + for v in $cached_vars; do + unset var_cache_$v + done + unset cached_vars + for v in $cached_abs_vars; do + unset abs_var_cache_$v + done + unset cached_abs_vars +} + # Get the value of a build variable as an absolute path. function get_abs_build_var() { + if [ "$BUILD_VAR_CACHE_READY" = "true" ] + then + eval echo \"\${abs_var_cache_$1}\" + return + fi + T=$(gettop) if [ ! "$T" ]; then echo "Couldn't locate the top of the tree. Try setting TOP." >&2 @@ -41,6 +105,12 @@ function get_abs_build_var() # Get the exact value of a build variable. function get_build_var() { + if [ "$BUILD_VAR_CACHE_READY" = "true" ] + then + eval echo \"\${var_cache_$1}\" + return + fi + T=$(gettop) if [ ! "$T" ]; then echo "Couldn't locate the top of the tree. Try setting TOP." >&2 @@ -58,7 +128,6 @@ function check_product() echo "Couldn't locate the top of the tree. Try setting TOP." >&2 return fi - CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \ TARGET_PRODUCT=$1 \ TARGET_BUILD_VARIANT= \ TARGET_BUILD_TYPE= \ @@ -115,16 +184,17 @@ function setpaths() fi # and in with the new - CODE_REVIEWS= prebuiltdir=$(getprebuilt) gccprebuiltdir=$(get_abs_build_var ANDROID_GCC_PREBUILTS) # defined in core/config.mk targetgccversion=$(get_build_var TARGET_GCC_VERSION) + targetgccversion2=$(get_build_var 2ND_TARGET_GCC_VERSION) export TARGET_GCC_VERSION=$targetgccversion # The gcc toolchain does not exists for windows/cygwin. In this case, do not reference it. - export ANDROID_EABI_TOOLCHAIN= + export ANDROID_TOOLCHAIN= + export ANDROID_TOOLCHAIN_2ND_ARCH= local ARCH=$(get_build_var TARGET_ARCH) case $ARCH in x86) toolchaindir=x86/x86_64-linux-android-$targetgccversion/bin @@ -133,9 +203,10 @@ function setpaths() ;; arm) toolchaindir=arm/arm-linux-androideabi-$targetgccversion/bin ;; - arm64) toolchaindir=aarch64/aarch64-linux-android-$targetgccversion/bin + arm64) toolchaindir=aarch64/aarch64-linux-android-$targetgccversion/bin; + toolchaindir2=arm/arm-linux-androideabi-$targetgccversion2/bin ;; - mips) toolchaindir=mips/mipsel-linux-android-$targetgccversion/bin + mips|mips64) toolchaindir=mips/mips64el-linux-android-$targetgccversion/bin ;; *) echo "Can't find toolchain for unknown architecture: $ARCH" @@ -143,30 +214,36 @@ function setpaths() ;; esac if [ -d "$gccprebuiltdir/$toolchaindir" ]; then - export ANDROID_EABI_TOOLCHAIN=$gccprebuiltdir/$toolchaindir + export ANDROID_TOOLCHAIN=$gccprebuiltdir/$toolchaindir fi - unset ARM_EABI_TOOLCHAIN ARM_EABI_TOOLCHAIN_PATH - case $ARCH in - arm) - toolchaindir=arm/arm-eabi-$targetgccversion/bin - if [ -d "$gccprebuiltdir/$toolchaindir" ]; then - export ARM_EABI_TOOLCHAIN="$gccprebuiltdir/$toolchaindir" - ARM_EABI_TOOLCHAIN_PATH=":$gccprebuiltdir/$toolchaindir" - fi + if [ -d "$gccprebuiltdir/$toolchaindir2" ]; then + export ANDROID_TOOLCHAIN_2ND_ARCH=$gccprebuiltdir/$toolchaindir2 + fi + + export ANDROID_DEV_SCRIPTS=$T/development/scripts:$T/prebuilts/devtools/tools:$T/external/selinux/prebuilts/bin + export ANDROID_BUILD_PATHS=$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_TOOLCHAIN:$ANDROID_TOOLCHAIN_2ND_ARCH:$ANDROID_DEV_SCRIPTS: + + # If prebuilts/android-emulator// exists, prepend it to our PATH + # to ensure that the corresponding 'emulator' binaries are used. + case $(uname -s) in + Darwin) + ANDROID_EMULATOR_PREBUILTS=$T/prebuilts/android-emulator/darwin-x86_64 ;; - mips) toolchaindir=mips/mips-eabi-4.4.3/bin + Linux) + ANDROID_EMULATOR_PREBUILTS=$T/prebuilts/android-emulator/linux-x86_64 ;; *) - # No need to set ARM_EABI_TOOLCHAIN for other ARCHs + ANDROID_EMULATOR_PREBUILTS= ;; esac + if [ -n "$ANDROID_EMULATOR_PREBUILTS" -a -d "$ANDROID_EMULATOR_PREBUILTS" ]; then + ANDROID_BUILD_PATHS=$ANDROID_BUILD_PATHS$ANDROID_EMULATOR_PREBUILTS: + export ANDROID_EMULATOR_PREBUILTS + fi - export ANDROID_TOOLCHAIN=$ANDROID_EABI_TOOLCHAIN - export ANDROID_QTOOLS=$T/development/emulator/qtools - export ANDROID_DEV_SCRIPTS=$T/development/scripts:$T/prebuilts/devtools/tools - export ANDROID_BUILD_PATHS=$(get_build_var ANDROID_BUILD_PATHS):$ANDROID_QTOOLS:$ANDROID_TOOLCHAIN$ARM_EABI_TOOLCHAIN_PATH$CODE_REVIEWS:$ANDROID_DEV_SCRIPTS: export PATH=$ANDROID_BUILD_PATHS$PATH + export PYTHONPATH=$T/development/python-packages:$PYTHONPATH unset ANDROID_JAVA_TOOLCHAIN unset ANDROID_PRE_BUILD_PATHS @@ -183,10 +260,6 @@ function setpaths() unset ANDROID_HOST_OUT export ANDROID_HOST_OUT=$(get_abs_build_var HOST_OUT) - # needed for processing samples collected by perf counters - unset OPROFILE_EVENTS_DIR - export OPROFILE_EVENTS_DIR=$T/external/oprofile/events - # needed for building linux on MacOS # TODO: fix the path #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include @@ -212,6 +285,7 @@ function set_stuff_for_environment() export ANDROID_BUILD_TOP=$(gettop) # With this environment variable new GCC can apply colors to warnings/errors export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' + export ASAN_OPTIONS=detect_leaks=0 } function set_sequence_number() @@ -306,7 +380,9 @@ function choosetype() fi done + build_build_var_cache set_stuff_for_environment + destroy_build_var_cache } # @@ -320,9 +396,10 @@ function chooseproduct() if [ "x$TARGET_PRODUCT" != x ] ; then default_value=$TARGET_PRODUCT else - default_value=full + default_value=aosp_arm fi + export TARGET_BUILD_APPS= export TARGET_PRODUCT= local ANSWER while [ -z "$TARGET_PRODUCT" ] @@ -350,7 +427,9 @@ function chooseproduct() fi done + build_build_var_cache set_stuff_for_environment + destroy_build_var_cache } function choosevariant() @@ -413,8 +492,10 @@ function choosecombo() choosevariant $3 echo + build_build_var_cache set_stuff_for_environment printconfig + destroy_build_var_cache } # Clear this variable. It will be built up again when the vendorsetup.sh @@ -434,11 +515,11 @@ function add_lunch_combo() # add the default one here add_lunch_combo aosp_arm-eng -add_lunch_combo aosp_x86-eng +add_lunch_combo aosp_arm64-eng add_lunch_combo aosp_mips-eng +add_lunch_combo aosp_mips64-eng +add_lunch_combo aosp_x86-eng add_lunch_combo aosp_x86_64-eng -add_lunch_combo aosp_arm64-eng -add_lunch_combo vbox_x86-eng function print_lunch_menu() { @@ -496,16 +577,6 @@ function lunch() export TARGET_BUILD_APPS= - local product=$(echo -n $selection | sed -e "s/-.*$//") - check_product $product - if [ $? -ne 0 ] - then - echo - echo "** Don't have a product spec for: '$product'" - echo "** Do you have the right repo manifest?" - product= - fi - local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//") check_variant $variant if [ $? -ne 0 ] @@ -516,6 +587,18 @@ function lunch() variant= fi + local product=$(echo -n $selection | sed -e "s/-.*$//") + TARGET_PRODUCT=$product \ + TARGET_BUILD_VARIANT=$variant \ + build_build_var_cache + if [ $? -ne 0 ] + then + echo + echo "** Don't have a product spec for: '$product'" + echo "** Do you have the right repo manifest?" + product= + fi + if [ -z "$product" -o -z "$variant" ] then echo @@ -530,6 +613,7 @@ function lunch() set_stuff_for_environment printconfig + destroy_build_var_cache } # Tab completion for lunch. @@ -546,12 +630,13 @@ function _lunch() complete -F _lunch lunch # Configures the build to build unbundled apps. -# Run tapas with one ore more app names (from LOCAL_PACKAGE_NAME) +# Run tapas with one or more app names (from LOCAL_PACKAGE_NAME) function tapas() { - local arch=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E '^(arm|x86|mips|armv5)$')) - local variant=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E '^(user|userdebug|eng)$')) - local apps=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E -v '^(user|userdebug|eng|arm|x86|mips|armv5)$')) + local arch="$(echo $* | xargs -n 1 echo | \grep -E '^(arm|x86|mips|armv5|arm64|x86_64|mips64)$' | xargs)" + local variant="$(echo $* | xargs -n 1 echo | \grep -E '^(user|userdebug|eng)$' | xargs)" + local density="$(echo $* | xargs -n 1 echo | \grep -E '^(ldpi|mdpi|tvdpi|hdpi|xhdpi|xxhdpi|xxxhdpi|alldpi)$' | xargs)" + 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)" if [ $(echo $arch | wc -w) -gt 1 ]; then echo "tapas: Error: Multiple build archs supplied: $arch" @@ -561,12 +646,19 @@ function tapas() echo "tapas: Error: Multiple build variants supplied: $variant" return fi + if [ $(echo $density | wc -w) -gt 1 ]; then + echo "tapas: Error: Multiple densities supplied: $density" + return + fi - local product=full + local product=aosp_arm case $arch in - x86) product=full_x86;; - mips) product=full_mips;; - armv5) product=generic_armv5;; + x86) product=aosp_x86;; + mips) product=aosp_mips;; + armv5) product=generic_armv5;; + arm64) product=aosp_arm64;; + x86_64) product=aosp_x86_64;; + mips64) product=aosp_mips64;; esac if [ -z "$variant" ]; then variant=eng @@ -574,21 +666,28 @@ function tapas() if [ -z "$apps" ]; then apps=all fi + if [ -z "$density" ]; then + density=alldpi + fi export TARGET_PRODUCT=$product export TARGET_BUILD_VARIANT=$variant + export TARGET_BUILD_DENSITY=$density export TARGET_BUILD_TYPE=release export TARGET_BUILD_APPS=$apps + build_build_var_cache set_stuff_for_environment printconfig + destroy_build_var_cache } function gettop { local TOPFILE=build/core/envsetup.mk if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then - echo $TOP + # The following circumlocution ensures we remove symlinks from TOP. + (cd $TOP; PWD= /bin/pwd) else if [ -f $TOPFILE ] ; then # The following circumlocution (repeated below as well) ensures @@ -600,7 +699,7 @@ function gettop T= while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do \cd .. - T=`PWD= /bin/pwd` + T=`PWD= /bin/pwd -P` done \cd $HERE if [ -f "$T/$TOPFILE" ]; then @@ -617,8 +716,8 @@ function getdriver() test "$WITH_STATIC_ANALYZER" = "0" && unset WITH_STATIC_ANALYZER if [ -n "$WITH_STATIC_ANALYZER" ]; then echo "\ -$T/prebuilts/clang/linux-x86/host/3.3/tools/scan-build/scan-build \ ---use-analyzer $T/prebuilts/clang/linux-x86/host/3.3/bin/analyzer \ +$T/prebuilts/misc/linux-x86/analyzer/tools/scan-build/scan-build \ +--use-analyzer $T/prebuilts/misc/linux-x86/analyzer/bin/analyzer \ --status-bugs \ --top=$T" fi @@ -632,6 +731,7 @@ function m() $DRV make -C $T -f build/core/main.mk $@ else echo "Couldn't locate the top of the tree. Try setting TOP." + return 1 fi } @@ -670,8 +770,10 @@ function mm() local M=`echo $M|sed 's:'$T'/::'` if [ ! "$T" ]; then echo "Couldn't locate the top of the tree. Try setting TOP." + return 1 elif [ ! "$M" ]; then echo "Couldn't locate a makefile from the current directory." + return 1 else for ARG in $@; do case $ARG in @@ -721,9 +823,14 @@ function mmm() MAKEFILE="$MAKEFILE $MFILE" else case $DIR in - showcommands | snod | dist | incrementaljavac) ARGS="$ARGS $DIR";; + showcommands | snod | dist | *=*) ARGS="$ARGS $DIR";; GET-INSTALL-PATH) GET_INSTALL_PATH=$DIR;; - *) echo "No Android.mk in $DIR."; return 1;; + *) if [ -d $DIR ]; then + echo "No Android.mk in $DIR."; + else + echo "Couldn't locate the directory $DIR"; + fi + return 1;; esac fi done @@ -734,6 +841,7 @@ function mmm() ONE_SHOT_MAKEFILE="$MAKEFILE" $DRV make -C $T -f build/core/main.mk $DASH_ARGS $MODULES $ARGS else echo "Couldn't locate the top of the tree. Try setting TOP." + return 1 fi } @@ -746,9 +854,13 @@ function mma() else if [ ! "$T" ]; then echo "Couldn't locate the top of the tree. Try setting TOP." + return 1 fi local MY_PWD=`PWD= /bin/pwd|sed 's:'$T'/::'` - $DRV make -C $T -f build/core/main.mk $@ all_modules BUILD_MODULES_IN_PATHS="$MY_PWD" + local MODULES_IN_PATHS=MODULES-IN-$MY_PWD + # Convert "/" to "-". + MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-} + $DRV make -C $T -f build/core/main.mk $@ $MODULES_IN_PATHS fi } @@ -766,25 +878,30 @@ function mmma() MY_PWD=`echo $MY_PWD|sed 's:'$T'/::'` fi local DIR= - local MODULE_PATHS= + local MODULES_IN_PATHS= local ARGS= for DIR in $DIRS ; do if [ -d $DIR ]; then - if [ "$MY_PWD" = "" ]; then - MODULE_PATHS="$MODULE_PATHS $DIR" - else - MODULE_PATHS="$MODULE_PATHS $MY_PWD/$DIR" + # Remove the leading ./ and trailing / if any exists. + DIR=${DIR#./} + DIR=${DIR%/} + if [ "$MY_PWD" != "" ]; then + DIR=$MY_PWD/$DIR fi + MODULES_IN_PATHS="$MODULES_IN_PATHS MODULES-IN-$DIR" else case $DIR in - showcommands | snod | dist | incrementaljavac) ARGS="$ARGS $DIR";; + showcommands | snod | dist | *=*) ARGS="$ARGS $DIR";; *) echo "Couldn't find directory $DIR"; return 1;; esac fi done - $DRV make -C $T -f build/core/main.mk $DASH_ARGS $ARGS all_modules BUILD_MODULES_IN_PATHS="$MODULE_PATHS" + # Convert "/" to "-". + MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-} + $DRV make -C $T -f build/core/main.mk $DASH_ARGS $ARGS $MODULES_IN_PATHS else echo "Couldn't locate the top of the tree. Try setting TOP." + return 1 fi } @@ -825,18 +942,18 @@ function qpid() { append='$' shift elif [ "$1" = "--help" -o "$1" = "-h" ]; then - echo "usage: qpid [[--exact] " - return 255 - fi + echo "usage: qpid [[--exact] " + return 255 + fi local EXE="$1" if [ "$EXE" ] ; then - qpid | \grep "$prepend$EXE$append" - else - adb shell ps \ - | tr -d '\r' \ - | sed -e 1d -e 's/^[^ ]* *\([0-9]*\).* \([^ ]*\)$/\1 \2/' - fi + qpid | \grep "$prepend$EXE$append" + else + adb shell ps \ + | tr -d '\r' \ + | sed -e 1d -e 's/^[^ ]* *\([0-9]*\).* \([^ ]*\)$/\1 \2/' + fi } function pid() @@ -857,10 +974,89 @@ function pid() echo "$PID" else echo "usage: pid [--exact] " - return 255 + return 255 fi } +# coredump_setup - enable core dumps globally for any process +# that has the core-file-size limit set correctly +# +# NOTE: You must call also coredump_enable for a specific process +# if its core-file-size limit is not set already. +# NOTE: Core dumps are written to ramdisk; they will not survive a reboot! + +function coredump_setup() +{ + echo "Getting root..."; + adb root; + adb wait-for-device; + + echo "Remounting root partition read-write..."; + adb shell mount -w -o remount -t rootfs rootfs; + sleep 1; + adb wait-for-device; + adb shell mkdir -p /cores; + adb shell mount -t tmpfs tmpfs /cores; + adb shell chmod 0777 /cores; + + echo "Granting SELinux permission to dump in /cores..."; + adb shell restorecon -R /cores; + + echo "Set core pattern."; + adb shell 'echo /cores/core.%p > /proc/sys/kernel/core_pattern'; + + echo "Done." +} + +# coredump_enable - enable core dumps for the specified process +# $1 = PID of process (e.g., $(pid mediaserver)) +# +# NOTE: coredump_setup must have been called as well for a core +# dump to actually be generated. + +function coredump_enable() +{ + local PID=$1; + if [ -z "$PID" ]; then + printf "Expecting a PID!\n"; + return; + fi; + echo "Setting core limit for $PID to infinite..."; + adb shell prlimit $PID 4 -1 -1 +} + +# core - send SIGV and pull the core for process +# $1 = PID of process (e.g., $(pid mediaserver)) +# +# NOTE: coredump_setup must be called once per boot for core dumps to be +# enabled globally. + +function core() +{ + local PID=$1; + + if [ -z "$PID" ]; then + printf "Expecting a PID!\n"; + return; + fi; + + local CORENAME=core.$PID; + local COREPATH=/cores/$CORENAME; + local SIG=SEGV; + + coredump_enable $1; + + local done=0; + while [ $(adb shell "[ -d /proc/$PID ] && echo -n yes") ]; do + printf "\tSending SIG%s to %d...\n" $SIG $PID; + adb shell kill -$SIG $PID; + sleep 1; + done; + + adb shell "while [ ! -f $COREPATH ] ; do echo waiting for $COREPATH to be generated; sleep 1; done" + echo "Done: core is under $COREPATH on device."; +} + # systemstack - dump the current stack trace of all threads in the system process # to the usual ANR traces file function systemstack() @@ -910,103 +1106,42 @@ function stacks() adb shell cat $TMP else # Dump stacks of native process - adb shell debuggerd -b $PID + local USE64BIT="$(is64bit $PID)" + adb shell debuggerd$USE64BIT -b $PID fi fi } -function gdbwrapper() -{ - $ANDROID_TOOLCHAIN/$GDB -x "$@" -} - -function gdbclient() -{ - local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT) - local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED) - local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED) - local OUT_EXE_SYMBOLS=$(get_abs_build_var TARGET_OUT_EXECUTABLES_UNSTRIPPED) - local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS) - local ARCH=$(get_build_var TARGET_ARCH) - local GDB - case "$ARCH" in - x86) GDB=x86_64-linux-android-gdb;; - arm) GDB=arm-linux-androideabi-gdb;; - mips) GDB=mipsel-linux-android-gdb;; - *) echo "Unknown arch $ARCH"; return 1;; - esac - - if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then - local EXE="$1" - if [ "$EXE" ] ; then - EXE=$1 - else - EXE="app_process" - fi - - local PORT="$2" - if [ "$PORT" ] ; then - PORT=$2 - else - PORT=":5039" - fi - - local PID="$3" - if [ "$PID" ] ; then - if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then - PID=`pid $3` - if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then - # that likely didn't work because of returning multiple processes - # try again, filtering by root processes (don't contain colon) - PID=`adb shell ps | \grep $3 | \grep -v ":" | awk '{print $2}'` - if [[ ! "$PID" =~ ^[0-9]+$ ]] - then - echo "Couldn't resolve '$3' to single PID" - return 1 - else - echo "" - echo "WARNING: multiple processes matching '$3' observed, using root process" - echo "" - fi - fi - fi - adb forward "tcp$PORT" "tcp$PORT" - adb shell gdbserver $PORT --attach $PID & - sleep 2 - else - echo "" - echo "If you haven't done so already, do this first on the device:" - echo " gdbserver $PORT /system/bin/$EXE" - echo " or" - echo " gdbserver $PORT --attach " - echo "" - fi - - echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS" - 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" - echo >>"$OUT_ROOT/gdbclient.cmds" "source $ANDROID_BUILD_TOP/development/scripts/gdb/dalvik.gdb" - echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT" - echo >>"$OUT_ROOT/gdbclient.cmds" "" - - gdbwrapper "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE" - else - echo "Unable to determine build system output dir." - fi - +# Read the ELF header from /proc/$PID/exe to determine if the process is +# 64-bit. +function is64bit() +{ + local PID="$1" + if [ "$PID" ] ; then + if [[ "$(adb shell cat /proc/$PID/exe | xxd -l 1 -s 4 -ps)" -eq "02" ]] ; then + echo "64" + else + echo "" + fi + else + echo "" + fi } case `uname -s` in Darwin) function sgrep() { - find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cpp|S|java|xml|sh|mk)' -print0 | xargs -0 grep --color -n "$@" + find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cc|cpp|S|java|xml|sh|mk|aidl|vts)' \ + -exec grep --color -n "$@" {} + } ;; *) function sgrep() { - find . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.\(c\|h\|cpp\|S\|java\|xml\|sh\|mk\)' -print0 | xargs -0 grep --color -n "$@" + find . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.\(c\|h\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\|vts\)' \ + -exec grep --color -n "$@" {} + } ;; esac @@ -1018,56 +1153,73 @@ function gettargetarch function ggrep() { - find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.gradle" -print0 | xargs -0 grep --color -n "$@" + find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.gradle" \ + -exec grep --color -n "$@" {} + } function jgrep() { - find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@" + find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.java" \ + -exec grep --color -n "$@" {} + } function cgrep() { - 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' \) -print0 | xargs -0 grep --color -n "$@" + 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' \) \ + -exec grep --color -n "$@" {} + } function resgrep() { - 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; + 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' -exec grep --color -n "$@" {} + + done } function mangrep() { - find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -name 'AndroidManifest.xml' -print0 | xargs -0 grep --color -n "$@" + find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -name 'AndroidManifest.xml' \ + -exec grep --color -n "$@" {} + } function sepgrep() { - 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 "$@" + find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -name sepolicy -type d \ + -exec grep --color -n -r --exclude-dir=\.git "$@" {} + +} + +function rcgrep() +{ + find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.rc*" \ + -exec grep --color -n "$@" {} + } case `uname -s` in Darwin) function mgrep() { - 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 "$@" + find -E . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)' \ + -exec grep --color -n "$@" {} + } function treegrep() { - 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 "$@" + find -E . -name .repo -prune -o -name .git -prune -o -type f -iregex '.*\.(c|h|cpp|S|java|xml)' \ + -exec grep --color -n -i "$@" {} + } ;; *) function mgrep() { - 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 "$@" + find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -type f \ + -exec grep --color -n "$@" {} + } function treegrep() { - 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 "$@" + find . -name .repo -prune -o -name .git -prune -o -regextype posix-egrep -iregex '.*\.(c|h|cpp|S|java|xml)' -type f \ + -exec grep --color -n -i "$@" {} + } ;; @@ -1156,9 +1308,7 @@ function runhat() fi # issue "am" command to cause the hprof dump - local sdcard=$(adb ${adbOptions} shell echo -n '$EXTERNAL_STORAGE') - local devFile=$sdcard/hprof-$targetPid - #local devFile=/data/local/hprof-$targetPid + local devFile=/data/local/tmp/hprof-$targetPid echo "Poking $targetPid and waiting for data..." echo "Storing data at $devFile" adb ${adbOptions} shell am dumpheap $targetPid $devFile @@ -1290,14 +1440,20 @@ function godir () { return fi T=$(gettop) - if [[ ! -f $T/filelist ]]; then + if [ ! "$OUT_DIR" = "" ]; then + mkdir -p $OUT_DIR + FILELIST=$OUT_DIR/filelist + else + FILELIST=$T/filelist + fi + if [[ ! -f $FILELIST ]]; then echo -n "Creating index..." - (\cd $T; find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > filelist) + (\cd $T; find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > $FILELIST) echo " Done" echo "" fi local lines - lines=($(\grep "$1" $T/filelist | sed -e 's/\/[^/]*$//' | sort | uniq)) + lines=($(\grep "$1" $FILELIST | sed -e 's/\/[^/]*$//' | sort | uniq)) if [[ ${#lines[@]} = 0 ]]; then echo "Not found" return @@ -1328,14 +1484,11 @@ function godir () { \cd $T/$pathname } -# Force JAVA_HOME to point to java 1.7 or java 1.6 if it isn't already set. -# -# Note that the MacOS path for java 1.7 includes a minor revision number (sigh). -# For some reason, installing the JDK doesn't make it show up in the -# JavaVM.framework/Versions/1.7/ folder. +# Force JAVA_HOME to point to java 1.7/1.8 if it isn't already set. function set_java_home() { # Clear the existing JAVA_HOME value if we set it ourselves, so that - # we can reset it later, depending on the value of EXPERIMENTAL_USE_JAVA7. + # we can reset it later, depending on the version of java the build + # system needs. # # If we don't do this, the JAVA_HOME value set by the first call to # build/envsetup.sh will persist forever. @@ -1344,22 +1497,23 @@ function set_java_home() { fi if [ ! "$JAVA_HOME" ]; then - if [ ! "$EXPERIMENTAL_USE_JAVA7" ]; then + if [ -n "$LEGACY_USE_JAVA7" ]; then + echo Warning: Support for JDK 7 will be dropped. Switch to JDK 8. case `uname -s` in Darwin) - export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home + export JAVA_HOME=$(/usr/libexec/java_home -v 1.7) ;; *) - export JAVA_HOME=/usr/lib/jvm/java-6-sun + export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 ;; esac else case `uname -s` in Darwin) - export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home + export JAVA_HOME=$(/usr/libexec/java_home -v 1.8) ;; *) - export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 + export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 ;; esac fi @@ -1376,28 +1530,43 @@ function pez { local retval=$? if [ $retval -ne 0 ] then - echo -e "\e[0;31mFAILURE\e[00m" + echo $'\E'"[0;31mFAILURE\e[00m" else - echo -e "\e[0;32mSUCCESS\e[00m" + echo $'\E'"[0;32mSUCCESS\e[00m" fi return $retval } +function get_make_command() +{ + echo command make +} + function make() { local start_time=$(date +"%s") - command make "$@" + $(get_make_command) "$@" local ret=$? local end_time=$(date +"%s") local tdiff=$(($end_time-$start_time)) local hours=$(($tdiff / 3600 )) local mins=$((($tdiff % 3600) / 60)) local secs=$(($tdiff % 60)) + local ncolors=$(tput colors 2>/dev/null) + if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then + color_failed=$'\E'"[0;31m" + color_success=$'\E'"[0;32m" + color_reset=$'\E'"[00m" + else + color_failed="" + color_success="" + color_reset="" + fi echo if [ $ret -eq 0 ] ; then - echo -n -e "#### make completed successfully " + echo -n "${color_success}#### make completed successfully " else - echo -n -e "#### make failed to build some targets " + echo -n "${color_failed}#### make failed to build some targets " fi if [ $hours -gt 0 ] ; then printf "(%02g:%02g:%02g (hh:mm:ss))" $hours $mins $secs @@ -1406,11 +1575,40 @@ function make() elif [ $secs -gt 0 ] ; then printf "(%s seconds)" $secs fi - echo -e " ####" + echo " ####${color_reset}" echo return $ret } +function provision() +{ + if [ ! "$ANDROID_PRODUCT_OUT" ]; then + echo "Couldn't locate output files. Try running 'lunch' first." >&2 + return 1 + fi + if [ ! -e "$ANDROID_PRODUCT_OUT/provision-device" ]; then + echo "There is no provisioning script for the device." >&2 + return 1 + fi + + # Check if user really wants to do this. + if [ "$1" = "--no-confirmation" ]; then + shift 1 + else + echo "This action will reflash your device." + echo "" + echo "ALL DATA ON THE DEVICE WILL BE IRREVOCABLY ERASED." + echo "" + echo -n "Are you sure you want to do this (yes/no)? " + read + if [[ "${REPLY}" != "yes" ]] ; then + echo "Not taking any action. Exiting." >&2 + return 1 + fi + fi + "$ANDROID_PRODUCT_OUT/provision-device" "$@" +} + if [ "x$SHELL" != "x/bin/bash" ]; then case `ps -o command -p $$` in *bash*) @@ -1422,8 +1620,9 @@ if [ "x$SHELL" != "x/bin/bash" ]; then fi # Execute the contents of any vendorsetup.sh files we can find. -for f in `test -d device && find device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null` \ - `test -d vendor && find vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null` +for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \ + `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \ + `test -d product && find -L product -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` do echo "including $f" . $f