Ubicación de la instalación de la app

A partir de la API nivel 8, puedes permitir que la aplicación se instale en un almacenamiento externo (por ejemplo, la tarjeta SD del dispositivo). Esta es una función opcional que puedes declarar en la aplicación con el atributo de manifiesto android:installLocation. Si no declaras este atributo, la aplicación solo se instalará en el almacenamiento interno y no podrá moverse al almacenamiento externo.

Para permitir que el sistema instale la aplicación en el almacenamiento externo, modifica el archivo de manifiesto de modo que incluya el atributo android:installLocation en el elemento <manifest>, con el valor "preferExternal" o "auto". Por ejemplo:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="preferExternal"
    ... >

Si declaras "preferExternal", estarás solicitando que la aplicación se instale en el almacenamiento externo, pero el sistema no garantiza que esto efectivamente ocurra. Si el almacenamiento externo está lleno, el sistema instalará la aplicación en el almacenamiento interno. El usuario también puede mover la aplicación entre dos ubicaciones.

Si declaras "auto", estarás indicando que la aplicación puede instalarse en el almacenamiento externo, pero no dispones ninguna preferencia de ubicación de la instalación. El sistema decidirá dónde instalar la aplicación en función de varios factores. El usuario también puede mover la aplicación entre dos ubicaciones.

Cuando la aplicación se instala en el almacenamiento externo:

  • No se produce ningún efecto sobre el rendimiento de la aplicación, siempre que el almacenamiento externo esté conectado al dispositivo.
  • El archivo .apk se guarda en el almacenamiento externo, pero todos los datos de usuario privados, las bases de datos, los archivos .dex optimizados y el código nativo extraído se guardan en la memoria interna del dispositivo.
  • El contenedor exclusivo donde se almacena la aplicación está encriptado con una clave generada al azar que solo puede desencriptar el dispositivo que la instaló originalmente. Por lo tanto, una aplicación instalada en una tarjeta SD funciona solamente para un dispositivo.
  • El usuario puede mover la aplicación al almacenamiento interno mediante la configuración del sistema.

Advertencia: Cuando el usuario permite que el almacenamiento masivo de USB comparta archivos con una computadora o desconecta la tarjeta SD mediante la configuración del sistema, el almacenamiento externo se desconecta del dispositivo y todas las aplicaciones que se ejecutaban en el almacenamiento externo finalizan de inmediato.

Compatibilidad con versiones anteriores

La capacidad de la aplicación para instalarse en el almacenamiento externo es una función disponible solamente en dispositivos que ejecutan la API nivel 8 (Android 2.2) o versiones posteriores. Las aplicaciones existentes que se desarrollaron antes de la API nivel 8 siempre se instalarán en el almacenamiento interno y no podrán moverse al almacenamiento externo (incluso en dispositivos con API nivel 8). No obstante, si la aplicación se diseñó para que fuera compatible con una API de nivel inferior a 8, puedes optar por admitir esta función para los dispositivos con API nivel 8 o versiones posteriores y que, aun así, la aplicación sea compatible con los dispositivos que usan una API de nivel inferior a 8.

Para permitir la instalación en almacenamiento externo y que la aplicación siga siendo compatible con versiones inferiores a la API nivel 8:

  1. Incluye el atributo android:installLocation con un valor de "auto" o "preferExternal" en el elemento <manifest>.
  2. Deja el atributo android:minSdkVersion tal cual está (inferior a "8") y asegúrate de que el código de la aplicación use solamente API que sean compatibles con ese nivel.
  3. Para compilar la aplicación, modifica el objetivo de compilación al nivel de API 8. Esto es necesario para que las bibliotecas Android más antiguas no comprendan el atributo android:installLocation y no compilen la aplicación cuando la encuentren.

Cuando la aplicación se instala en un dispositivo con una API de nivel inferior a 8, el atributo android:installLocation se ignora y la aplicación se instala en el almacenamiento interno.

Advertencia: Aunque las plataformas más antiguas ignorarán un lenguaje de marcado XML como este, debes tener cuidado de no usar las API de programación introducidas en API nivel 8 mientras minSdkVersion es inferior a "8", a menos que realices el trabajo necesario para proporcionar compatibilidad con versiones anteriores en el código.

Aplicaciones que NO deberían instalarse en el almacenamiento externo

