Почему Android хранит APK-файлы установленных приложений?

31

Android хранит APK-файлы установленных пользовательских приложений в /data/appкаталоге, а системные приложения в /system/appкаталоге.

Означает ли это, что Android извлекает файлы dex из файлов APK при каждом запуске приложения? Если нет, могу ли я безопасно удалить APK-файлы и при этом запустить приложение?

PrashanD
источник

Ответы:

43

Android APK обычно содержит эти вещи.

assets/
lib/
META-INF/
res/
AndroidManifest.xml
classes.dex

После установки файл APK копируется /data/app, classes.dexизвлекается и «оптимизируется» при запуске dex2oatна нем (на Android 5+ lib/также извлекается). Результат оптимизации сохраняется, /data/dalvik-cache/поэтому приложение необходимо оптимизировать только один раз за установку или обновление . Все остальное хранится внутри АПК. Таким образом, первый ответ очень ясно: вещи , как assetsи resчто требуется для реализации , должны быть предусмотрены приложения, и они находятся внутри APK. Файл APK хранится в целях поддержки. Если вы удалите APK, приложение определенно не запустится вообще. (Приложение: где мои активы?)

Во-вторых, в Google Play очень давно добавлена ​​поддержка «Delta Update» . В процедуре дельта-обновления вычисляется разница между старым пакетом и новым пакетом. Затем GP загружает «Delta» и применяет изменения к оригинальному APK, чтобы получить обновленный APK, тем самым уменьшая размер загрузки.

АПК всегда подписан. Это может предотвратить вредоносную модификацию пакета. Вы определенно не хотите устанавливать модифицированное приложение, не зная, что изменилось или был ли внедрен вирус. META-INF/Внутри APK работает для этой цели. Неофициальные изменения приведут к несоответствию подписи, и система Android откажется от установки модифицированного приложения.

Кроме того, при обновлении ОС Android все файлы dex снова «оптимизируются», поэтому вам не нужно переустанавливать их один за другим. Как сказано выше, для оптимизации требуется classes.dexфайл из оригинального пакета.

iBug
источник
5
Обратите внимание, что возможности дельта-обновления в Google Play Store зависят от наличия APK для вычисления разницы между установленной и обновленной версиями и последующего исправления. Кроме того, APK сжимается, поэтому он экономит место (кто-нибудь помнит, как вы ZdeAlign?)
Тамогна Чоудхури
@Tamoghna Space на самом деле не проблема, иначе Android 5+ не извлек бы lib/из APK, iOS не извлекла бы все из IPA. Это просто для базовой проверки целостности.
iBug
Исполняемые файлы редко сжимаются хорошо - экономия пространства больше связана со сжатыми ресурсами, такими как бинаризованные файлы XML, которые не извлекаются. Кроме того, об этом ZipAlign - доступ к ресурсам может быть несколько быстрее для оптимизированных (с выравниванием по слову) сжатых файлов.
Тамогна Чоудхури
1
Таким образом, файлы ресурсов, такие как файлы html и js, не копируются из apk в определенное место в файловой системе Android?
user1788736
1
@ user1788736 Да. Они остались в АПК.
iBug