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-файла включает несколько этапов:
- Компиляция ресурсов: Инструмент aapt (Android Asset Packaging Tool) компилирует XML-файлы ресурсов в двоичный формат и генерирует файл resources.arsc.
- Компиляция кода: Исходный код на Java или Kotlin компилируется в байт-код JVM (.class файлы), который затем преобразуется в байт-код Dalvik/ART (.dex файлы) с помощью инструмента d8 или dx.
- Упаковка: Все скомпилированные компоненты (dex, arsc, манифест, ресурсы, нативные библиотеки) упаковываются в ZIP-архив без сжатия (store mode) для обеспечения возможности выравнивания.
- Выравнивание: Инструмент zipalign выравнивает все несжатые данные в архиве по 4-байтовым границам, что ускоряет загрузку ресурсов во время выполнения.
- Подпись: 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-файлов с использованием различных схем подписи.
Источники
- Официальная документация Android Developers: «APK Overview» (Android Developers).
- Официальная документация Android Developers: «Android App Bundle» (Android Developers).
- Официальная документация Android Developers: «Sign your app» (Android Developers).
- Официальная документация Android Developers: «Application fundamentals» (Android Developers).
- Книга: «Android Programming: The Big Nerd Ranch Guide» (3rd edition), Bill Phillips, Chris Stewart, Brian Hardy, Kristin Marsicano.
- Статья: «Understanding Android APK Files: Structure, Components, and Security Implications» (ResearchGate).
- Статья: «Android App Bundle vs APK: What’s the Difference?» (Android Authority).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →