Ubicación de la instalación de la app

A partir del nivel de API 8, puedes permitir que la aplicación se instale en el almacenamiento externo (por ejemplo, la tarjeta SD del dispositivo). Esta es una función opcional que puedes declarar para 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.

A fin de que el sistema instale tu aplicación en el almacenamiento externo, modifica tu archivo de manifiesto para incluir el atributo android:installLocation en el elemento <manifest>, con un valor de "preferExternal" o "auto". Por ejemplo:

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

Si declaras "preferExternal", solicitas que la aplicación se instale en el almacenamiento externo, pero el sistema no garantiza que se instale allí. Si el almacenamiento externo está lleno, el sistema la instalará en el almacenamiento interno. El usuario también puede mover tu aplicación entre las dos ubicaciones.

Si declaras "auto", indicas que tu aplicación puede instalarse en el almacenamiento externo, pero no tienes una ubicación de preferencia. El sistema decidirá dónde instalar tu aplicación en función de varios factores. El usuario también puede mover tu aplicación entre las dos ubicaciones.

Cuando tu 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é activado en el dispositivo.
  • El archivo .apk se guarda en el almacenamiento externo, pero todos los datos privados del usuario, 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 tu 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 solo para un dispositivo.
  • El usuario puede mover tu aplicación al almacenamiento interno mediante la configuración del sistema.

Advertencia: Cuando el usuario habilita el almacenamiento masivo por USB para compartir archivos con una computadora o desactiva la tarjeta SD mediante la configuración del sistema, el almacenamiento externo se desactiva en el dispositivo y todas las aplicaciones que se ejecutan desde el almacenamiento externo se interrumpen de inmediato.

Retrocompatibilidad

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

Para permitir la instalación en el almacenamiento externo y que la aplicación aún sea compatible con versiones inferiores al nivel de API 8, haz lo siguiente:

  1. Incluye el atributo android:installLocation con un valor de "auto" o "preferExternal" en el elemento <manifest>.
  2. Deja el atributo android:minSdkVersion tal como está (algo inferior a "8") y asegúrate de que el código de la aplicación solo use API compatibles con ese nivel.
  3. Para compilar tu aplicación, cambia tu objetivo de compilación al nivel de API 8. Esto es necesario porque las bibliotecas más antiguas de Android no comprenden el atributo android:installLocation y no compilarán tu aplicación cuando esté presente.

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

Precaución: 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 el nivel de API 8 mientras tu minSdkVersion sea menor que "8", a menos que realices el trabajo necesario para proporcionar retrocompatibilidad en el código.

Aplicaciones que NO se deben instalar en el almacenamiento externo

Cuando el usuario habilita el almacenamiento masivo por USB para compartir archivos con su computadora (o, de otra manera, desactiva o extrae el almacenamiento externo), se interrumpe cualquier aplicación instalada en el almacenamiento externo que esté en ejecución en ese momento. En efecto, el sistema deja de reconocer la aplicación hasta que se inhabilite el almacenamiento masivo y el almacenamiento externo se vuelva a activar 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 algunos tipos de aplicaciones. Para que la aplicación se comporte con coherencia según lo esperado, no debes permitir que se instale en el almacenamiento externo si utiliza alguna de las siguientes funciones, ya que se podrían presentar las consecuencias mencionadas cuando se desactive el almacenamiento externo:

Servicios
Tu Service en ejecución finaliza y no se reinicia cuando vuelves a activar 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 a tu servicio.
Servicios de alarma
Las alarmas registradas con AlarmManager se cancelarán. Deberás volver a registrar las alarmas de forma manual cuando se vuelva a activar el almacenamiento externo.
Motores del método de entrada
Los motores del método de entrada IME se reemplazarán con los IME predeterminados. Cuando se vuelva a activar el almacenamiento externo, el usuario podrá abrir la configuración del sistema para habilitar los IME nuevamente.
Fondos de pantalla animados
El fondo animado en ejecución se reemplazará por el fondo animado predeterminado. Cuando se vuelva a activar el almacenamiento externo, el usuario podrá seleccionar el fondo animado de nuevo.
Widgets de apps
Los widgets de apps se quitarán de la pantalla principal. Cuando se vuelva a activar 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 (lo que en general, no sucede hasta que se reinicia el sistema).
Administradores de cuentas
Las cuentas creadas con AccountManager desaparecerán hasta que se vuelva a activar el almacenamiento externo.
Adaptadores de sincronización
Tu AbstractThreadedSyncAdapter y todas sus funciones de sincronización no funcionarán hasta que se vuelva a activar el almacenamiento externo.
Administradores de dispositivos
Se inhabilitarán tu DeviceAdminReceiver y todas sus capacidades de administrador, lo que puede tener consecuencias impredecibles para la funcionalidad del dispositivo, que pueden permanecer después de que se vuelva a activar 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 activarse en el dispositivo. Si tu aplicación está instalada en el almacenamiento externo, nunca podrá recibir esta transmisión.

Si la aplicación usa alguna de las funciones mencionadas anteriormente, no debes permitir que se instale 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 debes preocuparte por las aplicaciones existentes. No obstante, si estás seguro de que nunca se debe instalar la aplicación en el almacenamiento externo, debes dejarlo claro declarando android:installLocation con el valor "internalOnly". Aunque esto no cambia el comportamiento predeterminado, indica explícitamente que tu aplicación solo debe instalarse en el almacenamiento interno y sirve como recordatorio para ti y los otros desarrolladores sobre la toma de 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 mayor frecuencia, los juegos de gran tamaño, ya que, en general, no proporcionan servicios adicionales cuando están inactivos. Cuando el almacenamiento externo deja de estar disponible y se interrumpe el proceso de un juego, no se debe producir ningún efecto evidente cuando vuelve a estar disponible y el usuario reinicia el juego (suponiendo que se guardó correctamente el estado del juego durante el ciclo de vida normal de la actividad).

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

Para obtener información adicional relacionada, consulta: <manifest>