A partir de Android N, los dispositivos encendidos pueden iniciarse con un nuevo modo llamado “arranque directo” antes de que el usuario los desbloquee por primera vez. En este modo, la funcionalidad del sistema operativo es completa, pero el acceso a datos privados de aplicaciones es limitado y solo pueden ejecutarse las aplicaciones que se hayan actualizado para reconocer el arranque directo.
¿El arranque directo es adecuado para mi aplicación?
No todas las aplicaciones deben ejecutarse en el modo de arranque directo. Por lo tanto, antes de comenzar a crear código verifica que la tuya responda a los siguientes casos de uso comunes:
- aplicaciones que permiten programar alarmas, como las de despertadores;
- aplicaciones que generan notificaciones importantes y oportunas, como las de mensajería;
- aplicaciones que proporcionan servicios a otras aplicaciones o al sistema, como los servicios de accesibilidad.
Ten en cuenta que esta lista no es completa; esperamos ver otras clases de aplicaciones que puedan resultar beneficiadas por el arranque directo.
Cómo hacer que tu aplicación reconozca el arranque directo
Para que tu aplicación se ejecute antes de que el usuario desbloquee el dispositivo, debes determinar de manera explícita que los componentes reconozcan el arranque directo en el manifiesto:
<activity|provider|receiver|service ...
android:directBootAware=”true”>
Puedes elegir el subconjunto de los componentes de tu aplicación que deben reconocer el arranque directo, pero si usas una clase personalizada Application, se supone que reconoce el arranque directo si se determina que cualquier componente de tu aplicación lo hace.
Para las aplicaciones que deben ejecutarse tan pronto como se inicie el sistema en el modo de arranque directo, existe una nueva difusión
Intent.ACTION_LOCKED_BOOT_COMPLETED. No obstante, todas las aplicaciones recibirán
Intent.ACTION_BOOT_COMPLETED una vez que el usuario desbloquee el dispositivo.
Uso del área de almacenamiento protegida del dispositivo
A fin de admitir la ejecución de aplicaciones antes de que el usuario proporcione las credenciales necesarias para desbloquear datos privados de la aplicación, todos los dispositivos Android N ahora proporcionan dos ubicaciones de almacenamiento para datos:
- Área de almacenamiento protegida mediante credenciales; es la ubicación de almacenamiento predeterminada y está disponible únicamente después de que el usuario desbloquea el dispositivo.
- Área de almacenamiento protegida por el dispositivo; es una nueva ubicación de almacenamiento a la que se puede acceder en todo momento cuando se inicia el dispositivo, incluido el momento en que transcurre el arranque directo.
Los componentes de tu aplicación para los cuales se marcó el reconocimiento de arranque directo deben usar el área de almacenamiento protegida por el dispositivo para los datos que su funcionamiento requiera durante el modo de arranque directo. Pueden, de todos modos, acceder al área de almacenamiento protegida mediante credenciales después de que el usuario desbloquee el dispositivo.
Si deseas acceder al área de almacenamiento protegida por el dispositivo, debes crear y usar un objeto Context para todas las API relacionadas con los archivos:
Context deviceProtectedContext = context.createDeviceProtectedStorageContext();
deviceProtectedContext.openFileInput( ... )
Cuando tu aplicación se actualice a una versión que reconozca el arranque directo, habrá posibilidades de que antes hayas guardado preferencias o bases de datos compartidas que deban migrar al área de almacenamiento protegido por eldispositivo. Debes usar
Context.moveSharedPreferencesFrom() y
Context.moveDatabaseFrom() antes de acceder a ellas para asegurarte de que la aplicación continúe funcionando en forma adecuada, aun cuando los datos se sometan a procesos de copia de respaldo y se restauren de versiones anteriores u otros dispositivos.
Aspectos que deben considerarse
Debes considerar cuidadosamente los elementos que dispondrás en el área de almacenamiento protegido por el dispositivo. Estos deberán comprender un conjunto mínimo de datos que permitirán el funcionamiento de tu aplicación durante el arranque directo. Por ejemplo, en una aplicación de mensajería podrías almacenar un token de acceso de alcance reducido que solo pueda acceder al número de mensajes nuevos de tu servidor. Toda la información confidencial y privada, como el historial de mensajes completo y el token de acceso de lectura y escritura, debe de todas formas guardarse en el área de almacenamiento protegido mediante credenciales.
Otro aspecto que debe recordarse es que, durante el arranque directo, las aplicaciones solo pueden acceder a otras aplicaciones y otros componentes con reconocimiento de arranque directo. Si tu aplicación depende de actividades y servicios externos, asegúrate de manejar correctamente la situación cuando no estén disponibles. De forma predeterminada, los filtros de intenciones solo coincidirán con componentes disponibles en el estado actual del usuario (bloqueado o desbloqueado). Existen dos nuevos marcadores para indicar explícitamente al administrador de paquetes los componentes que deben enumerarse:
PackageManager.MATCH_DIRECT_BOOT_AWARE y PackageManager.MATCH_DIRECT_BOOT_UNAWARE.
Lo que viene
Hasta que se lancen dispositivos con Android N que admitan el arranque directo de forma predeterminada, podrás probar tus aplicaciones con compilaciones de Android N Developer Preview. En Nexus 5X y Nexus 6P, puedes
eliminar todos los datos de usuario y habilitar el modo de arranque directo desde
Settings > Developer options > Convert to file encryption. Como alternativa, puedes reiniciar los dispositivos en bootloader y emitir el comando de inicio rápido:
$ adb reboot-bootloader
$ fastboot --wipe-and-use-fbe
Advertencia: Los dos métodos aplicarán un restablecimiento de fábrica y eliminarán todos los datos de usuario de tu dispositivo.
Opcionalmente, puedes usar un modo de arranque directo emulado. Para habilitarlo, establece un patrón de bloqueo en el dispositivo, selecciona “No thanks” si se solicita una pantalla de arranque seguro al establecer un patrón de bloqueo y, luego, usa los siguientes comandos shell para habilitar y deshabilitar la emulación:
$ adb shell sm set-emulate-fbe true
$ adb shell sm set-emulate-fbe false
Ten en cuenta que el uso de estos comandos hará que se reinicie tu dispositivo. Solo debes usar el modo de arranque directo emulado en dispositivos de prueba, ya que puede ocasionar pérdida de datos.
#BuildBetterApps
Sigue la actividad en la
Colección de patrones de desarrollo de Android para informarte más.