Blog

bt_bb_section_bottom_section_coverage_image

Scansione dei Beacon BLE in Background su Android

Scansione dei Beacon BLE in Background su Android

La scansione dei beacon Bluetooth Low Energy (BLE) in background è fondamentale per le app che offrono funzionalità basate sulla prossimità, come la navigazione indoor, il marketing di prossimità e il tracciamento degli asset. Tuttavia, Android, nel tentativo di ottimizzare la durata della batteria, ha introdotto nel tempo diverse restrizioni alla capacità delle app di eseguire attività in background. Queste restrizioni rendono la scansione continua dei beacon in background una sfida significativa per gli sviluppatori Android.

Limitazioni dei Servizi in Background

Prima di Android 8.0 (API livello 26), gli sviluppatori potevano utilizzare i Servizi Android per eseguire attività in background, inclusa la scansione dei beacon.

Tuttavia, a partire da Android 8.0, Google ha introdotto i Background Execution Limits, limitando la frequenza con cui una app può recuperare la posizione corrente dell’utente mentre è in esecuzione in background [1][2]. Le app possono ricevere aggiornamenti sulla posizione solo poche volte ogni ora. Questa limitazione si applica a tutte le app utilizzate su dispositivi con Android 8.0 o versioni successive, indipendentemente dalla versione SDK di destinazione dell’app [1]. Android 8.0 ha introdotto i Foreground Service come un modo per le app di eseguire attività in background a tempo indeterminato, ma con l’obbligo di mostrare una notifica persistente all’utente2. Inoltre, le app devono dichiarare i permessi ACCESS_FINE_LOCATION o ACCESS_COARSE_LOCATION per la scansione BLE, e a partire da Android 10, anche ACCESS_BACKGROUND_LOCATION per la scansione in background.

Android 12 (API livello 31) ha introdotto ulteriori restrizioni che riguardano la gestione delle risorse in background, con un focus specifico sulla privacy e la gestione del consumo energetico [3]. Le novità più rilevanti in relazione alla scansione BLE sono:

  • Ulteriori restrizioni sui permessi di localizzazione: con Android 12, le applicazioni devono ottenere un ulteriore consenso esplicito dell’utente prima di accedere ai dati di localizzazione in background. Se un’app richiede il permesso per la localizzazione in background, l’utente può scegliere se consentire o meno l’accesso in base alle sue preferenze.
  • Limitazioni alla frequenza delle scansioni BLE: Android 12 impone una riduzione della frequenza di scansione dei beacon BLE in background, limitando quanto spesso le applicazioni possano eseguire operazioni di scansione in background per evitare un eccessivo consumo della batteria.

Le Soluzioni

Nonostante le limitazioni imposte da Android, esistono diverse soluzioni alternative per la scansione dei beacon in background:

Utilizzo del Geofencing: il Geofencing API di Android consente alle app di essere notificate quando il dispositivo entra o esce da un’area geografica predefinita [4]. Questa funzionalità può essere utilizzata per attivare la scansione dei beacon solo quando il dispositivo si trova in prossimità di un’area di interesse, riducendo il consumo energetico.

Scansione periodica con WorkManager: WorkManager è un’API di Android che consente di pianificare l’esecuzione di attività in background in modo efficiente dal punto di vista energetico [5]. È possibile utilizzare WorkManager per pianificare la scansione dei beacon a intervalli regolari, anche quando l’app non è in primo piano. Tuttavia, WorkManager non è adatto per le app che richiedono la scansione continua e in tempo reale.

Utilizzo di un BroadcastReceiver e Thread: una interessante soluzione alternativa è proposta da D. Young in [6], dove l’autore offre una approfondita analisi sull’evoluzione degli Android Services che, con le restrizioni introdotte con Android 8 e 12, sono diventati sempre più complessi e limitati per eseguire codice in background. L’autore propone un’alternativa, utilizzando BroadcastReceiver e thread, per eseguire attività di scansione di beacon BLE in background senza usare Android Foreground Service (e quindi, senza incorrere nelle restrizioni dei servizi), offrendo maggiore libertà e flessibilità allo sviluppatore (nell’articolo viene fornito anche il codice di una app di riferimento [7]). Questo approccio offre maggiore flessibilità rispetto ad altre soluzioni, ma richiede una gestione più accurata del ciclo di vita dell’app e del consumo energetico. Il sistema operativo concede solo 10 secondi per uscire dal metodo onReceive del BroadcastReceiver prima di terminare l’app. L’esecuzione di un nuovo thread all’interno del metodo onReceive consente l’esecuzione di codice a tempo indeterminato. Tuttavia, il sistema operativo potrebbe comunque sospendere l’esecuzione del codice durante i periodi di deep sleep e l’app potrebbe essere terminata a causa di memoria insufficiente o da task killer di terze parti.

Qualora gli approcci sopra esposti non diano i risultati richiesti, la soluzione definitiva, se compatibile con le esigenze applicative, è quella di portare la app in primo piano [1]: quando un’app è in primo piano, il comportamento di aggiornamento della posizione è lo stesso di Android 7.1.1 (API livello 25) e versioni precedenti. Tuttavia, se un’app recupera gli aggiornamenti della posizione quasi in tempo reale per un lungo periodo di tempo, la durata della batteria del dispositivo si riduce in modo significativo.

Criticità e Considerazioni

È importante notare che tutte le soluzioni alternative presentano delle criticità. Ad esempio, l’utilizzo del Geofencing può comportare un consumo energetico significativo se l’area geografica monitorata è troppo ampia. La scansione periodica con WorkManager potrebbe non è adatta per le app che richiedono una scansione continua e in tempo reale. L’approccio con BroadcastReceiver e thread, sebbene flessibile, richiede una gestione accurata del ciclo di vita dell’app per evitare di essere terminata dal sistema operativo.

Inoltre, è fondamentale testare a fondo l’implementazione della scansione dei beacon BLE in background su diversi dispositivi e versioni di Android per garantire un comportamento affidabile e un consumo energetico ottimizzato.

Conclusioni

La scansione dei beacon BLE in background su Android è una sfida complessa a causa delle restrizioni imposte dal sistema operativo. Tuttavia, esistono diverse soluzioni alternative che gli sviluppatori possono adottare per ottenere il comportamento desiderato. La scelta della soluzione più adatta dipende dai requisiti specifici dell’app e dalle limitazioni delle diverse tecniche disponibili. È importante valutare attentamente le criticità e testare a fondo l’implementazione per garantire un’esperienza utente ottimale e un consumo energetico accettabile.

Riferimenti

[1] https://developer.android.com/about/versions/oreo/background

[2] https://developer.android.com/about/versions/oreo/background-location-limits

[3] https://developer.android.com/about/versions/12

[4] https://developer.android.com/develop/sensors-and-location/location/geofencing

[5] https://developer.android.com/develop/background-work/background-tasks/persistent/getting-started

[6] http://www.davidgyoungtech.com/2022/06/25/the-rise-and-fall-of-the-foreground-service

[7] https://github.com/davidgyoung/Serviceless