AntiSplit-M 和 APKEditor
AntiSplit-M 和 APKEditor 都可以用来处理 split APK,也就是把 base.apk、split_config.*.apk 这类拆分包合并成一个普通 APK。
两者关系
AntiSplit-M 是 APKEditor 的一个 fork,项目 README 里也说明它是 APKEditor merge utilities 的 GUI 实现。
可以简单理解为:
| APKEditor = 底层工具,支持命令行
AntiSplit-M = Android 端图形界面,方便在手机上点选合并
|
不过 fork 不等于自动同步。APKEditor 更新后,AntiSplit-M 不会自动获得上游代码,除非作者主动 merge、cherry-pick 或手动同步相关实现。
所以:
- 想在手机上操作:用 AntiSplit-M。
- 想写脚本、批处理、CI 自动化:用 APKEditor。
- 想优先使用最新合并能力:优先用 APKEditor。
AntiSplit-M
AntiSplit-M 适合在 Android 设备上直接合并 split APK。
常见使用方式:
- 从文件管理器分享
.apks、.apkm、.xapk 给 AntiSplit-M。
- 在 AntiSplit-M 中选择本地文件进行合并。
- 从已安装 App 中选择 split APK 并合并。
它更像一个移动端 GUI 工具,不适合命令行自动化。
APKEditor
APKEditor 是命令行工具,更适合在电脑上处理。
下载地址:
合并 split APK:
| java -jar APKEditor.jar m -i input.apkm -o merged.apk
|
它支持的输入类型包括:
- split APK 目录
.apks
.apkm
.xapk
- 普通 APK
如果已经把 split APK 提取到了一个目录:
| splits/
base.apk
split_config.arm64_v8a.apk
split_config.xxhdpi.apk
|
可以这样合并:
| java -jar APKEditor.jar m -i splits -o merged.apk
|
从已安装 App 提取 split APK
先查看 App 的 APK 路径:
| adb shell pm path com.example.app
|
输出可能类似:
| package:/data/app/xxx/base.apk
package:/data/app/xxx/split_config.arm64_v8a.apk
package:/data/app/xxx/split_config.xxhdpi.apk
|
然后拉到本地:
| mkdir splits
adb pull /data/app/xxx/base.apk splits/
adb pull /data/app/xxx/split_config.arm64_v8a.apk splits/
adb pull /data/app/xxx/split_config.xxhdpi.apk splits/
|
再合并:
| java -jar APKEditor.jar m -i splits -o merged.apk
|
APKMirror 自动化流程
APKMirror 常见下载格式有:
如果是普通 .apk,可以直接用 apktool 解包。如果是 .apkm、.apks、.xapk,建议先用 APKEditor 合并,再交给 apktool。
流程:
| APKMirror 下载文件
-> APKEditor 合并 split APK
-> apktool 解包
|
示例:
| curl -L -A "Mozilla/5.0" -o app.apkm "APKMirror 下载地址"
java -jar APKEditor.jar m -i app.apkm -o merged.apk
apktool d -f merged.apk -o decoded
|
如果本来就是普通 APK:
| apktool d -f app.apk -o decoded
|
自动化脚本
| #!/usr/bin/env bash
set -euo pipefail
INPUT="${1:?Usage: $0 <apk|apkm|apks|xapk|url> [name]}"
NAME="${2:-app}"
TOOLS_DIR="./tools"
WORK_DIR="./work/$NAME"
APKEDITOR_JAR="$TOOLS_DIR/APKEditor.jar"
APKTOOL_JAR="$TOOLS_DIR/apktool.jar"
mkdir -p "$WORK_DIR"
if [[ "$INPUT" =~ ^https?:// ]]; then
FILE_NAME="$(basename "${INPUT%%\?*}")"
FILE="$WORK_DIR/${FILE_NAME:-input}"
curl -L --fail --retry 3 -A "Mozilla/5.0" -o "$FILE" "$INPUT"
else
FILE="$INPUT"
fi
MERGED_APK="$WORK_DIR/$NAME-merged.apk"
DECODED_DIR="$WORK_DIR/decoded"
case "$FILE" in
*.apk)
cp "$FILE" "$MERGED_APK"
;;
*.apkm|*.apks|*.xapk|*.zip)
java -jar "$APKEDITOR_JAR" m -i "$FILE" -o "$MERGED_APK"
;;
*)
java -jar "$APKEDITOR_JAR" m -i "$FILE" -o "$MERGED_APK"
;;
esac
java -jar "$APKTOOL_JAR" d -f "$MERGED_APK" -o "$DECODED_DIR"
echo "Merged APK: $MERGED_APK"
echo "Decoded dir: $DECODED_DIR"
|
目录结构:
| tools/
APKEditor.jar
apktool.jar
work/
decode-apk.sh
|
使用:
| ./decode-apk.sh app.apkm app
|
或者:
| ./decode-apk.sh "https://example.com/app.apkm" app
|
注意事项
- APKMirror 没有稳定公开 API,完全自动化搜索和下载最新版不太稳定。
- 最稳的方式是先拿到最终下载链接,再交给脚本处理。
- 合并后的 APK 如果要重新安装,通常需要重新签名。
- 一些 App 会校验签名或检测二次打包,合并后可能无法正常安装或运行。
- 只分析资源和代码时,通常不需要重新安装,直接用 apktool 或 jadx 分析即可。