Apktool: декомпиляция APK пошагово

Команда apktool d app.apk завершается ошибкой brut.androlib.AndrolibException чаще всего из-за устаревшей версии самой утилиты или отсутствия установленной Java — именно с этих двух проверок стоит начинать любую работу с декомпиляцией. Apktool — это консольный инструмент обратного инжиниринга, который распаковывает APK-файл в читаемую структуру: ресурсы преобразуются в редактируемый XML, а байт-код DEX — в ассемблероподобный код smali.

В отличие от простого извлечения архива, Apktool декодирует бинарный AndroidManifest.xml и ресурсные таблицы, что позволяет менять строки интерфейса, иконки и логику приложения, а затем собирать пакет обратно. Ниже — полный цикл: установка, декомпиляция, правка, пересборка и подпись результата.

Что делает Apktool и когда он нужен

Инструмент выполняет два противоположных действия: декомпиляцию (команда d) и сборку (команда b). При распаковке APK разбирается на папки: res с ресурсами, smali с кодом, assets с вложенными файлами и декодированный манифест. Это удобно для локализации приложений, анализа структуры, исправления мелких ошибок и учебных задач.

Важно понимать ограничение: Apktool не восстанавливает исходный Java-код. На выходе вы получаете smali — низкоуровневое представление байт-кода Dalvik/ART. Если нужен именно Java-код для чтения логики, используют jadx или dex2jar в связке с JD-GUI, но эти инструменты не позволяют собрать приложение обратно.

  • 🔍 Анализ структуры чужого приложения и его ресурсов
  • 🌐 Перевод строк интерфейса на другой язык
  • 🎨 Замена иконок, цветов и изображений
  • 🛠️ Правка smali-кода для изменения поведения
  • 📦 Пересборка и подпись модифицированного APK

Установка Java и Apktool

Apktool написан на Java, поэтому первое требование — установленная Java Runtime Environment (подойдёт JRE 8 или новее от Oracle либо OpenJDK). Проверить наличие можно командой java -version в терминале. Если система отвечает, что команда не найдена, установите JRE и убедитесь, что путь к ней добавлен в переменную окружения PATH.

Сама установка Apktool сводится к двум файлам: скрипту-обёртке (apktool.bat для Windows или shell-скрипт для Linux/macOS) и JAR-файлу, который рекомендуется переименовать в apktool.jar. Оба файла помещают в одну папку, а её путь добавляют в PATH — тогда утилита вызывается из любой директории.

java -version

apktool --version

Если обе команды выводят номера версий без ошибок — окружение готово. На Linux дополнительно потребуется сделать скрипт исполняемым командой chmod +x apktool.

Декомпиляция APK: команда d

Базовый синтаксис распаковки предельно прост. Перейдите в терминале в папку с APK-файлом и выполните:

apktool d app.apk -o app_decoded

Здесь d — сокращение от decode, а флаг -o задаёт папку результата. После завершения в каталоге app_decoded появятся: файл apktool.yml с метаданными сборки, декодированный AndroidManifest.xml, папка res и одна или несколько папок smali (приложения с несколькими DEX-файлами дают smali_classes2, smali_classes3 и так далее).

Полезные дополнительные флаги:

  • ⚙️ -s — не декодировать код в smali, оставить classes.dex как есть (быстрее, подходит для правки только ресурсов)
  • 🗂️ -r — не декодировать ресурсы, оставить их в бинарном виде
  • 🔧 -f — принудительно перезаписать существующую папку результата

☑️ Перед декомпиляцией проверьте

Выполнено: 0 / 5
⚠️ Внимание: декомпиляция и модификация приложений могут нарушать условия лицензионного соглашения и авторские права разработчика. Используйте инструмент для собственных приложений, учебных целей и задач, разрешённых законодательством вашей страны.

Структура распакованного проекта и правка smali

Ориентироваться в дереве проекта помогает таблица его ключевых элементов:

ЭлементСодержимоеЗачем править
AndroidManifest.xmlКомпоненты, разрешения, версииИзменение разрешений, точек входа
res/values/strings.xmlТекстовые строки интерфейсаПеревод приложения
res/drawable*Изображения и иконкиСмена оформления
smali/Декомпилированный байт-кодИзменение логики приложения
apktool.ymlПараметры сборки, версии SDKОбычно не трогают вручную

Редактировать ресурсы просто: строки и XML открываются в любом текстовом редакторе. Со smali сложнее — это регистровый ассемблер виртуальной машины Android. Типичная правка выглядит так: находите нужный класс по пакету, открываете .smali-файл и меняете константы или условные переходы, например if-eqz на if-nez. Ошибка в синтаксисе всплывёт уже на этапе сборки, поэтому меняйте код маленькими порциями.

