Files

130 lines
3.8 KiB
Bash

#!/usr/bin/env bash
# check-deps.sh — Verify dependencies and report what's missing
# Output includes machine-readable INSTALL:<dep> lines for each missing dependency.
# The install-dep.sh script can install each one.
set -euo pipefail
REQUIRED_JAVA_MAJOR=17
errors=0
missing_required=()
missing_optional=()
echo "=== Android Reverse Engineering: Dependency Check ==="
echo
# --- Java ---
java_ok=false
if command -v java &>/dev/null; then
java_version_output=$(java -version 2>&1 | head -1)
java_version=$(echo "$java_version_output" | sed -n 's/.*"\([0-9]*\)\..*/\1/p')
if [[ -z "$java_version" ]]; then
java_version=$(echo "$java_version_output" | grep -oE '[0-9]+' | head -1)
fi
if [[ "$java_version" == "1" ]]; then
java_version=$(echo "$java_version_output" | sed -n 's/.*"1\.\([0-9]*\)\..*/\1/p')
fi
if [[ -n "$java_version" ]] && (( java_version >= REQUIRED_JAVA_MAJOR )); then
echo "[OK] Java $java_version detected"
java_ok=true
else
echo "[WARN] Java detected but version $java_version is below $REQUIRED_JAVA_MAJOR"
errors=$((errors + 1))
missing_required+=("java")
fi
else
echo "[MISSING] Java is not installed or not in PATH"
errors=$((errors + 1))
missing_required+=("java")
fi
# --- jadx ---
if command -v jadx &>/dev/null; then
jadx_version=$(jadx --version 2>/dev/null || echo "unknown")
echo "[OK] jadx $jadx_version detected"
else
echo "[MISSING] jadx is not installed or not in PATH"
errors=$((errors + 1))
missing_required+=("jadx")
fi
# --- Fernflower / Vineflower ---
ff_found=false
if command -v vineflower &>/dev/null; then
echo "[OK] vineflower CLI detected"
ff_found=true
elif command -v fernflower &>/dev/null; then
echo "[OK] fernflower CLI detected"
ff_found=true
else
for candidate in \
"${FERNFLOWER_JAR_PATH:-}" \
"$HOME/.local/share/vineflower/vineflower.jar" \
"$HOME/fernflower/build/libs/fernflower.jar" \
"$HOME/vineflower/build/libs/vineflower.jar" \
"$HOME/fernflower/fernflower.jar" \
"$HOME/vineflower/vineflower.jar"; do
if [[ -n "$candidate" ]] && [[ -f "$candidate" ]]; then
echo "[OK] Fernflower/Vineflower JAR found: $candidate"
ff_found=true
break
fi
done
fi
if [[ "$ff_found" == false ]]; then
echo "[MISSING] Fernflower/Vineflower not found (optional — better output on complex Java code)"
missing_optional+=("vineflower")
fi
# --- dex2jar ---
if command -v d2j-dex2jar &>/dev/null || command -v d2j-dex2jar.sh &>/dev/null; then
echo "[OK] dex2jar detected"
else
echo "[MISSING] dex2jar not found (optional — needed to use Fernflower on APK/DEX files)"
missing_optional+=("dex2jar")
fi
# --- Optional: apktool ---
if command -v apktool &>/dev/null; then
echo "[OK] apktool detected (optional)"
else
echo "[MISSING] apktool not found (optional — useful for resource decoding)"
missing_optional+=("apktool")
fi
# --- Optional: adb ---
if command -v adb &>/dev/null; then
echo "[OK] adb detected (optional)"
else
echo "[MISSING] adb not found (optional — useful for pulling APKs from devices)"
missing_optional+=("adb")
fi
# --- Machine-readable summary ---
echo
if [[ ${#missing_required[@]} -gt 0 ]]; then
for dep in "${missing_required[@]}"; do
echo "INSTALL_REQUIRED:$dep"
done
fi
if [[ ${#missing_optional[@]} -gt 0 ]]; then
for dep in "${missing_optional[@]}"; do
echo "INSTALL_OPTIONAL:$dep"
done
fi
echo
if (( errors > 0 )); then
echo "*** ${#missing_required[@]} required dependency/ies missing. ***"
echo "Run install-dep.sh <name> to install, or see references/setup-guide.md."
exit 1
else
if [[ ${#missing_optional[@]} -gt 0 ]]; then
echo "Required dependencies OK. ${#missing_optional[@]} optional dependency/ies missing."
echo "Run install-dep.sh <name> to install optional tools."
else
echo "All dependencies are installed. Ready to decompile."
fi
exit 0
fi