#!/data/data/com.termux/files/usr/bin/bash # termux_build.sh — 在 Termux 上编译 WeChatHook 并安装 # 所有依赖已在 /sdcard/wechathook/ 准备好 set -e BASE=/sdcard/wechathook SRC=$BASE/WeChatHook.java XPOSED_JAR=$BASE/XposedBridgeApi.jar ANDROID_JAR=$BASE/android.jar D8_JAR=$BASE/d8.jar BUILD=/data/data/com.termux/files/home/wh_build rm -rf "$BUILD" mkdir -p "$BUILD/compiled" "$BUILD/dex" "$BUILD/pack/assets" # 1. 取当前 APK 的 AndroidManifest + resources(二进制,不重新生成) WH_PATH=$(pm path com.example.wechathook | tr -d '\r' | sed 's/package://') echo "Base APK: $WH_PATH" su -c "cp '$WH_PATH' /data/local/tmp/wh_base.apk && chmod 644 /data/local/tmp/wh_base.apk" cp /data/local/tmp/wh_base.apk "$BUILD/pack/base.apk" cd "$BUILD/pack" && unzip -o base.apk AndroidManifest.xml resources.arsc -d . > /dev/null rm -f base.apk # 2. 编译 echo "== javac ==" javac --release 11 \ -classpath "$ANDROID_JAR:$XPOSED_JAR" \ -d "$BUILD/compiled" \ "$SRC" # 3. DEX echo "== d8 ==" java -cp "$D8_JAR" com.android.tools.r8.D8 \ --classpath "$ANDROID_JAR" \ --classpath "$XPOSED_JAR" \ --min-api 27 \ --output "$BUILD/dex" \ $(find "$BUILD/compiled" -name "*.class") # 4. 打包 echo "== pack ==" cp "$BUILD/dex/classes.dex" "$BUILD/pack/" echo "com.example.wechathook.WeChatHook" > "$BUILD/pack/assets/xposed_init" echo "com.example.wechathook.WeChatHook" > "$BUILD/pack/xposed_init" cd "$BUILD/pack" zip -0 wechathook.apk AndroidManifest.xml resources.arsc classes.dex xposed_init > /dev/null zip -0 wechathook.apk assets/xposed_init > /dev/null # 5. 签名(用 jarsigner,Termux JDK 自带) KEYSTORE=/data/data/com.termux/files/home/.wh_debug.keystore if [ ! -f "$KEYSTORE" ]; then echo "== 生成 keystore ==" keytool -genkey -v -keystore "$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 "== jarsigner ==" jarsigner -keystore "$KEYSTORE" -storepass android -keypass android \ -signedjar "$BUILD/pack/wechathook_signed.apk" \ "$BUILD/pack/wechathook.apk" androiddebugkey 2>/dev/null OUT=$BASE/wechathook_new.apk cp "$BUILD/pack/wechathook_signed.apk" "$OUT" echo "== APK ready: $OUT ($(wc -c < "$OUT") bytes) ==" # 6. 安装 echo "== pm install ==" su -c "pm install -r '$OUT'" # 7. 更新 LSPosed DB(apk_path 变了需要更新) NEW_PATH=$(pm path com.example.wechathook | tr -d '\r' | sed 's/package://') echo "== 更新 LSPosed DB: $NEW_PATH ==" su -c "python3 -c \" import sqlite3 db = sqlite3.connect('/data/adb/lspd/config/modules_config.db') db.execute(\\\"UPDATE modules SET apk_path='$NEW_PATH' WHERE module_pkg_name='com.example.wechathook'\\\") db.commit() db.close() print('LSPosed DB updated') \"" echo "" echo "== 完成,需要重启 WeChat 进程(或 reboot)使新模块生效 ==" echo " su -c 'killall com.tencent.mm' && am start -n com.tencent.mm/.ui.LauncherUI"