# Find the closest Android.mk file.
T=$(gettop)
local M=$(findmakefile)
+ local MODULES=
+ local GET_INSTALL_PATH=
+ local ARGS=
# Remove the path to top as the makefilepath needs to be relative
local M=`echo $M|sed 's:'$T'/::'`
if [ ! "$T" ]; then
elif [ ! "$M" ]; then
echo "Couldn't locate a makefile from the current directory."
else
- ONE_SHOT_MAKEFILE=$M make -C $T -f build/core/main.mk all_modules $@
+ for ARG in $@; do
+ case $ARG in
+ GET-INSTALL-PATH) GET_INSTALL_PATH=$ARG;;
+ esac
+ done
+ if [ -n "$GET_INSTALL_PATH" ]; then
+ MODULES=
+ ARGS=GET-INSTALL-PATH
+ else
+ MODULES=all_modules
+ ARGS=$@
+ fi
+ ONE_SHOT_MAKEFILE=$M make -C $T -f build/core/main.mk $MODULES $ARGS
fi
fi
}
local MODULES=
local ARGS=
local DIR TO_CHOP
+ local GET_INSTALL_PATH=
local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
for DIR in $DIRS ; do
fi
DIR=`echo $DIR | sed -e 's/:.*//' -e 's:/$::'`
if [ -f $DIR/Android.mk ]; then
- TO_CHOP=`(\cd -P -- $T && pwd -P) | wc -c | tr -d ' '`
- TO_CHOP=`expr $TO_CHOP + 1`
- START=`PWD= /bin/pwd`
- MFILE=`echo $START | cut -c${TO_CHOP}-`
+ local TO_CHOP=`(\cd -P -- $T && pwd -P) | wc -c | tr -d ' '`
+ local TO_CHOP=`expr $TO_CHOP + 1`
+ local START=`PWD= /bin/pwd`
+ local MFILE=`echo $START | cut -c${TO_CHOP}-`
if [ "$MFILE" = "" ] ; then
MFILE=$DIR/Android.mk
else
fi
MAKEFILE="$MAKEFILE $MFILE"
else
- if [ "$DIR" = snod ]; then
- ARGS="$ARGS snod"
- elif [ "$DIR" = showcommands ]; then
- ARGS="$ARGS showcommands"
- elif [ "$DIR" = dist ]; then
- ARGS="$ARGS dist"
- elif [ "$DIR" = incrementaljavac ]; then
- ARGS="$ARGS incrementaljavac"
- else
- echo "No Android.mk in $DIR."
- return 1
- fi
+ case $DIR in
+ showcommands | snod | dist | incrementaljavac) ARGS="$ARGS $DIR";;
+ GET-INSTALL-PATH) GET_INSTALL_PATH=$DIR;;
+ *) echo "No Android.mk in $DIR."; return 1;;
+ esac
fi
done
+ if [ -n "$GET_INSTALL_PATH" ]; then
+ ARGS=$GET_INSTALL_PATH
+ MODULES=
+ fi
ONE_SHOT_MAKEFILE="$MAKEFILE" 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."
echo "can't find Android.mk"
}
+# simplified version of ps; output in the form
+# <pid> <procname>
+function qpid() {
+ local prepend=''
+ local append=''
+ if [ "$1" = "--exact" ]; then
+ prepend=' '
+ append='$'
+ shift
+ elif [ "$1" = "--help" -o "$1" = "-h" ]; then
+ echo "usage: qpid [[--exact] <process name|pid>"
+ 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
+}
+
function pid()
{
- local EXE="$1"
- if [ "$EXE" ] ; then
- local PID=`adb shell ps | fgrep $1 | sed -e 's/[^ ]* *\([0-9]*\).*/\1/'`
- echo "$PID"
- else
- echo "usage: pid name"
- fi
+ local prepend=''
+ local append=''
+ if [ "$1" = "--exact" ]; then
+ prepend=' '
+ append='$'
+ shift
+ fi
+ local EXE="$1"
+ if [ "$EXE" ] ; then
+ local PID=`adb shell ps \
+ | tr -d '\r' \
+ | \grep "$prepend$EXE$append" \
+ | sed -e 's/^[^ ]* *\([0-9]*\).*$/\1/'`
+ echo "$PID"
+ else
+ echo "usage: pid [--exact] <process name>"
+ return 255
+ fi
}
# systemstack - dump the current stack trace of all threads in the system process
if [[ $1 =~ ^[0-9]+$ ]] ; then
local PID="$1"
elif [ "$1" ] ; then
- local PID=$(pid $1)
+ local PIDLIST="$(pid $1)"
+ if [[ $PIDLIST =~ ^[0-9]+$ ]] ; then
+ local PID="$PIDLIST"
+ elif [ "$PIDLIST" ] ; then
+ echo "more than one process: $1"
+ else
+ echo "no such process: $1"
+ fi
else
echo "usage: stacks [pid|process name]"
fi
if [ "$PID" ] ; then
- local TRACES=/data/anr/traces.txt
- local ORIG=/data/anr/traces.orig
- local TMP=/data/anr/traces.tmp
-
- # Keep original traces to avoid clobbering
- adb shell mv $TRACES $ORIG
-
- # Make sure we have a usable file
- adb shell touch $TRACES
- adb shell chmod 666 $TRACES
-
- # Dump stacks and wait for dump to finish
- adb shell kill -3 $PID
- adb shell notify $TRACES
-
- # Restore original stacks, and show current output
- adb shell mv $TRACES $TMP
- adb shell mv $ORIG $TRACES
- adb shell cat $TMP | less -S
+ # Determine whether the process is native
+ if adb shell ls -l /proc/$PID/exe | grep -q /system/bin/app_process ; then
+ # Dump stacks of Dalvik process
+ local TRACES=/data/anr/traces.txt
+ local ORIG=/data/anr/traces.orig
+ local TMP=/data/anr/traces.tmp
+
+ # Keep original traces to avoid clobbering
+ adb shell mv $TRACES $ORIG
+
+ # Make sure we have a usable file
+ adb shell touch $TRACES
+ adb shell chmod 666 $TRACES
+
+ # Dump stacks and wait for dump to finish
+ adb shell kill -3 $PID
+ adb shell notify $TRACES >/dev/null
+
+ # Restore original stacks, and show current output
+ adb shell mv $TRACES $TMP
+ adb shell mv $ORIG $TRACES
+ adb shell cat $TMP
+ else
+ # Dump stacks of native process
+ adb shell debuggerd -b $PID
+ fi
fi
}
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}'`
+ PID=`adb shell ps | \grep $3 | \grep -v ":" | awk '{print $2}'`
if [[ ! "$PID" =~ ^[0-9]+$ ]]
then
echo "Couldn't resolve '$3' to single PID"
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" ""
fi
# issue "am" command to cause the hprof dump
- local sdcard=$(adb shell echo -n '$EXTERNAL_STORAGE')
+ local sdcard=$(adb ${adbOptions} shell echo -n '$EXTERNAL_STORAGE')
local devFile=$sdcard/hprof-$targetPid
#local devFile=/data/local/hprof-$targetPid
echo "Poking $targetPid and waiting for data..."