Files
2026-07-09 07:40:42 +02:00

38 lines
1.8 KiB
Bash

#!/usr/bin/env bash
# sign_apk.sh - zipalign + apksigner (v1+v2+v3) with a debug key (or user key via env).
# Usage: sign_apk.sh <path/to/app.apk>
# Env (optional): KEYSTORE, KEY_ALIAS, KS_PASS, KEY_PASS (else a debug keystore is created).
set -euo pipefail
APK="${1:?usage: sign_apk.sh <app.apk>}"
[ -f "$APK" ] || { echo "APK not found: $APK"; exit 1; }
need() { command -v "$1" >/dev/null 2>&1 || { echo "ERROR: '$1' not found (install Android build-tools; see analysis/TOOLCHAIN.md)"; exit 7; }; }
# build-tools binaries are versioned; allow override via ZIPALIGN/APKSIGNER env
ZIPALIGN="${ZIPALIGN:-$(command -v zipalign || true)}"
APKSIGNER="${APKSIGNER:-$(command -v apksigner || true)}"
[ -n "$ZIPALIGN" ] || { echo "ERROR: zipalign not found (Android build-tools)"; exit 7; }
[ -n "$APKSIGNER" ] || { echo "ERROR: apksigner not found (Android build-tools)"; exit 7; }
need keytool
KEYSTORE="${KEYSTORE:-$HOME/.android/debug.keystore}"
KEY_ALIAS="${KEY_ALIAS:-androiddebugkey}"
KS_PASS="${KS_PASS:-android}"; KEY_PASS="${KEY_PASS:-android}"
if [ ! -f "$KEYSTORE" ]; then
echo "[*] Creating debug keystore at $KEYSTORE"
mkdir -p "$(dirname "$KEYSTORE")"
keytool -genkeypair -v -keystore "$KEYSTORE" -storepass "$KS_PASS" -keypass "$KEY_PASS" \
-alias "$KEY_ALIAS" -keyalg RSA -keysize 2048 -validity 10000 \
-dname "CN=Android Debug,O=Android,C=US"
fi
ALIGNED="${APK%.apk}-aligned.apk"
echo "[*] zipalign"; "$ZIPALIGN" -f -p 4 "$APK" "$ALIGNED"
echo "[*] apksigner (v1+v2+v3)"
"$APKSIGNER" sign --ks "$KEYSTORE" --ks-key-alias "$KEY_ALIAS" \
--ks-pass "pass:$KS_PASS" --key-pass "pass:$KEY_PASS" \
--v1-signing-enabled true --v2-signing-enabled true --v3-signing-enabled true \
--out "$APK" "$ALIGNED"
rm -f "$ALIGNED"
"$APKSIGNER" verify --verbose "$APK" | sed 's/^/ /'
echo "[+] Signed $APK"