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, шейдеры) |