跳转至

AntiSplit-M 和 APKEditor

AntiSplit-MAPKEditor 都可以用来处理 split APK,也就是把 base.apksplit_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 提取到了一个目录:

1
2
3
4
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

输出可能类似:

1
2
3
package:/data/app/xxx/base.apk
package:/data/app/xxx/split_config.arm64_v8a.apk
package:/data/app/xxx/split_config.xxhdpi.apk

然后拉到本地:

1
2
3
4
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
  • .apkm
  • .apks
  • .xapk

如果是普通 .apk,可以直接用 apktool 解包。如果是 .apkm.apks.xapk,建议先用 APKEditor 合并,再交给 apktool。

流程:

1
2
3
APKMirror 下载文件
  -> APKEditor 合并 split APK
  -> apktool 解包

示例:

1
2
3
4
5
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"

目录结构:

1
2
3
4
5
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 分析即可。