» Мануалы

Всё об APK

APK – это формат, который используется в операционной системе Android для архивных исполняемых файлов-приложений. Аналогом, например, в Windows, является .msi, в Symbian — .sis, в Linux — .rpm или .deb. В данной статье мы максимально детально разберемся во всех вопросах касаемо данного файлового формата.

Процесс разборки, редактирования и сборки по «правильному» называется reverse-engineering («реверс-инжиниринг»). Что для этого нужно? Необходимы следующие инструменты:

Java JDK

Android SDK

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-накопителя): sdcardbackupsapp

            После чего открываем нужное приложение, в контекстном меню выбираем «Менеджер приложений» и переходим во вкладку «Резервные копии», где выбираем «Сделайте долгий клик или проверьте приложение, чтобы проинсталлировать». Нажимаем кнопку «Инсталлировать» — все приложения будут установлены на ваше устройство.

Что из себя представляет структура 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 пикселя

ldpi – низкая плотность точек на дюйм, размер 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 (при просмотре напрямую с Android-устройства)

sdcardackupsapp (при просмотре через компьютер, при этом Android-девайс подключен как USB-накопитель).

Далее, можно использовать программу Root Uninstaller. После запуска приложение самостоятельно определит все установленные APK и автоматически сделает резервную копию всех их. Соответственно, можно, при желании, скопировать для дальнейшей декомпиляции эти резервные копии, они находятся по пути:

mntsdcardRootUnistallerautobackups (при просмотре напрямую с Android-устройства)

sdcardRootUnistallerautobackups (при просмотре через компьютер, при этом Android-девайс подключен как USB-накопитель).

Еще один способ заключается в использовании Root Browser Lite, естественно для этого понадобятся Root-права. Открываем данное приложение, проходим по пути:

dataapp

или

systemapp (если интересуют системные приложения).

Нужные приложения копируем на карту памяти, после чего с ними можно производить любые манипуляции.

Также можно скачать интересующие вас приложения 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).

Из APK-приложений также можно удалить назойливую рекламу – об этом читайте в другом материале.

Чтобы получить исходный код любого Android приложения APK, нужно открыть SmartApkTool, где переходим на вкладку «dex2jar».

Выбираем нужный APK-файл

и нажимаем «Декомпилировать dex в jar»

в итоге получаем jar-файл.

Его можно открыть и редактировать, например, при помощи программы JD-GUI.

Как произвести упаковку приложения и его подпись? Для этого запускаем SmartApkTool, открываем вкладку Распаковать/Запаковать, выбираем опцию «Запаковать», ставим галку напротив «Подписать приложение», выбираем (путем нажатия на «Обзор») директорию с распакованным приложением и выбираем файл apktool.yml. Наконец, кликаем на «Запаковать и подписать».

После выполненной подписи приложение будет размещено в папке sign директории с программой SmartApkTool, с названием sign_name.apk. Или же можно просто нажать «Запаковать», тогда приложение будет упаковано. В папке с декомпилированным приложением будут созданы директории build и dist, в последней будет находится собранный APK, то есть готовое приложение, а в build – содержимое данного APK.

Если изначально вы не подписывали приложение, но после решили это сделать, то APK-файл закидываем в папку sign, после чего подписываем программой SmartApkTool на вкладке «Подписать».

Vostok All
2013-04-14 10:49:12
Одновременная упаковка и подпись не происходят. Нужно сперва упаковывать а потом подписывать. Иначе не получается.
Vostok All
2013-04-14 10:50:40
И, кстати, SmartApkTool работает только если лежит на диске "С" в корне.
saintanger69
2013-04-14 22:04:40
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 12px; font-style: normal; text-align: justify;">&gt;И, кстати, SmartApkTool работает только если лежит на диске «С» в корне.</span><div><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 12px; font-style: normal; text-align: justify;">Нет!</span></div>
Володя
2016-12-20 17:05:23
Мне нужна помощь! Подскажите как изменить места для хранения данных, то есть в моем случае это Terraria на андроид и в ней персонажи и карты хранятся в "data/data/... Имя игры.../files" А я хочу изменить этот путь на "mnt/sdcard/Android/Terraria saves". Возможно это как-то сделать, изменив путь в каком-то из файлов находящихся в apk. Например где-то в assets или AndroidManifest.xml или где нибудь в другом месте?