Как найти нужное место в тысячах файлов? Проще всего искать по строке из интерфейса: найдите её ID в strings.xml и public.xml, затем ищите этот идентификатор в smali-файлах через поиск по содержимому.

📊 Для какой задачи вы используете Apktool?
Перевод приложения на русский
Анализ чужого кода и обучение
Модификация логики приложения
Смена оформления и ресурсов

Сборка и подпись модифицированного APK

Обратная сборка выполняется командой b с указанием папки проекта:

apktool b app_decoded -o app_mod.apk

Собранный файл появится также в подпапке dist внутри проекта. Однако несобранный заново и, главное, неподписанный APK Android устанавливать откажется — система проверяет цифровую подпись каждого пакета. Подпись выполняется в два шага: генерация ключа через keytool и собственно подписание через apksigner из Android SDK Build-Tools либо утилиту jarsigner.

keytool -genkey -v -keystore my.keystore -alias mykey -keyalg RSA -validity 10000

apksigner sign --ks my.keystore app_mod.apk

После подписи полезно проверить её корректность командой apksigner verify app_mod.apk. Учтите: подпись модифицированного приложения будет отличаться от оригинальной, поэтому поверх оригинала оно не установится — сначала удалите исходную версию, предварительно сохранив нужные данные.

⚠️ Внимание: приложения, подписанные самоподписанным ключом, могут не работать с сервисами, проверяющими подпись (например, оплата, авторизация через Google, SafetyNet/Play Integrity). Это ограничение платформы, а не ошибка сборки.
Что делать, если приложение не устанавливается после подписи

Проверьте, что старая версия полностью удалена. Убедитесь, что подпись прошла успешно (apksigner verify). Если приложение использует несколько APK (split APK / App Bundle), установка одиночного модифицированного пакета не сработает — потребуется собирать и подписывать весь набор одним ключом. Также проверьте minSdkVersion в apktool.yml: слишком высокое значение не даст установить приложение на старое устройство.

Типичные ошибки и их решение

Чаще всего пользователи сталкиваются с ошибкой вида Could not decode arsc file или исключениями при разборе ресурсов. Возможная причина — приложение собрано под более новую версию Android, чем умеет обрабатывать ваша копия Apktool. Решение — обновить утилиту до последнего релиза и повторить попытку.

Вторая группа проблем — обфускация и защита. Разработчики применяют упаковщики и протекторы, из-за которых структура APK нестандартна: ресурсы шифруются, а DEX подгружается динамически. В таком случае Apktool либо падает с ошибкой, либо распаковывает лишь оболочку. Универсального обхода нет — для каждого протектора существуют отдельные методы, и далеко не всегда они публичны.

Третья частая ситуация — ошибки при сборке после правок. Apktool выводит номер файла и строки, где возникла проблема: обычно это невалидный XML (неэкранированный символ & или <) либо синтаксическая ошибка в smali. Откройте указанный файл, исправьте фрагмент и соберите заново.

FAQ: частые вопросы

Можно ли получить исходный Java-код через Apktool?

Нет. Apktool преобразует байт-код в smali, а не в Java. Для чтения кода в виде, близком к Java, используйте декомпилятор jadx, который открывает APK напрямую. Оптимальная связка: jadx для анализа логики, Apktool для реальной модификации и пересборки.

Почему после сборки приложение вылетает при запуске?

Возможных причин несколько: ошибка в отредактированном smali-коде, повреждённый ресурс, либо встроенная в приложение проверка целостности собственной подписи. Начните диагностику с чтения логов устройства через adb logcat — там будет стек ошибки с указанием класса.

Работает ли Apktool на самом смартфоне?

Существуют порты Apktool под Android, но полноценная работа с Java-окружением на телефоне затруднена. Практичнее выполнять декомпиляцию и сборку на компьютере, а на устройство переносить уже готовый подписанный APK.

Что делать с приложениями в формате App Bundle (AAB)?

Apktool работает только с APK. Файлы .aab и наборы split-APK сначала нужно преобразовать: из AAB собирают универсальный APK через bundletool, а split-пакеты объединяют сторонними утилитами. После этого с файлом можно работать обычным способом.

Нужен ли root для использования Apktool?

Нет. Декомпиляция и сборка выполняются на компьютере и не требуют каких-либо прав на устройстве. Root может понадобиться лишь для извлечения APK уже установленного системного приложения, но и тут часто хватает adb pull без рута для пользовательских приложений.