Место установки приложения задается с помощью атрибута installLocation в элементе <manifest> в Андроид-манифесте.

installLocation принимает следующие значения:

internalOnly – это значение по умолчанию. Приложение всегда устанавливается на внутреннее хранилище. Если на внутреннем диске не хватает места, приложение не будет установлено. После установки пользователь не может переместить приложение на внешнее хранилище.

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

preferExternal – предпочтение отдается внешнему диску. Приложение может быть установлено на внутреннее хранилище, если внешнее недоступно или не имеет достаточно места. После установки пользователь может перемещать приложение.

При установке на внешнем диске, на нем хранится только оригинальный apk-пакет приложения. Все приватные данные пользователя, база данных, оптимизированные .dex-файлы и нативный код сохраняются на внутреннее хранилище.

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