Команда 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— принудительно перезаписать существующую папку результата
☑️ Перед декомпиляцией проверьте
⚠️ Внимание: декомпиляция и модификация приложений могут нарушать условия лицензионного соглашения и авторские права разработчика. Используйте инструмент для собственных приложений, учебных целей и задач, разрешённых законодательством вашей страны.
Структура распакованного проекта и правка 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-файлах через поиск по содержимому.
Сборка и подпись модифицированного 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 без рута для пользовательских приложений.