termux_build.sh 2.93 KB
#!/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"