命令说明

xenolith-apk-editor

APK Editor 的终端形态。Mac、Windows 和 Linux,不需要 Java。不加上 --src,smali 不会被拆开。打包一定从原来的 APK 出发。

下载

每个系统一个静态二进制文件——无需安装器、无需 Java。Android 框架资源表内置于压缩包中,首次运行时自动安装。

macOS

  1. tar -xzf xenolith-apk-editor-*.tar.gz

    解压压缩包。

  2. cd xenolith-apk-editor
    ./xenolith-apk-editor d app.apk -o app

    解码你的 APK。二进制文件旁的框架表会在首次运行时自动安装。

Linux

  1. tar -xzf xenolith-apk-editor-*.tar.gz

    解压压缩包。

  2. cd xenolith-apk-editor
    ./xenolith-apk-editor d app.apk -o app

    解码你的 APK。二进制文件旁的框架表会在首次运行时自动安装。

Windows

  1. Expand-Archive xenolith-apk-editor-*.zip

    解压压缩包。

  2. cd xenolith-apk-editor
    .\xenolith-apk-editor.exe d app.apk -o app

    解码你的 APK。二进制文件旁的框架表会在首次运行时自动安装。

通常就这几步

四条命令,从文件到签好名的 APK。

  1. xenolith-apk-editor d app.apk -o app --src

    把 APK 拆成一个目录。--src 会写出 smali。不加的话,dex 原样复制。

  2. xenolith-apk-editor b app --base app.apk -o unsigned.apk

    把目录装回 APK。--base 是原来的文件:你没改过的部分从那里来。

  3. xenolith-apk-editor keygen --key key.pem --cert cert.pem

    一把新的 ECDSA P-256 密钥和证书。密钥就是这个应用的身份。留一份副本。

  4. xenolith-apk-editor sign unsigned.apk -o signed.apk --key key.pem --cert cert.pem

    给包签名。默认同时写 v2 和 v3。

命令

拆开

d, decode

xenolith-apk-editor d <app.apk> [-o dir]

一个 APK 变成一个目录。清单是文本,资源是文件。没有 --src 或 --java 时,dex 还是 dex。目录已经存在时命令会停,除非加上 -f。退出码 0 是成功,1 是用法不对,3 是跑起来之后失败。

  • -o, --output输出目录。默认用 apk 的文件名,去掉 .apk。
  • -f, --force删掉已有的输出目录,再拆一次。
  • --src把 classes*.dex 拆成 smali/。不写这个参数就不会拆。
  • --java另外写出 java/,用来读这个应用。那是一份视图。要汇编的是 smali。--src 和 --java 可以一起用。
  • --only-manifest只拆清单,其余不动。
  • --no-assets不复制 assets/。lib/ 仍会复制。
  • --frame-path已安装 framework 表的目录。打包也接受这个参数。
  • --res-resolve-modedefault、greedy 或 lazy。lazy 不会给解析不了的引用填占位属性。

装回

b, build

xenolith-apk-editor b <dir> --base <app.apk> -o <out.apk>

输入是拆开后的目录,输出是 APK。--base 和 -o 都必填。目录里的 smali 会汇编进 dex。换过的 .9.png 会被拒绝。

  • --base原来的 APK。打包沿着它走,再叠上你的修改。
  • -o, --outputAPK 写到哪里。- 把字节写到 stdout。
  • --frame-path工程需要时用的 framework 表。
  • --res-resolve-mode和拆包一样的 default、greedy 或 lazy。
  • --edit-file可以重复。目录里某个文件的字节原样写进 APK。res/、original/、清单和 apktool.yml 不能这样传。smali 不需要这个参数。

签名

keygen

xenolith-apk-editor keygen --key <key.pem> --cert <cert.pem>

写出未加密的 PKCS#8 密钥和一张自签的 X.509 证书。两个路径都必填。换一把密钥,就不能覆盖用这把密钥签过的应用。

  • --key私钥写到哪里。
  • --cert证书写到哪里。
  • --cn证书上的名字。默认是 xenolith-dev-key。

sign

xenolith-apk-editor sign <unsigned.apk> -o <signed.apk> --key <key.pem> --cert <cert.pem>

