Начиная с API Level 8, вы можете разрешить установку вашего приложения на внешнее хранилище (например, на SD-карту устройства). Это необязательная функция, которую вы можете указать для своего приложения с помощью атрибута android:installLocation в манифесте. Если вы не укажете этот атрибут, ваше приложение будет установлено только во внутреннюю память и его нельзя будет переместить на внешнее хранилище.
Чтобы разрешить системе установить ваше приложение на внешнее хранилище, измените файл манифеста, добавив атрибут android:installLocation в элемент <manifest> со значением либо " preferExternal ", либо " auto ". Например:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="preferExternal" ... >
Если вы указываете параметр " preferExternal ", вы запрашиваете установку вашего приложения на внешнее хранилище, но система не гарантирует, что ваше приложение будет установлено на внешнее хранилище. Если внешнее хранилище заполнено, система установит приложение на внутреннее хранилище. Пользователь также может перемещать ваше приложение между этими двумя местами.
Если вы укажете " auto ", это означает, что ваше приложение может быть установлено на внешнее хранилище, но вы не указываете предпочтительное место установки. Система определит место установки вашего приложения на основе нескольких факторов. Пользователь также может перемещать ваше приложение между двумя указанными местами.
Когда ваше приложение установлено на внешнем накопителе:
- При условии подключения внешнего накопителя к устройству производительность приложения не изменяется.
- Файл
.apkсохраняется на внешнем накопителе, но все личные данные пользователя, базы данных, оптимизированные файлы.dexи извлеченный нативный код сохраняются во внутренней памяти устройства. - Уникальный контейнер, в котором хранится ваше приложение, зашифрован с помощью случайно сгенерированного ключа, который может быть расшифрован только устройством, на котором оно было первоначально установлено. Таким образом, приложение, установленное на SD-карте, работает только на одном устройстве.
- Пользователь может переместить ваше приложение во внутреннюю память через системные настройки.
Внимание: если пользователь включает функцию обмена файлами между USB-накопителем и компьютером или отключает SD-карту через системные настройки, внешнее хранилище отключается от устройства, и все приложения, работающие на внешнем носителе, немедленно завершают работу.
Обратная совместимость
Возможность установки вашего приложения на внешнюю память доступна только на устройствах с API уровня 8 (Android 2.2) или выше. Существующие приложения, разработанные до API уровня 8, всегда будут устанавливаться во внутреннюю память и не могут быть перемещены на внешнюю память (даже на устройствах с API уровня 8). Однако, если ваше приложение разработано для поддержки API уровня ниже 8, вы можете выбрать поддержку этой функции для устройств с API уровня 8 или выше, и при этом оно будет совместимо с устройствами, использующими API уровня ниже 8.
Для обеспечения возможности установки на внешние накопители и сохранения совместимости с версиями ниже API Level 8:
- Добавьте атрибут
android:installLocationсо значением "auto" или "preferExternal" в элемент<manifest>. - Оставьте атрибут
android:minSdkVersionбез изменений (значение меньше "8") и убедитесь, что код вашего приложения использует только API, совместимые с этим уровнем. - Для компиляции вашего приложения измените целевой уровень сборки на API Level 8. Это необходимо, поскольку более старые библиотеки Android не распознают атрибут
android:installLocationи не скомпилируют ваше приложение, если он присутствует.
Если ваше приложение установлено на устройстве с уровнем API ниже 8, атрибут android:installLocation игнорируется, и приложение устанавливается во внутреннюю память устройства.
Внимание: Хотя XML-разметка, подобная этой, будет игнорироваться более старыми платформами, следует проявлять осторожность и не использовать программные API, появившиеся в API уровня 8, если ваш minSdkVersion меньше «8», если только вы не выполните необходимые действия для обеспечения обратной совместимости в вашем коде.
Приложения, которые НЕ следует устанавливать на внешние накопители.
Когда пользователь включает USB-накопитель для обмена файлами со своим компьютером (или иным образом отключает или удаляет внешнее хранилище), любое приложение, установленное на внешнем хранилище и запущенное в данный момент, завершает работу. Система фактически перестает знать о приложении до тех пор, пока не будет отключен USB-накопитель и внешнее хранилище не будет повторно подключено к устройству. Помимо завершения работы приложения и его недоступности для пользователя, это может привести к более серьезным проблемам с некоторыми типами приложений. Для обеспечения стабильной работы вашего приложения не следует разрешать его установку на внешнее хранилище, если оно использует какие-либо из следующих функций, из-за указанных последствий при отключении внешнего хранилища:
- Услуги
- При повторном монтировании внешнего хранилища запущенная
Serviceзавершается и не перезапускается. Приложения, привязанные к этой службе, могут зарегистрироваться для получения широковещательного уведомленияACTION_EXTERNAL_APPLICATIONS_AVAILABLE, которое уведомляет все приложения, не установленные на внешнем хранилище, о том, что приложения, установленные на внешнем хранилище, снова стали доступны системе. После получения этого широковещательного уведомления приложения могут попытаться привязаться к вашей службе. - Alarm Services
- Ваши оповещения, зарегистрированные в
AlarmManagerбудут аннулированы. Вам потребуется вручную повторно зарегистрировать все оповещения при повторном подключении внешнего хранилища. - Редакторы методов ввода
- Ваш IME будет заменен на IME по умолчанию. После повторного монтирования внешнего накопителя пользователь может открыть системные настройки, чтобы снова включить свой IME.
- Живые обои
- Ваши текущие живые обои будут заменены на стандартные. После повторного подключения внешнего накопителя пользователь сможет снова выбрать свои живые обои.
- Виджеты приложений
- Ваш виджет приложения будет удален с главного экрана. При повторном подключении внешнего хранилища ваш виджет приложения будет недоступен для выбора пользователем до тех пор, пока система не сбросит главное приложение (обычно это происходит после перезагрузки системы).
- Менеджеры по работе с клиентами
- Ваши учетные записи, созданные с помощью
AccountManagerисчезнут до тех пор, пока внешнее хранилище не будет переподключено. - Синхронизирующие адаптеры
- Ваш
AbstractThreadedSyncAdapterи все его функции синхронизации не будут работать, пока внешнее хранилище не будет переподключено. - Администраторы устройств
- Ваш
DeviceAdminReceiverи все его административные возможности будут отключены, что может иметь непредсказуемые последствия для функциональности устройства, которые могут сохраниться и после повторного подключения внешнего хранилища. - Приёмники широковещательной рассылки ожидают сообщения «загрузка завершена».
- Система отправляет широковещательное сообщение
ACTION_BOOT_COMPLETEDдо того, как внешнее хранилище будет подключено к устройству. Если ваше приложение установлено на внешнем хранилище, оно никогда не сможет получить это широковещательное сообщение.
Если ваше приложение использует какие-либо из перечисленных выше функций, вам не следует разрешать его установку на внешнее хранилище. По умолчанию система не разрешает установку вашего приложения на внешнее хранилище, поэтому вам не нужно беспокоиться о ваших существующих приложениях. Однако, если вы уверены, что ваше приложение никогда не должно устанавливаться на внешнее хранилище, то вам следует четко указать это, объявив android:installLocation со значением " internalOnly ". Хотя это не меняет поведение по умолчанию, это явно указывает на то, что ваше приложение должно устанавливаться только во внутреннее хранилище, и служит напоминанием вам и другим разработчикам о том, что это решение было принято.
Приложения, которые следует устанавливать на внешнее хранилище.
Проще говоря, всё, что не использует функции, перечисленные в предыдущем разделе, безопасно при установке на внешнее хранилище. Чаще всего на внешнее хранилище можно устанавливать большие игры, поскольку игры обычно не предоставляют дополнительных услуг в неактивном состоянии. Когда внешнее хранилище становится недоступным и игровой процесс завершается, видимых последствий при повторном доступе хранилища и перезапуске игры пользователем быть не должно (при условии, что игра корректно сохранила своё состояние в течение обычного жизненного цикла Activity ).
Если вашему приложению требуется несколько мегабайт для APK-файла, вам следует тщательно обдумать, стоит ли разрешать установку приложения на внешнее хранилище, чтобы пользователи могли сэкономить место во внутренней памяти своих устройств.
Для получения дополнительной информации по данной теме см.: <manifest>