Files
Kvaesitso/scripts/ondevice.sh
Jonas Haugesen 3f677e2c87 Build debug APKs on the phone itself
docs: the Termux home now has a working aarch64 Android SDK, so record
how to build here, how the debug build differs from the release one
(separate package, own data directory, so it cannot touch the installed
launcher's config), and warn about the destructive uninstall path.

scripts/ondevice.sh wraps the loop: build, install over the debug
package, launch, follow logcat, read the newest crash report, and build
the signed release APK.
2026-09-11 09:58:08 +02:00

88 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Build and test this fork directly on the phone, from Termux.
# See CLAUDE.md ("Building on the phone itself") for the SDK setup this expects.
#
# The debug build is the package "de.mm20.launcher2.debug": a separate install from the
# real launcher ("de.mm20.launcher2.release") with its own, initially empty, data directory.
set -euo pipefail
REPO=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
PKG=de.mm20.launcher2.debug
ACTIVITY=de.mm20.launcher2.ui.launcher.LauncherActivity
DEBUG_APK=$REPO/app/app/build/outputs/apk/default/debug/app-default-debug.apk
RELEASE_APK=$REPO/app/app/build/outputs/apk/default/release/app-default-release.apk
usage() {
cat <<'EOF'
Usage: scripts/ondevice.sh <command>
build assemble the debug APK
install build, then install the debug APK (needs root)
start launch the installed debug build
logs follow logcat of the running debug build
crash print the newest crash report for the debug build
release assemble the signed release APK: same package and key as the launcher
installed from Obtanium, so it installs over it and keeps all data
EOF
}
# Termux ships JDK 21 in $PREFIX; on other machines JAVA_HOME has to be set already.
if [ -z "${JAVA_HOME:-}" ] && [ -n "${PREFIX:-}" ] && [ -d "$PREFIX/lib/jvm/java-21-openjdk" ]; then
export JAVA_HOME=$PREFIX/lib/jvm/java-21-openjdk
fi
gradle() {
( cd "$REPO" && ./gradlew --console=plain "$@" )
}
# Long builds outlive the screen lock; keep the CPU awake until they are done.
wake() {
command -v termux-wake-lock >/dev/null && termux-wake-lock || true
}
build_debug() {
wake
gradle :app:app:assembleDefaultDebug
ls -l "$DEBUG_APK"
}
# Every su -c argument below mixes two quoting levels: the single quoted parts are handed
# to the root shell as-is (so $( ) and $pid are expanded there), the "..." parts are
# expanded here.
case "${1:-}" in
build)
build_debug
;;
install)
build_debug
# Termux cannot use pm itself; root can, and can read the APK from ~/sources.
su -c "pm install -r -d '$DEBUG_APK'"
;;
start)
su -c "am start -n $PKG/$ACTIVITY"
;;
logs)
su -c 'pid=$(pidof '"$PKG"')
if [ -z "$pid" ]; then
echo "not running - start it first (scripts/ondevice.sh start)" >&2
exit 1
fi
exec logcat --pid=$pid'
;;
crash)
su -c 'for f in $(ls -t /data/system/dropbox/data_app_crash@*.txt 2>/dev/null | head -30); do
if grep -q '"$PKG"' "$f"; then echo "== $f"; cat "$f"; break; fi
done'
;;
release)
wake
gradle :app:app:assembleDefaultRelease
ls -l "$RELEASE_APK"
;;
*)
usage
exit 1
;;
esac