Files
OpenRoyale/tools/scripts/verify_apk.sh
T
2026-07-03 07:44:47 +02:00

41 lines
1.8 KiB
Bash

set -euo pipefail
APK="${1:?usage: verify_apk.sh <app.apk> [armeabi-v7a|arm64-v8a|universal]}"
EXPECT="${2:-}"
[ -f "$APK" ] || { echo "APK not found: $APK"; exit 1; }
REQUIRED_LIBS=(libfmod.so libg.so libcr.so)
fail=0
echo "[*] Zip integrity"; unzip -tq "$APK" >/dev/null && echo " ok" || { echo " CORRUPT"; fail=1; }
echo "[*] classes.dex present"; unzip -l "$APK" | grep -q 'classes.*\.dex' && echo " ok" || { echo " MISSING dex"; fail=1; }
echo "[*] AndroidManifest present"; unzip -l "$APK" | grep -q 'AndroidManifest.xml' && echo " ok" || { echo " MISSING manifest"; fail=1; }
echo "[*] Native libs / ABI check"
TMP="$(mktemp -d)"; trap 'rm -rf "$TMP"' EXIT
unzip -qo "$APK" 'lib/*' -d "$TMP" 2>/dev/null || true
mapfile -t ABIS < <(ls "$TMP/lib" 2>/dev/null || true)
if [ "${#ABIS[@]}" -eq 0 ]; then echo " NO native libs in APK"; fail=1; fi
for abi in "${ABIS[@]}"; do
echo " ABI $abi:"
case "$abi" in
armeabi-v7a) want="ELF 32-bit.*ARM";;
arm64-v8a) want="ELF 64-bit.*aarch64\|ELF 64-bit.*AArch64\|ELF 64-bit.*ARM aarch64";;
*) want=".";;
esac
for f in "$TMP/lib/$abi"/*.so; do
[ -e "$f" ] || continue
desc="$(file -b "$f")"
if echo "$desc" | grep -qiE "$want"; then echo " ok $(basename "$f") [$desc]"
else echo " BAD $(basename "$f") expected /$want/ got: $desc"; fail=1; fi
done
if [ "$abi" = "arm64-v8a" ]; then
for req in "${REQUIRED_LIBS[@]}"; do
[ -e "$TMP/lib/$abi/$req" ] || { echo " MISSING required arm64 lib: $req (arm64 INCOMPLETE)"; fail=1; }
done
fi
done
[ -z "$EXPECT" ] || { [ -d "$TMP/lib/$EXPECT" ] || [ "$EXPECT" = universal ] || { echo "[!] expected ABI '$EXPECT' not in APK"; fail=1; }; }
if [ "$fail" -eq 0 ]; then echo "[+] VERIFY OK: $APK"; else echo "[x] VERIFY FAILED: $APK"; fi
exit "$fail"