справка

xenolith-apk-editor

APK Editor в терминале. Mac, Windows и Linux, без Java. 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 становится каталогом. Манифест — текстом, ресурсы — файлами. Dex остаётся dex, пока нет --src или --java. Если каталог уже есть, команда останавливается. -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, --outputКуда писать APK. - отдаёт байты в 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. Ставит android:debuggable у application.
  • --add-permissionДобавить uses-permission. Флаг можно повторять. Уже существующее разрешение не дублируется.
  • --remove-permissionСнять uses-permission. Если такого нет, ничего не происходит.
  • --add-metaимя=значение. Добавляет meta-data у application. То же имя заменяется.
  • --remove-metaСнять meta-data у application по имени.
  • --iconЗаменить иконку лаунчера файлом картинки.
  • --soЗаменить lib/arm64-v8a/libxenolith.so. Запись остаётся несжатой и выровненной на 16 КБ. Это именно этот слот, не произвольная библиотека.

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имя=значение для meta-data у application.
  • --remove-metaСнять meta-data у application по имени.

Посмотреть

list-res

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

Печатает таблицу ресурсов. Фильтры — точные имена, не подстроки.

  • --typeТолько этот тип ресурса.
  • --nameТолько это имя записи.
  • --configТолько этот квалификатор конфигурации.
  • --jsonJSON вместо текстового списка.

signatures

xenolith-apk-editor signatures <app.apk>

Печатает, какие из схем v1, v2, v3 и v3.1 стоят на пакете, и что можно прочитать из сертификата.

  • --jsonJSON вместо текстового списка.

Картинки и 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-lossyWebP с потерями. По умолчанию без потерь.

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, который очистить. Без флага очищается обычное место.