Skip to content

Instantly share code, notes, and snippets.

@asus4
Created May 13, 2026 11:17
Show Gist options
  • Select an option

  • Save asus4/ff4f07980eba51ac8b85d0f22a5af841 to your computer and use it in GitHub Desktop.

Select an option

Save asus4/ff4f07980eba51ac8b85d0f22a5af841 to your computer and use it in GitHub Desktop.
Run apk and start app
#!/usr/bin/env bash
set -euo pipefail
shopt -s nullglob
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
APK_PATH=""
LOG_TAGS=(Unity tflite onnxruntime mlas)
usage() {
cat <<'EOF'
Usage: ./run_apk.sh [options]
Installs or re-installs an APK from this Build folder, detects its package name,
starts the Android app, then starts filtered Unity, TensorFlow Lite, and ONNX
Runtime logcat output. Press Ctrl+C to stop logging.
Options:
--apk PATH APK to install. Defaults to the only *.apk in this folder.
-h, --help Show this help.
Examples:
./run_apk.sh
./run_apk.sh --apk ./app.apk
EOF
}
while [[ $# -gt 0 ]]; do
case "$1" in
--apk)
if [[ $# -lt 2 ]]; then
echo "Missing value for --apk" >&2
exit 1
fi
APK_PATH="$2"
shift 2
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown option: $1" >&2
usage >&2
exit 1
;;
esac
done
if ! command -v adb >/dev/null 2>&1; then
echo "adb was not found in PATH. Install Android platform-tools or add adb to PATH." >&2
exit 1
fi
find_android_tool() {
local tool_name="$1"
local sdk_root candidate found=""
if command -v "$tool_name" >/dev/null 2>&1; then
command -v "$tool_name"
return 0
fi
for sdk_root in "${ANDROID_HOME:-}" "${ANDROID_SDK_ROOT:-}"; do
[[ -d "$sdk_root" ]] || continue
for candidate in \
"$sdk_root"/build-tools/*/"$tool_name" \
"$sdk_root"/cmdline-tools/latest/bin/"$tool_name" \
"$sdk_root"/cmdline-tools/*/bin/"$tool_name" \
"$sdk_root"/tools/bin/"$tool_name"; do
[[ -x "$candidate" ]] && found="$candidate"
done
done
[[ -n "$found" ]] || return 1
printf '%s\n' "$found"
}
detect_package_name() {
local apk_path="$1"
local tool_path package_name=""
if tool_path="$(find_android_tool aapt)"; then
package_name="$("$tool_path" dump badging "$apk_path" 2>/dev/null \
| sed -n "s/package: name='\([^']*\)'.*/\1/p" || true)"
fi
if [[ -z "$package_name" ]] && tool_path="$(find_android_tool apkanalyzer)"; then
package_name="$("$tool_path" manifest application-id "$apk_path" 2>/dev/null || true)"
fi
[[ -n "$package_name" ]] || return 1
printf '%s\n' "$package_name"
}
if [[ -z "$APK_PATH" ]]; then
APK_CANDIDATES=("$SCRIPT_DIR"/*.apk)
case "${#APK_CANDIDATES[@]}" in
0)
echo "No APK found in $SCRIPT_DIR. Pass one with --apk PATH." >&2
exit 1
;;
1)
APK_PATH="${APK_CANDIDATES[0]}"
;;
*)
echo "More than one APK found in $SCRIPT_DIR. Pass one with --apk PATH." >&2
printf ' %s\n' "${APK_CANDIDATES[@]}" >&2
exit 1
;;
esac
elif [[ "$APK_PATH" != /* ]]; then
APK_PATH="$PWD/$APK_PATH"
fi
if [[ ! -f "$APK_PATH" ]]; then
echo "APK not found: $APK_PATH" >&2
exit 1
fi
if ! PACKAGE_NAME="$(detect_package_name "$APK_PATH")"; then
echo "Could not detect package name from APK: $APK_PATH" >&2
echo "Install Android SDK build-tools so aapt is available, install cmdline-tools so apkanalyzer is available, or set ANDROID_HOME/ANDROID_SDK_ROOT." >&2
exit 1
fi
echo "Target devices:"
adb devices
echo
echo "Installing APK:"
echo " $APK_PATH"
adb install -r -d "$APK_PATH"
echo
echo "Clearing logcat..."
adb logcat -c
echo
echo "Starting Android app:"
echo " $PACKAGE_NAME"
adb shell monkey -p "$PACKAGE_NAME" -c android.intent.category.LAUNCHER 1 >/dev/null
echo
echo "Starting filtered logcat. Press Ctrl+C to stop."
echo " Tags: ${LOG_TAGS[*]}"
adb logcat -v time -s "${LOG_TAGS[@]}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment