Место установки приложения, Место установки приложения

Начиная с уровня API 8, вы можете разрешить установку вашего приложения на внешнем хранилище (например, на SD-карте устройства). Это дополнительная функция, которую вы можете объявить для своего приложения с помощью атрибута манифеста android:installLocation . Если вы не объявите этот атрибут, ваше приложение будет установлено только во внутреннем хранилище и его нельзя будет переместить во внешнее хранилище.

Чтобы позволить системе установить ваше приложение во внешнее хранилище, измените файл манифеста, включив в элемент <manifest> атрибут android:installLocation со значением « 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 8:

  1. Включите атрибут android:installLocation со значением « auto » или « preferExternal » в элемент <manifest> .
  2. Оставьте атрибут android:minSdkVersion как есть ( меньше «8») и убедитесь, что код вашего приложения использует только API, совместимые с этим уровнем.
  3. Чтобы скомпилировать приложение, измените цель сборки на уровень API 8. Это необходимо, поскольку старые библиотеки Android не понимают атрибут android:installLocation и не будут компилировать ваше приложение, когда оно присутствует.

Когда ваше приложение устанавливается на устройство с уровнем API ниже 8, атрибут android:installLocation игнорируется, и приложение устанавливается во внутреннюю память.

Внимание: Хотя подобная XML-разметка будет игнорироваться старыми платформами, вы должны быть осторожны и не использовать API-интерфейсы программирования, представленные на уровне API 8, если ваша minSdkVersion меньше «8», если только вы не выполните работу, необходимую для обеспечения обратной совместимости в ваш код.

Приложения, которые НЕ следует устанавливать на внешнее хранилище

Когда пользователь включает USB-накопитель для обмена файлами со своим компьютером (или иным образом отключает или удаляет внешний накопитель), любое приложение, установленное на внешнем накопителе и работающее в данный момент, уничтожается. Система фактически не узнает о приложении до тех пор, пока запоминающее устройство не будет отключено и внешнее хранилище не будет перемонтировано на устройстве. Помимо уничтожения приложения и его недоступности для пользователя, это может привести к более серьезной поломке некоторых типов приложений. Чтобы ваше приложение работало должным образом, вам не следует разрешать установку вашего приложения на внешнее хранилище, если оно использует любую из следующих функций, из-за указанных последствий при отключении внешнего хранилища:

Услуги
Ваша работающая Service прекращается и не перезапускается при перемонтировании внешнего хранилища. Приложения, привязанные к этой службе, могут регистрироваться для широковещательного намерения ACTION_EXTERNAL_APPLICATIONS_AVAILABLE , которое уведомляет все приложения, которые не установлены во внешнем хранилище, когда приложения, установленные во внешнем хранилище, снова становятся доступными системе. После получения этой трансляции приложения могут попытаться подключиться к вашей службе.
Службы сигнализации
Ваши сигналы тревоги, зарегистрированные в AlarmManager будут отменены. При повторном подключении внешнего накопителя необходимо вручную перерегистрировать все сигналы тревоги.
Механизмы методов ввода
Ваш IME будет заменен IME по умолчанию. Когда внешнее хранилище перемонтировано, пользователь может открыть системные настройки, чтобы снова включить IME.
Живые обои
Ваши работающие живые обои будут заменены живыми обоями по умолчанию. Когда внешнее хранилище перемонтируется, пользователь сможет снова выбрать живые обои.
Виджеты приложений
Ваш виджет приложения будет удален с главного экрана. Когда внешнее хранилище перемонтировано, ваш виджет приложения не будет доступен для выбора пользователем до тех пор, пока система не перезагрузит домашнее приложение (обычно не до перезагрузки системы).
Менеджеры по работе с клиентами
Ваши учетные записи, созданные с помощью AccountManager , исчезнут, пока внешнее хранилище не будет перемонтировано.
Адаптеры синхронизации
Ваш AbstractThreadedSyncAdapter и все его функции синхронизации не будут работать, пока внешнее хранилище не будет перемонтировано.
Администраторы устройств
Ваш DeviceAdminReceiver и все его возможности администратора будут отключены, что может иметь непредвиденные последствия для функциональности устройства, которые могут сохраниться после перемонтирования внешнего хранилища.
Широковещательные приемники прослушивают сообщение «загрузка завершена».
Система передает широковещательную рассылку ACTION_BOOT_COMPLETED перед подключением внешнего хранилища к устройству. Если ваше приложение установлено на внешнем хранилище, оно никогда не сможет получить эту трансляцию.

Если ваше приложение использует любую из перечисленных выше функций, вам не следует разрешать установку приложения на внешнее хранилище. По умолчанию система не разрешает установку вашего приложения на внешнее хранилище, поэтому вам не нужно беспокоиться о существующих приложениях. Однако, если вы уверены, что ваше приложение никогда не должно быть установлено на внешнем хранилище, вам следует прояснить это, объявив android:installLocation со значением « internalOnly ». Хотя это не меняет поведение по умолчанию, оно явно указывает, что ваше приложение должно быть установлено только во внутренней памяти, и служит напоминанием вам и другим разработчикам о том, что это решение было принято.

Приложения, которые следует устанавливать на внешнее хранилище

Проще говоря, все, что не использует функции, перечисленные в предыдущем разделе, безопасно при установке на внешнее хранилище. Большие игры чаще всего представляют собой те типы приложений, которые следует разрешать установку на внешнее хранилище, поскольку игры обычно не предоставляют дополнительных услуг, когда они неактивны. Когда внешнее хранилище становится недоступным и игровой процесс завершается, видимого эффекта не должно быть, когда хранилище снова становится доступным и пользователь перезапускает игру (при условии, что игра правильно сохранила свое состояние в течение обычного жизненного цикла активности ).

Если вашему приложению требуется несколько мегабайт для файла APK, вам следует тщательно подумать, следует ли разрешить установку приложения на внешнем хранилище, чтобы пользователи могли сохранить место во внутреннем хранилище.

Дополнительную информацию см. в разделе <manifest> .