43 lines
2.2 KiB
Bash
Executable File
43 lines
2.2 KiB
Bash
Executable File
#!/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 "# $(date '+%F %T') $(a getprop ro.build.display.id) / Android $(a getprop ro.build.version.release)"
|
|
echo "## system"
|
|
a 'uptime; cat /proc/loadavg'
|
|
a 'grep -E "MemTotal|MemAvailable|Cached:|SwapTotal|SwapFree" /proc/meminfo'
|
|
a 'su -c "cat /proc/sys/vm/swappiness; cat /sys/block/zram0/mm_stat 2>/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"
|