Открыть сервис

Android Package

Android Package (APK) — это формат файла-архива, используемый операционной системой Android для распространения и установки мобильных приложений и промежуточного программного обеспечения. Каждое приложение для Android компилируется и упаковывается в один APK-файл, который содержит весь необходимый код (в виде Dalvik Executable или исполняемого файла Android Runtime), ресурсы, активы, сертификаты и манифест.

История

Формат APK был представлен вместе с первой публичной версией операционной системы Android 1.0 (API Level 1) в сентябре 2008 года. Он основан на формате JAR (Java Archive), который, в свою очередь, использует алгоритм сжатия ZIP. Выбор ZIP-архивации был обусловлен её распространённостью, простотой реализации и поддержкой в Java-среде, на которой изначально строилась платформа Android.

Первоначально APK-файлы распространялись исключительно через сторонние веб-сайты и форумы, пока в октябре 2008 года не был запущен официальный магазин приложений Android Market (позднее переименованный в Google Play). С развитием платформы формат претерпел ряд изменений, в первую очередь связанных с требованиями к подписи, оптимизацией для различных архитектур процессоров и введением новых форматов установочных пакетов (AAB), однако APK остаётся основным и наиболее универсальным форматом для установки приложений на Android-устройства.

Структура APK-файла

APK-файл представляет собой ZIP-архив, содержащий следующие обязательные и опциональные компоненты:

Обязательные компоненты

  • AndroidManifest.xml — скомпилированный XML-файл, описывающий приложение: его имя, версию, требуемые разрешения, компоненты (активности, службы, приёмники широковещательных сообщений, поставщики контента), минимальную версию SDK, конфигурацию экрана и другие метаданные.
  • classes.dex — файл, содержащий скомпилированный байт-код приложения, исполняемый виртуальной машиной Dalvik или Android Runtime (ART). В современных приложениях может быть несколько таких файлов (classes2.dex, classes3.dex и т.д.) для обхода ограничения на количество методов в одном dex-файле (65 536).
  • resources.arsc — скомпилированный файл ресурсов, содержащий предварительно обработанные строки, стили, цвета, размеры и другие ресурсы, используемые приложением. Этот файл позволяет эффективно загружать локализованные и конфигурационно-зависимые ресурсы.
  • **META (организация признана экстремистской, деятельность запрещена в РФ)-INF** — каталог, содержащий файлы подписи и манифеста:
  • MANIFEST.MFфайл манифеста, содержащий список всех файлов в архиве и их хеш-суммы (SHA-256 или SHA-1).
  • CERT.RSA — файл с сертификатом разработчика, используемый для проверки подлинности подписи.
  • CERT.SF — файл, содержащий хеш-суммы для записей из MANIFEST.MF, подписанные закрытым ключом разработчика.

Опциональные компоненты

  • lib/ — каталог, содержащий скомпилированные нативные библиотеки (файлы .so) для различных архитектур процессоров (armeabi-v7a, arm64-v8a, x86, x86_64). Наличие этого каталога характерно для приложений, использующих код на C/C++ (например, через Android NDK).
  • assets/ — каталог для хранения произвольных файлов (изображений, звуков, видео, шрифтов, баз данных), доступ к которым осуществляется через AssetManager. В отличие от ресурсов, файлы в assets не компилируются и не индексируются.
  • res/ — каталог с ресурсами приложения, организованными по подкаталогам (drawable, layout, mipmap, values, xml, raw и т.д.). Ресурсы могут быть адаптированы под различные конфигурации устройства (плотность экрана, язык, ориентацию).
  • kotlin/ — каталог, содержащий метаданные, необходимые для работы приложений, написанных на языке Kotlin (например, файлы с информацией о модулях и аннотациях).

Процесс сборки и подписи

Сборка APK-файла включает несколько этапов:

  1. Компиляция ресурсов: Инструмент aapt (Android Asset Packaging Tool) компилирует XML-файлы ресурсов в двоичный формат и генерирует файл resources.arsc.
  2. Компиляция кода: Исходный код на Java или Kotlin компилируется в байт-код JVM (.class файлы), который затем преобразуется в байт-код Dalvik/ART (.dex файлы) с помощью инструмента d8 или dx.
  3. Упаковка: Все скомпилированные компоненты (dex, arsc, манифест, ресурсы, нативные библиотеки) упаковываются в ZIP-архив без сжатия (store mode) для обеспечения возможности выравнивания.
  4. Выравнивание: Инструмент zipalign выравнивает все несжатые данные в архиве по 4-байтовым границам, что ускоряет загрузку ресурсов во время выполнения.
  5. Подпись: APK-файл подписывается цифровой подписью разработчика с использованием инструмента apksigner. Подпись гарантирует целостность и аутентичность приложения. С версии Android 9 (API Level 28) рекомендуется использовать схему подписи v2 (APK Signature Scheme v2) или v3 (APK Signature Scheme v3), которые обеспечивают более высокую безопасность по сравнению с устаревшей схемой v1 (JAR signing).

