Что входит в состав APK файла Android приложения
Что проверяют
Заглядывали ли вы внутрь собранного артефакта хоть раз или только жали кнопку в IDE. По ответу видно, понимаете ли вы, что именно уезжает на устройство, и знаете ли, почему подпись и ресурсы устроены так, а не иначе.
Как отвечать
APK это обычный zip-архив со строго заданным набором содержимого:
AndroidManifest.xmlв бинарном виде: компоненты, разрешения,minSdkиtargetSdk, точка входа;- один или несколько
classes.dex: байт-код Kotlin и Java, переведённый в формат DEX; несколько файлов появляются при multidex; resources.arsc: скомпилированная таблица ресурсов: строки, размеры, квалификаторы языка и плотности;res/: сами ресурсы, на которые ссылается таблица: разметка в бинарном XML, drawable, mipmap;assets/: файлы, которые читаются как есть черезAssetManager, без идентификаторов;lib/<abi>/: нативные библиотеки.so, по папке на архитектуру;META-INF/: манифест архива и подписи.
Дальше про подпись, её ждут отдельно. Без подписи система пакет не поставит. Схема v1 подписывает отдельные записи внутри zip, v2 и v3 подписывают архив целиком блоком перед центральным каталогом, v3 умеет ротацию ключа. Ключ определяет identity приложения: обновление, подписанное другим ключом, на устройство не встанет.
Хорошо добавить, что в магазин сейчас уезжает не APK, а бандл, из которого магазин сам собирает установочные APK под конкретное устройство: нужная архитектура, плотность, язык. И что посмотреть содержимое можно через unzip, aapt2 dump badging или APK Analyzer.
Где спотыкаются
Говорят, что DEX исполняет Dalvik. Dalvik давно заменён на ART: код компилируется заранее и по профилям использования, а JIT работает как дополнение. Фраза про Dalvik сразу выдаёт заученный текст многолетней давности.
Второе: путают res/ и assets/. В res/ попадает только то, что прошло через компилятор ресурсов и получило идентификатор, assets/ это произвольные файлы с доступом по пути.
Третье: считают, что архив можно распаковать, поправить и запаковать обратно. Любая правка ломает подпись, а v2 и v3 считают хеш от байтов архива, поэтому после изменений нужны и zipalign, и переподписание.