#!/bin/bash # rebuild_wechathook.sh — compile WeChatHook, repackage into com.example.wechathook APK # Uses the existing APK from device as a base (preserves binary AndroidManifest). set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" ADB="${ADB:-$SCRIPT_DIR/../platform-tools/adb}" [ ! -f "$ADB" ] && ADB=adb 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" 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/wechathook_rebuild rm -rf "$BUILD_DIR" mkdir -p "$BUILD_DIR/compiled" "$BUILD_DIR/dex" "$BUILD_DIR/pack/assets" # Pull current APK from device to reuse its binary AndroidManifest and resources.arsc echo "== Pulling current wechathook APK from device ==" WH_PATH=$($ADB shell "pm path com.example.wechathook 2>/dev/null | tr -d '\r' | sed 's/package://'" 2>/dev/null) if [ -z "$WH_PATH" ]; then echo "ERROR: com.example.wechathook not installed on device" exit 1 fi $ADB shell "su -c \"cp $WH_PATH /data/local/tmp/wh_base.apk && chmod 644 /data/local/tmp/wh_base.apk\"" $ADB pull /data/local/tmp/wh_base.apk "$BUILD_DIR/pack/base.apk" 2>/dev/null # Extract AndroidManifest and resources from existing APK cd "$BUILD_DIR/pack" && unzip -o base.apk AndroidManifest.xml resources.arsc -d . > /dev/null 2>&1 rm -f base.apk echo "== Compiling WeChatHook.java ==" javac --release 11 \ -classpath "$ANDROID_JAR:$LEGACY_JAR" \ -d "$BUILD_DIR/compiled" \ "$SCRIPT_DIR/WeChatHook.java" echo "== Converting to DEX ==" $D8 \ --classpath "$ANDROID_JAR" \ --classpath "$LEGACY_JAR" \ --min-api 27 \ --output "$BUILD_DIR/dex" \ $(find "$BUILD_DIR/compiled/com/example/wechathook" -name "*.class") echo "== Packing APK ==" cp "$BUILD_DIR/dex/classes.dex" "$BUILD_DIR/pack/" # Put xposed_init in assets/ (required by lspd) AND root (belt+suspenders) echo "com.example.wechathook.WeChatHook" > "$BUILD_DIR/pack/assets/xposed_init" echo "com.example.wechathook.WeChatHook" > "$BUILD_DIR/pack/xposed_init" cd "$BUILD_DIR/pack" zip -0 wechathook.apk AndroidManifest.xml resources.arsc classes.dex xposed_init 2>/dev/null || true zip -0 wechathook.apk assets/xposed_init # Sign 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 ==" OUT="$SCRIPT_DIR/wechathook_v2_signed.apk" $APKSIGNER sign \ --ks /tmp/debug.keystore \ --ks-key-alias androiddebugkey \ --ks-pass pass:android \ --key-pass pass:android \ --out "$OUT" \ "$BUILD_DIR/pack/wechathook.apk" 2>/dev/null echo "== Done: $OUT ==" echo "APK size: $(wc -c < "$OUT") bytes" echo "" echo "Next steps:" echo " adb install -r --no-incremental $OUT" echo " bash $SCRIPT_DIR/update_wechathook_db.sh" echo " adb reboot"