Установка APK-файлов

Установка APK-файла на устройство Android может осуществляться несколькими способами:

  • Через магазин приложений (Google Play, RuStore, Huawei AppGallery, Amazon Appstore и др.): Пользователь выбирает приложение в магазине, и система автоматически загружает и устанавливает APK-файл (или его более современный аналог — AAB) после проверки подписи и разрешений.
  • Сторонняя установка (sideloading): Пользователь вручную загружает APK-файл из интернета или получает его через Bluetooth, электронную почту, файловый менеджер и запускает его. Для этого требуется включить опцию «Установка из неизвестных источников» (или «Разрешить установку из этого источника») в настройках безопасности устройства. Этот метод сопряжён с риском установки вредоносного ПО, так как подпись APK-файла может быть не проверена доверенным центром сертификации.
  • Через ADB (Android Debug Bridge): Разработчики и продвинутые пользователи могут устанавливать APK-файлы с компьютера командой adb install <путь_к_файлу.apk>. Этот способ требует включения отладки по USB на устройстве.

APK и вредоносное ПО

Из-за возможности установки APK-файлов из непроверенных источников, формат APK часто используется для распространения вредоносного программного обеспечения (троянов, шпионского ПО, программ-вымогателей, рекламного ПО). Вредоносные APK-файлы могут маскироваться под легитимные приложения, содержать скрытый код, запрашивать избыточные разрешения или использовать уязвимости в системе безопасности.

Для защиты от вредоносных APK-файлов Google внедрила в сервисы Google Play Protect систему сканирования установленных приложений. Также рекомендуется устанавливать приложения только из официальных магазинов, проверять запрашиваемые разрешения и обращать внимание на рейтинг и отзывы.

APK и Android App Bundle (AAB)

В 2018 году Google представила новый формат публикации приложений — Android App Bundle (AAB). AAB не является установочным файлом; это формат публикации, который содержит все возможные ресурсы и код приложения, а Google Play генерирует из него оптимизированные APK-файлы для каждого конкретного устройства (с учётом архитектуры процессора, плотности экрана, языка и других параметров). Это позволяет уменьшить размер устанавливаемого приложения на 15–20% в среднем.

С августа 2021 года Google Play требует, чтобы все новые приложения публиковались в формате AAB. Однако APK-файлы по-прежнему используются для установки приложений на устройства, для распространения приложений вне Google Play, а также для тестирования и отладки.

Инструменты для работы с APK

Существует множество инструментов для анализа, модификации и отладки APK-файлов:

  • APKTool — инструмент для декомпиляции APK-файлов в ресурсы и смали-код (человекочитаемое представление dex-байткода), а также для повторной сборки.
  • JADX — декомпилятор, преобразующий dex-файлы в читаемый исходный код на Java.
  • dex2jar — утилита для преобразования dex-файлов в JAR-файлы, которые затем можно декомпилировать с помощью обычных Java-декомпиляторов.
  • Android Studio Profiler — встроенный в среду разработки инструмент для профилирования производительности приложения.
  • ApkSigner — инструмент для подписи APK-файлов с использованием различных схем подписи.

Источники

  1. Официальная документация Android Developers: «APK Overview» (Android Developers).
  2. Официальная документация Android Developers: «Android App Bundle» (Android Developers).
  3. Официальная документация Android Developers: «Sign your app» (Android Developers).
  4. Официальная документация Android Developers: «Application fundamentals» (Android Developers).
  5. Книга: «Android Programming: The Big Nerd Ranch Guide» (3rd edition), Bill Phillips, Chris Stewart, Brian Hardy, Kristin Marsicano.
  6. Статья: «Understanding Android APK Files: Structure, Components, and Security Implications» (ResearchGate).
  7. Статья: «Android App Bundle vs APK: What’s the Difference?» (Android Authority).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →