Начиная с уровня 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:
- Включите атрибут
android:installLocation
со значением «auto
» или «preferExternal
» в элемент<manifest>
. - Оставьте атрибут
android:minSdkVersion
как есть ( меньше «8») и убедитесь, что код вашего приложения использует только API, совместимые с этим уровнем. - Чтобы скомпилировать приложение, измените цель сборки на 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> .