rebuild_xhshook.sh 2.36 KB
#!/bin/bash
# rebuild_xhshook.sh — 在 Mac 上重新编译 xhshook,产物写到本目录
set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ANDROID_HOME="${ANDROID_HOME:-/opt/homebrew/share/android-commandlinetools}"
ANDROID_JAR="$ANDROID_HOME/platforms/android-36/android.jar"
D8="$ANDROID_HOME/build-tools/36.0.0/d8"
APKSIGNER="$ANDROID_HOME/build-tools/36.0.0/apksigner"
LSPOSED_DIR="${LSPOSED_DIR:-/tmp/LSPosed}"
LEGACY_JAR="$LSPOSED_DIR/legacy/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar"

# Fallback: download Xposed API from maven if LSPosed not built
if [ ! -f "$LEGACY_JAR" ]; then
  echo "LSPosed legacy JAR not found at $LEGACY_JAR"
  echo "Run: git clone --depth 1 --recursive https://github.com/JingMatrix/LSPosed.git $LSPOSED_DIR && cd $LSPOSED_DIR && ./gradlew :legacy:assembleRelease"
  exit 1
fi

BUILD_DIR=/tmp/xhshook_rebuild
mkdir -p "$BUILD_DIR/compiled" "$BUILD_DIR/dex" "$BUILD_DIR/pack/assets"

echo "== Compiling Hook.java =="
javac --release 11 \
  -classpath "$ANDROID_JAR:$LEGACY_JAR" \
  -d "$BUILD_DIR/compiled" \
  "$SCRIPT_DIR/xhshook_src/Hook.java"

echo "== Converting to DEX =="
$D8 \
  --classpath "$ANDROID_JAR" \
  --classpath "$LEGACY_JAR" \
  --min-api 27 \
  --output "$BUILD_DIR/dex" \
  $(find "$BUILD_DIR/compiled/com/hermes/xhshook" -name "*.class")

echo "== Packing APK =="
cp "$SCRIPT_DIR/xhshook_src/AndroidManifest.xml" "$BUILD_DIR/pack/" 2>/dev/null || \
  cp /tmp/xhshook_extracted/AndroidManifest.xml "$BUILD_DIR/pack/"
cp "$BUILD_DIR/dex/classes.dex" "$BUILD_DIR/pack/"
echo "com.hermes.xhshook.Hook" > "$BUILD_DIR/pack/assets/xposed_init"
cd "$BUILD_DIR/pack"
zip -0 "$BUILD_DIR/xhshook.apk" AndroidManifest.xml classes.dex assets/xposed_init

# Create keystore if needed
if [ ! -f /tmp/debug.keystore ]; then
  keytool -genkey -v -keystore /tmp/debug.keystore -alias androiddebugkey \
    -keyalg RSA -keysize 2048 -validity 10000 \
    -storepass android -keypass android \
    -dname "CN=Android Debug,O=Android,C=US" 2>/dev/null
fi

echo "== Signing =="
$APKSIGNER sign \
  --ks /tmp/debug.keystore \
  --ks-key-alias androiddebugkey \
  --ks-pass pass:android \
  --key-pass pass:android \
  --out "$SCRIPT_DIR/xhshook_v2_signed.apk" \
  "$BUILD_DIR/xhshook.apk" 2>/dev/null

echo "== Done: $SCRIPT_DIR/xhshook_v2_signed.apk =="
echo "APK size: $(wc -c < "$SCRIPT_DIR/xhshook_v2_signed.apk") bytes"