В процессе использования различных прошивок для Android-устройств иногда возникает необходимость тем или иным образом изменить системные приложения, встроенные в операционную систему. В данном материале мы подробно рассмотрим этот вопрос.
Естественно, что разобрать и собрать обратно системный APK-файл нужно так, чтобы он работал как следует и стабильно. Давайте разберемся пошагово, что для этого нужно сделать.
Во-первых, нужно произвести процесс деодексирования системных APK-файлов. О том, как это сделать, мы расскажем в .
Итак, .apk-файл был деодексирован и декомпилирован. Разбираем интересующее нас приложение, пускай оно будет носить название, для наглядности примера, framework - res . apk . В голове запоминаем его как оригинальное приложение.
Допустим, все нужные изменения в приложение мы внесли. Подробнее о всех аспектах APK-файлов мы поговорим в . Теперь нужно упаковать его обратно. Готовое упакованное приложение запомним в уме как модифицированное приложение 2.
Теперь мы объясним, зачем нужно было в уме запоминать приложения как оригинальное и модифицированное 2. Собранное программой ApkTool (или с помощью графического расширения пользовательского интерфейса вроде SmartApkTool) приложение работать не будет, но это не проблема. Выполняем следующие действия:
Я упоминал о приложении SmartAPKTool. Оно может распаковывать, запаковывать и подписывать изменённые apk-файлы. Её достоинством является наличие графического интерфейса. Однако есть и серьёзный недостаток. SmartAPKTool давно не обновлялся, и программа некорректно распаковывает и запаковывает приложения для свежих версий Android. Поэтому здесь я попытаюсь объяснить, как пользоваться для этих целей приложением apktool .
Замечание 1.
Программу SmartAPKTool по-прежнему удобно использовать для подписи собранных apk-файлов.
Замечание 2.
Ссылки на упомянутые в статье программы находятся ↓
Программа apktool не имеет графического интерфейса. Это является минусом для тех, кто не привык работать с командной строкой. Но есть и плюс: в отличие от SmartAPKTool, мы будем видеть все ошибки, а значит будем знать, что исправить.
Ссылки на упомянутые программы:
Важное замечание по apktool версий 2.x
В версии 2.0.0-Beta7 нужно применять ключ --output , чтобы указать директорию при декомпиляции и результирующий файл при сборке:
apktool decode orig.apk --
output orig
apktool build orig --
output result.apk
О том, как декомпилировать приложения для Android, то Вы знаете, что остановился я на том, как собрать все файлы, которые получились при разборке приложения, обратно в APK.
Лирическое отступление
К сборке рекомендуется папка с файлами, полученная в результате декомпиляции с помощью apktool. Файлы кода, которые представляют из себя набор инструкций для виртуальной машины Dalvik, собираются обратно в архив классов без каких-либо проблем. В то время как преобразование из Dalvik в Java и обратно может привести к проблемам несовместимости. Как следствие, программа будет работать некорректно. Поэтому для успешной модификации программ, а не только ради исследования, Вам необходимо изучить инструкции Dalvik .
Сборка
Собрать такие файлы обратно в APK достаточно просто. Для этого необходимо запустить apktool с соответствующим флагом сборки и передать ему путь к папке с декомпилированным приложением внутри. Например, если у нас есть папка app, которая размещена в том же каталоге, что и apktool, то команда будет выглядеть так:
Shell
java -jar apktool.jar b app
java - jar apktool .jar b app |
После сборки готовый APK файл будет лежать в каталоге app/build . Далее необходимо подписать APK. Делается это для того, чтобы приложение работало на устройствах, где запрещена отладка. То есть, запуск неподписанных приложений на таких устройствах запрещен. Подробнее, о цифровых сертификатах и процедуре подписывания файлов можно прочитать здесь.
Подписать файл очень просто: для этого есть специальная утилита под названием signapk . Ее необходимо запустить, передав в качестве аргументов сначала сертификаты, затем путь к приложению, и, наконец, путь для подписанного приложения (результат, куда сохранять). Выглядит это примерно так:
Shell
java -jar signapk.jar testkey.x509.pem testkey.pk8 *.apk apk_signed.apk
java - jar signapk .jar testkey .x509 .pem testkey .pk8 * .apk apk_signed .apk |
Где же взять такой сертификат, спросите Вы? Сертификаты можно найти в Интернет. Либо сгенерировать самому. Подробную инструкцию о настройке и генерации всех необходимых файлов можно найти, например, .
Заключение
Как видите, декомпиляция и сборка APK файлов достаточно простой процесс, который вдобавок можно автоматизировать, облегчая работу исследователю. Сама виртуальная машина Dalvik также проста в освоении и открыта, что, с одной стороны, снижает порог вхождения для разработчиков, с другой – является основной причиной столько большого процента пиратства именно на платформе Android. Отчасти поэтому разработчики, например, игр в основном не заинтересованы в выпуске интересных игр с сюжетом. Намного выгоднее при нынешнем отношении пользователей клепать поразительно похожие друг на друга фермы с донатом. Поэтому, покупаем приложения, поддерживаем разработчиков и в итоге получаем интересный контент. А вот донатить совершенно не нужно!
Всем спасибо, до новых встреч.
APK – это формат, который используется в операционной системе Android для архивных исполняемых файлов-приложений. Аналогом, например, в Windows, является.msi, в Symbian - .sis, в Linux - .rpm или.deb. В данной статье мы максимально детально разберемся во всех вопросах касаемо данного файлового формата.
Процесс разборки, редактирования и сборки по «правильному» называется reverse-engineering («реверс-инжиниринг»). Что для этого нужно? Необходимы следующие инструменты:
Apktool. Удобнее использовать с оболочкой SmartApktool, можно также использовать уже готовые batch-файлы, например ApktoolBAT.
Notepad++ - не обязательно, но настоятельно рекмоендуется.
7zip или WinRar, либо же любая другая программа-архиватор, но рекомендуется именно одна из этих.
Деодексированная прошивка.
Устанавливать приложения в операционной системе Android можно несколькими способами. Первый, он же основной – это напрямую через Google Play (Android Market), то есть с официального источника, для чего потребуется учетная запись Google. Многие приложения платные, если вы не хотите искать взломанную версию на пиратских сайтах, то придется оплатить покупку. Но о том, как это сделать, мы поговорим в . Второй – из неофициальных источников, отличных от Google Play, для чего придется включить параметр «Разрешить установку приложений из неофициальных источников» в настройках смартфона или планшета, после чего установочный файл APK нужно записать на карту памяти.
Возможно также массово устанавливать приложения APK. Для этого потребуется Astro File Manager – специальный файловый менеджер. После его установки перемещаем приложения:
Со смартфона/планшета: в mntsdcardackupsapp (иными словами, карта памяти, далее папака backups, папка app)
С персонального компьютера (не забываем включить подключение Adroid-устройства в режиме простого USB-накопителя): sdcard backups app
После чего открываем нужное приложение, в контекстном меню выбираем «Менеджер приложений» и переходим во вкладку «Резервные копии», где выбираем «Сделайте долгий клик или проверьте приложение, чтобы проинсталлировать». Нажимаем кнопку «Инсталлировать» - все приложения будут установлены на ваше устройство.
Что из себя представляет структура APK-файла, посмотреть достаточно легко. Открываем нужный APK при помощи программы-архиватора, например, WinRar. Вот что мы видим внутри:
AndroidManifest.xml – это своеобразный «паспорт», который описывает, что находится в приложении, в том числе: системные требования к приложению, его структура и версия.
META-INF – папка, содержащая файл MANIFEST.MF (его можно открыть практически любым текстовым редактором, рекомендуется использоваться Notepad++), открыв который видно контрольные суммы SHA-1 и пути к данным, версию стандарта Manifest-Version, файлы сертификата RSA или DSA, файл SF содержит пути к различным ресурсам и их контрольные суммы. Вообще, META-INF – это файлы метаданных, то есть данные о данных.
res – папка, которая содержит все ресурсы «программной начинки», рассортированные по подпапкам. Например, в папке ~drawable~ находятся графические элементы приложений (разные статусы, иконки и такое прочее), в директории layout – XML-файлы, в которых указано размещение элементов графического пользовательского интерфейса (GUI).
classes.dex – программный код, выполняемый виртуальной машиной Dalvik VM. Напомним, что операционная система Android – это смесь ядра Linux с виртуальной машиной Java.
resources.arsc – скомпилированный файл XML. Он содержит данные о всех ресурсах, которые используются программой.
assets – папка, также содержащая различные ресурсы, её может не быть вовсе в APK.
lib – папка, которая содержит «либы» или, проще говоря, нативные библиотеки, если программа написана с использованием NDK, например с элементами когда С++. Данной директории может не быть в APK.
com – может отсутствовать в APK.
org – может отсутствовать в APK.
udk – может отсутствовать в APK.
С содержимым APK-приложения мы разобрались, теперь приступим к детальной его разборке. Для декомпиляции понадобятся Apktool и Java, а также собственно сам APK-файл. Apktool рекомендуется распаковывать в директорию C: WINDOWS (это не обязательно, но так будет удобнее. Почему – читайте немного ниже).
Для запуска Apktool необходимо войти в меню «Выполнить» компьютера. На Windows XP нажимаем Пуск -> Выполнить , на Windows 7: Диспетчер задач (Ctrl+ Alt+ Del ), сверху в выпадающем меню Файл -> Новая задача (Выполнить…) , или просто вызываем его сочетанием клавиш Win+R .
Вызываем командную строку – пишем cmd , после чего запускаем Apktool – пишем apktool (для этого и нужно было поместить его в папку WINDOWS). Далее всё управление происходит через командную строку с использованием параметров.
Если нет желания заморачиваться с постоянным вводом текстовых команд, можно использовать графический интерфейс – например, упомянутый SmartApkTool. Запускаем SmartApkTool.exe, после чего во вкладке Распаковать/Запаковать выбираем нужное приложение APK (важно, чтобы имя файла не содержало пробелов, кириллицы, спецсимволов и знаков препинания).
После распаковки программа создаст папку с таким же названием, как файл APK. Внутри неё будет находиться всё содержимое приложения.
APK также можно локализировать. Прежде чем начать это делать, запускаем предварительно установленный Notepad++, и настраиваем его следующим образом. Открываем Настройки -> Конфигурация -> Новый документ .
После проделанных действий открываем распакованное (декомпилированное) приложение, папку res/ values .
Все локализации зачастую находятся в файле strings. xml , но иногда часть из них может содержаться в arrays. xml . Копируем данные файлы, создаем в папке res папку values- ru и вставляем их в неё.
Теперь можно открыть strings. xml при помощи Notepad++, произвести перевод, и сохранить измененный файл.
В файле AndroidManifest. xml можно указать, куда устанавливать APK-приложения. Внимание, это актуально только для версии Android 2.2 и более новых. Итак, открываем указанный файл при помощи Notepad++. Почти в самом начале видно параметр:
android:installLocation=
Здесь можно указать следующие варианты (после символа «=»):
internalOnly – приложение будет устанавливаться только во внутренней памяти устройства
auto – предоставляет пользователю выбор, устанавливать приложение во внутреннюю память или на карту памяти
preferExternal – программа будет устанавливаться на карту памяти. Нужно учитывать, что не все приложения будут корректно работать, если установлены на внешнем накопителе, или же вообще окажутся не работоспособными. К ним относятся:
Services – то есть, сервисы
Alarm Services – сервисы, которые используют время, например будильники
Input Method Engines – приложения для ввода, в том числе разные клавиатуры
Live Wallpapers – «живые» анимированные обои
Live Folders – соответственно, анимированные директории
App Widgets – различные «виджеты»
Account Managers – менеджеры разных учетных записей, в том числе ICQ-клиенты, клиенты для социальных сетей и так далее
Sync Adapters – программы, которые требуют постоянной синхронизации
Device Administrators – приложения, которые используются для администрирования
Copy Protection – приложения, которые защищены от копирования.
В приложении можно редактировать и заменять на свои различные иконки и графические элементы пользовательского интерфейса. Для этого открываем папку res в папке с декомпилированным приложением APK, здесь можно увидеть папки:
drawable-hdpi
drawable-ldpi
drawable-mdpi
В данных папках находятся все иконки и другие графические элементы программы. Буква перед «dpi» означает размер графических элементов, соответственно:
hdpi – высокая плотность точек на дюйм, размер 72х72 пикселя
mdpi – средняя плотность точек на дюйм, размер 48х48 пикселя
l dpi – низкая плотность точек на дюйм, размер 36х36 пикселя
Для того, чтобы изменить, например, иконку приложения, открываем файл AndroidManifest. xml при помощи программы Notepad++, ищем строчку, в которой указана иконка, смотрим точное её название (обратите внимание, расширение файла не прописывается, только имя файла).
Открываем соответствующую папку drawable-* dpi, вставляем отредактированную или новую иконку, не забываем перепроверить исходное название в AndroidManifest. xml . Картинка обязательно должна быть в формате.png и иметь точно такую же плотность точек, как исходный файл, например для hdpi это 72х72 пикселя.
Если есть желание заменить название иконки на своё, то сохраняем картинку с желаемым именем файла в drawable-* dpi , после чего указываем точно такое же имя в AndroidManifest. xml (например android:icon=»@drawable/ test» ). Таким же образом можно изменить любые другие графические элементы, но требования те же – обязательно расширение.png и плотность точек на дюйм, как у исходного файла.
В распакованном приложении можно перепроверить, какие права есть у него. Это полезно, если APK было установлено с неизвестного источника, и чтобы не произошло ситуации, что фонарик или красивый календарь вдруг начнет рассылать платные SMS-сообщения на неизвестный номер. Открываем AndroidManifest. xml программой Notepad++ и ищем соответствующие строки. За отправку текстовых сообщений, например, отвечает параметр SEND_SMS . Подробнее обо всех правах, которые могут быть доступны приложению, вы можете почитать в .
Установленные APK приложения можно извлечь из системы. Это можно сделать несколькими способами. Во-первых, можно установить Astro File Manager. Открываем приложение, после чего в контекстном меню выбираем пункт «Менеджер приложений». Ищем необходимое приложение, помечаем его галочкой и делаем резервную копию. После проведенной обработки выбранное приложение будет находится по пути:
mntsdcardackupsapp
sdcardackupsapp
Далее, можно использовать программу Root Uninstaller. После запуска приложение самостоятельно определит все установленные APK и автоматически сделает резервную копию всех их. Соответственно, можно, при желании, скопировать для дальнейшей декомпиляции эти резервные копии, они находятся по пути:
mntsdcardRootUnistallerautobackups (при просмотре напрямую с Android-устройства)
sdcardRootUnistallerautobackups (при просмотре через компьютер, при этом Android-девайс подключен как USB-накопитель).
Еще один способ заключается в использовании Root Browser Lite, естественно для этого понадобятся Root-права. Открываем данное приложение, проходим по пути:
system app (если интересуют системные приложения).
Нужные приложения копируем на карту памяти, после чего с ними можно производить любые манипуляции.
Также можно скачать интересующие вас приложения APK с Google Play (Android Market) напрямую на персональный компьютер. Для этого понадобится браузер Google Chrome (версия не ниже 17-й), и плагин для него – APK Downloader. После скачивания и установки указанного плагина, создаем копию ярлыка браузера Google Chrome, где прописываем следующую строчку после пробела:
-ignore-certificate-errors
При стандартном установочном пути браузера, в строчке должно получиться вот что:
«C:Program FilesGoogleChromeApplicationchrome.exe» -ignore-certificate-errors
После этого, в номеронабирателе смартфона вводим:
*/*/8255/*/*
Переписываем Device ID, который состоит из 16 знаков. Открываем Google Chrome при помощи созданного ярлыка с указанным параметром -ignore-certificate-errors , заходим в Инструменты -> Расширения (можно также ввести в адресную строку «chrome://settings/extensions»), открываем настройки плагина APK Downloader. В опциях вводим адрес почты и пароль вашей учетной записи Google, а также полученный Device ID. Теперь заходим на Google Play (Android Market), открываем страницу с нужным приложением, ждем полной её загрузки. Появится значок APK Downloader – после его нажатия приложение будет скачано на компьютер.
Второй способ – при помощи Real APK Leecher. В окне опций также нужно ввести основные данные учетной записи Google – почтовый адрес, пароль и Device ID. После чего можно найти и скачать любое приложение, доступное в Google Play (Android Market).
Как произвести упаковку приложения и его подпись? Для этого запускаем SmartApkTool, открываем вкладку Распаковать/Запаковать, выбираем опцию «Запаковать», ставим галку напротив «Подписать приложение», выбираем (путем нажатия на «Обзор») директорию с распакованным приложением и выбираем файл apktool. yml . Наконец, кликаем на «Запаковать и подписать».
После выполненной подписи приложение будет размещено в папке sign директории с программой SmartApkTool, с названием sign_name.apk . Или же можно просто нажать «Запаковать», тогда приложение будет упаковано. В папке с декомпилированным приложением будут созданы директории build и dist , в последней будет находится собранный APK, то есть готовое приложение, а в build – содержимое данного APK.
Если изначально вы не подписывали приложение, но после решили это сделать, то APK-файл закидываем в папку sign , после чего подписываем программой SmartApkTool на вкладке «Подписать».