APK (Android Package) — это обычный архив в формате ZIP, содержащий всё необходимое для установки Android-приложения на устройство:
- код,
- ресурсы,
- манифест,
- метаинформацию,
- подпись
Структура .apk
файла
Вот что обычно входит в APK
:
app.apk
├── AndroidManifest.xml
├── classes.dex
├── lib/
│ └── armeabi-v7a/libnative.so
├── res/
│ └── drawable/…
├── assets/
│ └── raw_data.json
├── resources.arsc
├── META-INF/
│ ├── CERT.RSA
│ ├── CERT.SF
│ └── MANIFEST.MF
Подробности по каждому элементу
Файл / Каталог | Назначение |
---|---|
AndroidManifest.xml | Главный манифест: компоненты, разрешения, intent-фильтры, темы и пр. |
classes.dex | Скомпилированный байткод (Java/Kotlin) в формате DEX (Dalvik EXecutable) |
lib/ | Нативные .so библиотеки (JNI), разбитые по ABI (armeabi-v7a , x86_64 ) |
res/ | Сжатые ресурсы: картинки, layout’ы, strings (без доступа через Assets ) |
assets/ | Несжатые произвольные файлы, доступны через AssetManager |
resources.arsc | Скомпилированные ресурсы (индексы, строки, темы) |
META-INF/ | Подпись, хэш-суммы, манифест безопасности |
kotlin/ , kotlinx/ | (опционально) модули Kotlin стандартной библиотеки |
Подпись APK
APK должен быть подписан (debug или release-ключом).
Иначе Android не установит его.
CERT.RSA
: цифровая подписьMANIFEST.MF
: контрольная сумма каждого файла- С Android 7+ — используется APK Signature Scheme v2/v3
Сколько может быть .dex
файлов?
- Один
classes.dex
=> если код ≤ 64K методов - Если больше => MultiDex
Что попадает в res/
vs assets/
?
Папка | Как доступ | Когда использовать |
---|---|---|
res/ | через R.drawable.logo и т.д. | фиксированные ресурсы (иконки, layout, strings) |
assets/ | через AssetManager (open("file.json") ) | произвольные файлы (шрифты, JSON, шейдеры) |