Моя догадка заключается в том, что содержимое пакета .apk извлекается где-то, и приложение зарегистрировано в каком-то каталоге, чтобы запускать приложение или что-то еще. Но это все? Если это так, является ли исходный файл manifest.xml каждый раз, когда приложение запущено или оно предварительно обработано в какой-либо другой форме?
Что именно происходит, когда я устанавливаю приложение для Android?
Ответ 1
Некоторые основы
.apk
файл
Файл .apk
не является магическим. Это просто набор файлов, которые представляют собой содержимое приложения для Android. Если вы откроете его в архиве-инструменте (например, 7Zip), вы можете просматривать его и извлекать.
Android - это Linux
Основной Android-системой является система Linux. Android использует собственное ядро Linux с некоторыми дополнительными функциями энергосбережения и некоторыми улучшениями скорости. Внутренняя память Android-устройства отформатирована с помощью YAFFS2 файловой системы, в которой полностью реализованы концепции доступа к Linux.
Используемая файловая система может отличаться по версии производителя или Android-версии. Новые устройства часто используют ext3
, а Samsung использует собственную файловую систему: RFS
Это один из важных аспектов Sandbox-системы, который используется Android.
Компиляция приложений
Что происходит с .java
файлами?
Сначала они компилируются обычным компилятором Java. После того, как они скомпилированы (до .class
файлов), dx
-tool из Android SDK затем преобразует/транслирует эти "нормальные" java-классы в Dalvik-Bytecode.
Этот "специальный" java-код затем интерпретируется DVM (Dalvik Virtual Machine), который основан на JRE-реализации с открытым исходным кодом Apache Harmony.
Обновление. В более новых версиях Android шаг преобразования/пересылки можно пропустить, если jack используется. Таким образом, файлы .java
напрямую компилируются в формат .dx
.
Кроме того, поскольку версия 4.4 (KitKat) Android имеет новый ART runtime, который официально заменил Dalvik на Android 5 (Lollipop).
Что происходит с ресурсами, которые я ввел в каталог /asset
?
Android предлагает /assets
-directory для добавления некоторых двоичных raw файлов (например, базы данных SQLite). Файлы, помещенные в этот каталог не скомпилированы или оптимизированы.
Если вы поместите свои файлы в этот каталог, это будет поведение, которое вы ожидаете от Android.
Что происходит с ресурсами, которые я ввел в /res/raw
-каталог?
Как и каталог /assets
, вы также можете поместить здесь двоичные (или другие) исходные файлы (например, HTML файлы для справки). Эти файлы скомпилированы/оптимизированы (если возможно).
Что происходит с манифестом и другими XML файлами?
Android-манифест, а также другие XML файлы (макеты, строки и т.д.) хранятся и "скомпилируются" в двоичный XML-формат. Это оптимизация скорости.
Песочница
С точки зрения ОС Android, одному Приложению принадлежит:
- собственный процесс,
- это собственный OS-пользователь (например, Linux),
- собственный DVM,
- это собственное место в куче и
- это собственное место в файловой системе.
Итак, у каждого приложения Android есть собственный пользователь, который имеет права на доступ к нему во внутреннем хранилище (который защищен стандартным управлением правами на файловую систему Linux) и имеет собственный DVM-процесс (который не может быть доступ к ним извне приложения).
Чтобы предоставить программе возможность покинуть Песочницу (например, для подключения к Интернету), используются разрешения, объявленные в манифесте Android.
Шаги во время установки
Итак, из приведенных выше объяснений должно быть ясно, что происходит, когда установлено Android-приложение:
- Создан новый пользователь для приложения.
- При использовании этих новых прав пользователя создается каталог приложений во внутреннем хранилище.
- Содержимое файла
.apk
извлекается там. - Анализируется Android-манифест и объявляются объявленные
intent-filter
(например,android.intent.category.LAUNCHER
-фильтр для стандартной точки входа приложений). - Теперь приложение готово для первого запуска.
Ответ 2
Когда вы устанавливаете приложение, система Android копирует APK в папку "/data/app" и называет его именем пакета, за которым следует номер установки (сколько раз вы устанавливаете или обновляете приложение).
Я попытался установить приложение вручную, скопировав его APK и вставив его в папку /data/app и перезагрузив свое устройство, он появится как установленное приложение и прекрасно работает.
Также я заметил в link2SD, что любое установленное приложение имеет следующее:
Apk, расположенный в /data/app/package -number.apk
Dex находится в /data/dalvik -cache/[email protected]@[email protected]
Lib находится в /data/data/package/lib
Данные, находящиеся в /data/data/package
Кэш, расположенный в/data/data/package/cache
Ответ 3
Android определяет намерение как "абстрактное описание выполняемой операции". Не только намерения позволяют использовать действия других, но они также используются для запуска приложений. Я уверен, что вы видели эти строки в каждом приложении, которое вы написали:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Этот фильтр намерений позволяет пусковой установке находить начальную активность каждого приложения. Поиск "намеренного разрешения" для получения более подробной информации об этом процессе... Я бы сказал, что это более элегантно, чем просто регистрировать приложение в каком-то случайном каталоге.
Как указано в http://developer.android.com/guide/topics/intents/intents-filters.html, "система Android заполняет приложение запуска, экран верхнего уровня, который показывает доступные приложения для запуска пользователя, путем поиска всех действий с фильтрами намерений, которые определяют действие" android.intent.action.MAIN "и" android.intent.category.LAUNCHER ". Затем он отображает значки и метки этих действий в пусковая установка"