#!/usr/bin/env bash # Snapshot phone health: memory, load, crashes/ANRs since boot, low-memory kills, log errors, cold launches. # Usage: measure.sh OUT_FILE [launch-package ...] set -uo pipefail out=$1; shift a() { adb shell "$@" /dev/null"' echo "procs: $(a 'ls -d /proc/[0-9]* | wc -l')" echo "## top cpu" a 'top -b -n 1 -m 12 -o PID,USER,%CPU,%MEM,NAME' | tail -13 echo "## dropbox since boot" boot=$(a 'date -d @$(( $(date +%s) - $(cut -d. -f1 /proc/uptime) )) "+%Y-%m-%d %H:%M:%S"') a "dumpsys dropbox" | awk -v b="$boot" '$1" "$2 >= b && $3 ~ /anr|crash|watchdog|tombstone|wtf|lowmem|native/ {print $3}' | sort | uniq -c echo "## crash buffer (FATAL / ANR per process)" a 'logcat -d -b crash' | grep -oE "Process: [^,]+|FATAL EXCEPTION|>>> [^ ]+ <<<" | sort | uniq -c | sort -rn | head -20 a 'logcat -d -b events' | grep -oE "am_anr: \[[^]]*" | awk -F, '{print "ANR " $3}' | sort | uniq -c echo "## lmkd / am_kill" a 'logcat -d -b events' | grep -cE "am_kill|lmk_kill" | sed 's/^/kills: /' a 'logcat -d -b events' | grep -oE "am_kill: \[[^]]*" | awk -F, '{print $5}' | sort | uniq -c | sort -rn | head -10 echo "## logcat error tags (top 25)" a 'logcat -d *:E' | awk '{print $6}' | sort | uniq -c | sort -rn | head -25 echo "## thermal / battery" a 'dumpsys battery | grep -E "level|temperature|status"; for z in /sys/class/thermal/thermal_zone*; do echo "$(cat $z/type) $(cat $z/temp)"; done 2>/dev/null | sort -k2 -n | tail -5' if [ $# -gt 0 ]; then echo "## cold launches (ms, am start -W -S, 3 runs)" for p in "$@"; do t="" for _ in 1 2 3; do act=$(a "cmd package resolve-activity --brief -c android.intent.category.LAUNCHER $p" | tr -d '\r' | tail -1) v=$(a "am start -W -S -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n '$act'" | awk '/TotalTime/{print $2}') t="$t ${v:-fail}"; a 'input keyevent KEYCODE_HOME'; sleep 2 done echo "$p:$t" done fi } 2>&1 | tee "$out"