给一个 APK 签名。-o、--key 和 --cert 都必填。密钥是 PKCS#8,证书是 X.509,PEM 或 DER。v3 的窗口来自清单里的 minSdk。没有密钥轮换。

  • -o, --output签好的 APK。- 把字节写到 stdout。
  • --key私钥,PEM 或 DER。
  • --cert证书,PEM 或 DER。
  • --no-v3只写 v2 块。

直接改

patch

xenolith-apk-editor patch <app.apk> -o <out.apk> [edits]

改一个 APK 并写出新文件。你点名要改什么。至少要有一项修改。启动图标会按每种密度重新采样。

  • -o, --output输出 APK。- 把字节写到 stdout。
  • -l, --label应用名称。
  • -p, --package包名。
  • -n, --version-nameversionName。
  • --version-codeversionCode。非负整数,放得进 32 位。
  • --debuggabletrue 或 false。设置 application 的 android:debuggable。
  • --add-permission添加 uses-permission。参数可以重复。已经有的权限不会再加一份。
  • --remove-permission去掉 uses-permission。没有这个名字就不动。
  • --add-meta名字=值。给 application 加一条 meta-data。同名的会被换掉。
  • --remove-meta按名字去掉 application 的 meta-data。
  • --icon用一张图片换掉启动图标。
  • --so替换 lib/arm64-v8a/libxenolith.so。这条保持不压缩,并按 16 KB 对齐。换的是这个槽,不是任意一个库。

patch-manifest

xenolith-apk-editor patch-manifest <AndroidManifest.xml> -o <out.xml>

同样的清单修改,对象是二进制 AndroidManifest.xml,不是整包 APK。这条命令不改图标,也不改原生库。

  • -o, --output输出的清单。
  • -l, --label应用名称。
  • -p, --package包名。
  • -n, --version-nameversionName。
  • --version-codeversionCode。
  • --add-permission添加 uses-permission。可以重复。
  • --remove-permission去掉 uses-permission。
  • --add-meta给 application 的 meta-data 用的 名字=值。
  • --remove-meta按名字去掉 application 的 meta-data。

查看

list-res

xenolith-apk-editor list-res <app.apk>

打印资源表。过滤是完整名字,不是子串。

  • --type只要这一种资源类型。
  • --name只要这个条目名。
  • --config只要这个配置限定符。
  • --json输出 JSON,而不是文本列表。

signatures

xenolith-apk-editor signatures <app.apk>

打印包上有没有 v1、v2、v3 和 v3.1,以及证书里能读到的内容。

  • --json输出 JSON,而不是文本列表。

图片和 dex

replace-entry

xenolith-apk-editor replace-entry <app.apk> <zip-path> --from <image> -o <out.apk>

换掉 APK 里的一张图片。压缩包里的路径不变,因为 resources.arsc 指着它。nine-patch 的 .9.png 会被拒绝。--to 接受 png、webp 或 jpeg。

  • --from要放进去的图片文件。
  • -o, --output输出 APK。- 把字节写到 stdout。
  • --topng、webp 或 jpeg。默认用条目上已有的扩展名。
  • --webp-lossy有损 WebP。默认是无损。

assemble

xenolith-apk-editor assemble <smali-dir> -o <out.dex>

读目录下每一个 .smali,写出一个 dex。

  • -o, --output输出的 dex。必填。

optimize

xenolith-apk-editor optimize <app.apk> -o <out.apk>

重新压缩那些未压缩的条目。resources.arsc 和会映射进内存的 .so 保持不压缩。

  • -o, --output输出 APK。必填。不能用 - 代替文件。

Framework

if, install-framework

xenolith-apk-editor if <framework.apk>

安装一份 framework 资源表,后面的拆包才能解析它的引用。默认标记是 1。

  • -t, --frame-tag这份 framework 的标记。默认是 1。

list-frameworks

xenolith-apk-editor list-frameworks

打印已安装的 framework:标记、包名、类型数量。

clean-frameworks

xenolith-apk-editor clean-frameworks

删掉已安装的 framework 表。

  • --frame-path要清空的 framework 目录。不写就清通常的位置。