rebuild.sh
3.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/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"