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