Cuando el usuario permite que el almacenamiento masivo de USB comparta archivos con su computadora (o, de otra manera, desconecta o retira el almacenamiento externo), se finaliza cualquier aplicación instalada en el almacenamiento externo y que esté en ejecución. El sistema efectivamente deja de reconocer la aplicación hasta que se deshabilita el almacenamiento masivo y el almacenamiento externo se vuelve a conectar en el dispositivo. Además de finalizar la aplicación y hacer que no esté disponible para el usuario, esta acción puede causar daños más graves a cierto tipo de aplicaciones. Para que la aplicación se comporte de manera uniforme según lo esperado, no debes permitir que la aplicación se instale en el almacenamiento externo si utiliza alguna de las siguientes funciones, ya que se podrían presentar las consecuencias mencionadas cuando se desconecte el almacenamiento externo:

Servicios
El servicio Service en ejecución finaliza y no se reinicia al volver a conectar el almacenamiento externo. Las aplicaciones vinculadas con este servicio pueden registrarse para el intent de transmisión ACTION_EXTERNAL_APPLICATIONS_AVAILABLE, que notifica a todas las aplicaciones que no están instaladas en el almacenamiento externo cuando las aplicaciones instaladas en el almacenamiento externo vuelven a estar disponibles para el sistema. Después de recibir esta transmisión, las aplicaciones pueden intentar vincularse al servicio.
Servicios de alarma
Se cancelan las alarmas registradas con AlarmManager. Deberás volver a registrar las alarmas manualmente cuando se vuelva a conectar el almacenamiento externo.
Motores del método de introducción
Los motores del método de introducción (IME) se reemplazarán con los IME predeterminados. Cuando se vuelve a conectar el almacenamiento externo, el usuario puede abrir la configuración del sistema para habilitar los IME nuevamente.
Fondo de pantalla animado
Se reemplazará el fondo de pantalla animado en ejecución por el fondo de pantalla animado predeterminado. Cuando se vuelve a conectar el almacenamiento externo, el usuario puede seleccionar nuevamente el fondo de pantalla animado.
Widgets de la app
Se quitarán los widgets de la app de la pantalla de inicio. Cuando se vuelva a conectar el almacenamiento externo, el widget de la app no estará disponible para que el usuario lo seleccione hasta que el sistema restablezca la aplicación de inicio (en general, no sucede hasta que se reinicia el sistema).
Administradores de cuentas
Las cuentas creadas con AccountManager desaparecen hasta que se vuelve a conectar el almacenamiento externo.
Adaptadores de sincronización
El adaptador AbstractThreadedSyncAdapter y su funcionalidad de sincronización no funcionarán hasta que se vuelva a conectar el almacenamiento externo.
Administradores de dispositivos
Se deshabilitarán el dispositivo DeviceAdminReceiver y todas las capacidades de administrador, lo cual puede tener consecuencias impredecibles que podrían persistir incluso después de que se vuelva a conectar el almacenamiento externo.
Receptores de emisión que reciben el mensaje "inicio completado"
El sistema produce la transmisión de ACTION_BOOT_COMPLETED antes de que el almacenamiento externo vuelva a conectarse con el dispositivo. Si la aplicación está instalada en el almacenamiento externo, jamás podrá recibir esta transmisión.

Si la aplicación usa alguna de las funciones mencionadas anteriormente, no debes permitir que se instale la aplicación en el almacenamiento externo. De forma predeterminada, el sistema no permite que se instale la aplicación en el almacenamiento externo, por lo que no es necesario preocuparse por las aplicaciones existentes. Sin embargo, si estás seguro de que jamás se debe instalar la aplicación en el almacenamiento externo, debes dejarlo claro declarando android:installLocation con un valor de "internalOnly". De este modo, no se modificará el comportamiento predeterminado, se indicará de forma explícita que la aplicación solo debe instalarse en un almacenamiento interno, y tú y otros desarrolladores tendrán un recordatorio de que se tomó esta decisión.

Aplicaciones que se deben instalar en el almacenamiento externo

En términos simples, todos los elementos que no usen las funciones mencionadas en la sección anterior estarán protegidos si se instalan en el almacenamiento externo. Los tipos de aplicaciones que podrían instalarse en el almacenamiento externo son, con más frecuencia, los juegos de gran tamaño, ya que generalmente no proporcionan servicios adicionales cuando están inactivos. Cuando el almacenamiento externo deja de estar disponible y finaliza el proceso de un juego, no se debe producir ningún efecto si el almacenamiento vuelve a estar disponible y el usuario reinicia el juego (suponiendo que se guardó correctamente el estado del juego durante el ciclo de vida de la actividad normal).

Si la aplicación requiere varios megabytes para el archivo APK, debes considerar atentamente si vas a permitir que se instale la aplicación en el almacenamiento externo a fin de que los usuarios puedan conservar espacio en su almacenamiento interno.

Para obtener más información relacionada, consulta: <manifest>.