Чтобы из готового APK сделать новый APK, файл недостаточно переименовать — его нужно декомпилировать, изменить содержимое и собрать заново с повторной цифровой подписью, иначе Android откажется устанавливать пакет. Чаще всего такая задача возникает при локализации приложения, замене иконок, отключении рекламы или адаптации старой программы под новую версию системы.
Сам по себе APK — это ZIP-архив, внутри которого лежат скомпилированный код (classes.dex), ресурсы, манифест AndroidManifest.xml и подпись. Просто распаковать его архиватором можно, но править бинарные файлы напрямую почти бессмысленно: манифест и ресурсы хранятся в компилированном виде. Поэтому используются специальные инструменты для разбора и обратной сборки.
Что понадобится для работы
Базовый набор инструментов для пересборки APK одинаков почти в любой задаче. Вам понадобится компьютер, сам исходный APK-файл и несколько программ.
- 🛠️ Apktool — главная утилита для декомпиляции ресурсов и smali-кода и обратной сборки пакета.
- ☕ Java (JDK) — требуется для запуска Apktool и утилит подписи.
- 📦 Архиватор (7-Zip или аналог) — для просмотра содержимого APK без полной декомпиляции.
- ✍️ apksigner или jarsigner — для подписи готового пакета собственным ключом.
- 📝 Текстовый редактор с подсветкой синтаксиса — для правки XML и smali-файлов.
Для работы на самом смартфоне существуют мобильные редакторы APK, однако их возможности ограничены, а стабильность зависит от конкретного устройства и версии Android. Если задача сложнее замены картинки, надёжнее работать на ПК.
Шаг 1. Декомпиляция исходного APK
Первый этап — разбор пакета на редактируемые составляющие. Apktool преобразует бинарный манифест в читаемый XML, ресурсы — в обычные файлы, а DEX-код — в smali-представление, которое можно править текстовым редактором.
apktool d app.apk -o app_src
После выполнения команды появится папка app_src со структурой проекта: AndroidManifest.xml, каталоги res, smali, assets. Если декомпиляция завершилась ошибкой вида «resource not found», вероятная причина — устаревшая версия Apktool, не знающая новой версии Android: обновите утилиту и framework-файл командой apktool empty-framework-dir с последующей повторной попыткой.
Шаг 2. Внесение изменений
Что именно править — зависит от цели. Ниже типовые сценарии, которые не требуют глубокого знания программирования.
- 🌐 Перевод строк — тексты интерфейса обычно лежат в
res/values/strings.xml; достаточно заменить значения между тегами. - 🖼️ Замена графики — изображения находятся в папках
res/drawable*; новый файл должен иметь то же имя и формат. - ⚙️ Правка манифеста — в
AndroidManifest.xmlможно менять разрешения, метки и некоторые параметры запуска. - 🧩 Правка логики — изменение smali-кода требует понимания синтаксиса; ошибка в одной строке приводит к падению приложения.
⚠️ Внимание: не меняйте имя пакета (package name) в манифесте без необходимости — Android воспринимает приложение с другим именем пакета как совершенно новую программу, и обновить поверх оригинала его не получится.
☑️ Проверка перед обратной сборкой
Шаг 3. Обратная сборка APK
Когда правки готовы, проект собирается обратно в единый файл той же утилитой, но с ключом сборки.
apktool b app_src -o app_new.apk
Если сборка прерывается с ошибкой, внимательно читайте текст в консоли: Apktool указывает файл и строку, где обнаружена проблема. Чаще всего это незакрытый тег в XML или битый ресурс. Полученный на этом этапе APK ещё не подписан и не установится на устройство — это следующий обязательный шаг.
Шаг 4. Подпись пакета
Android принимает к установке только подписанные APK. Оригинальную подпись разработчика воспроизвести нельзя — закрытый ключ есть только у него, поэтому пересобранный пакет подписывают собственным ключом. Из-за смены подписи обновить такое приложение поверх официального не выйдет: сначала придётся удалить оригинал.
keytool -genkey -v -keystore my.keystore -alias key0 -keyalg RSA -keysize 2048
apksigner sign --ks my.keystore app_new.apk
Утилита apksigner входит в состав Android SDK Build-Tools. Альтернатива — jarsigner из JDK, но для новых версий Android предпочтительнее apksigner со схемой подписи v2. Проверить результат можно командой apksigner verify app_new.apk.
⚠️ Внимание: перед установкой пересобранного APK удалите оригинальное приложение, иначе система выдаст ошибку о конфликте подписей. Данные оригинальной программы при этом будут потеряны — заранее сделайте резервную копию, если приложение это позволяет.
Типичные ошибки и их причины
| Симптом | Вероятная причина | Что делать |
|---|---|---|
| «Приложение не установлено» | APK не подписан или конфликт подписей | Подписать пакет, удалить оригинал |
| Ошибка при «apktool d» | Устаревшая версия Apktool | Обновить утилиту и framework |
| Ошибка при «apktool b» | Синтаксическая ошибка в XML или smali | Исправить файл, указанный в логе |
| Приложение падает при запуске | Некорректная правка кода или ресурсов | Откатить последние изменения, собрать заново |
| Приложение просит обновление и не работает | Проверка подписи внутри самого приложения | Требуется правка smali-кода проверки |
Отдельного упоминания заслуживают приложения с защитой: упаковщики и обфускация усложняют анализ smali-кода, а встроенная проверка целостности может не дать пересобранной копии запуститься. Гарантированного универсального способа обхода такой защиты не существует — всё зависит от конкретной реализации.
Почему нельзя просто переупаковать APK архиватором
ZIP-архиватор сохраняет файлы, но не пересчитывает структуру resources.arsc и не подписывает пакет. Android при установке проверяет целостность ресурсов и подпись, поэтому такой файл будет отклонён системой.
Юридические и практические ограничения
Модификация приложений для личного использования — распространённая практика, но распространение изменённых копий чужих программ может нарушать лицензионное соглашение и авторские права. Не публикуйте пересобранные APK под видом оригинала и не встраивайте в них чужой код без понимания последствий.
⚠️ Внимание: APK-файлы из непроверенных источников — частый носитель вредоносного кода. Перед декомпиляцией убедитесь, что исходный файл получен из доверенного места, и не устанавливайте пересобранные пакеты с правами, которые приложению явно не нужны.
Частые вопросы
Можно ли пересобрать APK прямо на смартфоне?
Да, существуют мобильные редакторы APK, которые умеют декомпилировать, править ресурсы и подписывать пакет без ПК. Однако для сложных правок smali-кода удобнее и надёжнее работать на компьютере.
Почему пересобранное приложение не обновляется поверх оригинала?
Потому что подпись изменилась: вы подписали пакет своим ключом, а не ключом разработчика. Android считает это другим приложением и требует сначала удалить оригинал.
Что такое smali и обязательно ли в нём разбираться?
Smali — текстовое представление байт-кода Dalvik/ART, в который Apktool преобразует classes.dex. Для замены текстов и картинок разбираться в нём не нужно, но любая правка логики приложения требует понимания этого синтаксиса.
Можно ли вернуть оригинальную подпись разработчика?
Нет. Закрытый ключ есть только у разработчика, и восстановить его из APK невозможно. Пересобранный пакет всегда подписывается новым ключом.
Почему после правки приложение вылетает при запуске?
Наиболее вероятные причины — ошибка в отредактированном smali-коде, повреждённый ресурс или встроенная в приложение проверка целостности. Откатите изменения по одному, чтобы найти проблемное место.