immuni-app / immuni-app-android

Official repository for the Android version of the immuni application
GNU Affero General Public License v3.0
860 stars 146 forks source link

[BUG] "Notifiche di esposizione non attivate" su Lineage OS + OpenGapps #157

Closed carlidel closed 2 years ago

carlidel commented 4 years ago

Possiedo un Galaxy S5 (klte) con su installato Lineage OS 16.0 e OpenGapps.

Pur avendo l'ultima beta installata dei Play Services, l'applicazione Immuni ritorna il messaggio "Notifiche di esposizione non attivate".

Osservando il log da ADB, risulta che il servizio di Exposure Notification non è proprio attivo, pur avendo la versione 20.21.15 (100308-313409149) dei Play Services installata.

To Reproduce

  1. Seguire il prompt dell'app
  2. Premere il tasto "Consenti"
  3. Compare il banner di fallimento

Expected behaviour

Dovrebbe comparire il banner di attivazione delle Exposure notifications.

ADB logcat

Allego il log di errori che si cattura nel momento in cui premo il tasto "Consenti":

06-02 11:51:09.635  1224  1224 I ExposureNotification: ExposureNotificationChimeraService.onBind [CONTEXT service_id=236 ]
06-02 11:51:09.649  1224  4148 I ExposureNotification: Utils#isSupported enabled=true, isDeviceSupported=true, isBluetoothSupported=false [CONTEXT service_id=236 ]
06-02 11:51:09.661  8946  8946 W System.err: com.google.android.gms.common.api.ApiException: 17: API: Nearby.EXPOSURE_NOTIFICATION_API is not available on this device. Connection failed with: ConnectionResult{statusCode=UNKNOWN_ERROR_CODE(39501), resolution=null, message=null}
06-02 11:51:09.662  8946  8946 W System.err:    at com.google.android.gms.common.internal.ApiExceptionUtil.fromStatus(com.google.android.gms:play-services-base@@17.2.1:4)
06-02 11:51:09.662  8946  8946 W System.err:    at com.google.android.gms.common.api.internal.ApiExceptionMapper.getException(com.google.android.gms:play-services-base@@17.2.1:2)
06-02 11:51:09.662  8946  8946 W System.err:    at com.google.android.gms.common.api.internal.zah.zaa(com.google.android.gms:play-services-base@@17.2.1:18)
06-02 11:51:09.662  8946  8946 W System.err:    at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zaa(com.google.android.gms:play-services-base@@17.2.1:204)
06-02 11:51:09.662  8946  8946 W System.err:    at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zac(com.google.android.gms:play-services-base@@17.2.1:210)
06-02 11:51:09.662  8946  8946 W System.err:    at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zaa(com.google.android.gms:play-services-base@@17.2.1:108)
06-02 11:51:09.662  8946  8946 W System.err:    at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.onConnectionFailed(com.google.android.gms:play-services-base@@17.2.1:75)
06-02 11:51:09.662  8946  8946 W System.err:    at com.google.android.gms.common.internal.zaf.onConnectionFailed(com.google.android.gms:play-services-base@@17.2.1:2)
06-02 11:51:09.662  8946  8946 W System.err:    at com.google.android.gms.common.internal.BaseGmsClient$zzf.zza(com.google.android.gms:play-services-basement@@17.2.1:6)
06-02 11:51:09.662  8946  8946 W System.err:    at com.google.android.gms.common.internal.BaseGmsClient$zza.zza(com.google.android.gms:play-services-basement@@17.2.1:25)
06-02 11:51:09.662  8946  8946 W System.err:    at com.google.android.gms.common.internal.BaseGmsClient$zzc.zzo(com.google.android.gms:play-services-basement@@17.2.1:11)
06-02 11:51:09.662  8946  8946 W System.err:    at com.google.android.gms.common.internal.BaseGmsClient$zzb.handleMessage(com.google.android.gms:play-services-basement@@17.2.1:49)
06-02 11:51:09.662  8946  8946 W System.err:    at android.os.Handler.dispatchMessage(Handler.java:106)
06-02 11:51:09.662  8946  8946 W System.err:    at com.google.android.gms.internal.common.zzi.dispatchMessage(com.google.android.gms:play-services-basement@@17.2.1:8)
06-02 11:51:09.662  8946  8946 W System.err:    at android.os.Looper.loop(Looper.java:193)
06-02 11:51:09.662  8946  8946 W System.err:    at android.os.HandlerThread.run(HandlerThread.java:65)
06-02 11:51:09.691  8946  9017 W Adreno-EGL: <qeglDrvAPI_eglGetConfigAttrib:607>: EGL_BAD_ATTRIBUTE
06-02 11:51:09.692  8946  9017 D vndksupport: Loading /vendor/lib/hw/gralloc.msm8974.so from current namespace instead of sphal namespace.
06-02 11:51:07.188   550   634 W WindowManager: Unable to start animation, surface is null or no children.
06-02 11:51:11.699   550   585 W NotificationService: Toast already killed. pkg=it.ministerodellasalute.immuni callback=android.app.ITransientNotification$Stub$Proxy@3f33f10

Smartphone:

Additional context

Il telefono è "Rootato" con il pacchetto SU, offerto da LineageOS.

Su di un Galaxy S5 con sistema operativo originale, Immuni funziona.

carlidel commented 4 years ago

Penso che sia tutto un problema legato al fatto che il Bluethoot risulta non supportato dal sistema Exposure Notification...

isBluetoothSupported=false

Tuttavia, non so a questo punto cosa fare o a chi rivolgermi per sistemare la cosa. Mi seccherebbe davvero molto dover rinunciare a Lineage.

enricorox commented 4 years ago

Su Moto G 2nd gen con LineageOS 14 funziona, ma l'app viene killata spesso dal sistema e dopo si presenta il tuo stesso problema. Un workaroud è spegnere il bluetooth e premere consenti a bluetooth spento.

carlidel commented 4 years ago

Confermo che spegnendo prima il Bluethoot sono riuscito ad attivarla!

Tuttavia confermo anche che basta altrettanto poco tempo per trovarmi il servizio ucciso in background... vedo se riesco a tracciare il fattore scatenante.

DrSchottky commented 4 years ago

Attenzione che potrebbe essere un falso positivo (dice di essere attivo quando in realtà non lo è). Aspettiamo un feedback dagli sviluppatori Problema descritto su #146

bfabio commented 4 years ago

Attenzione che potrebbe essere un falso positivo (dice di essere attivo quando in realtà non lo è).

Confermo: OnePlus One con LineageOS 16 non si attiva quando Bluetooth è già attivo, il servizio si disattiva quando l'app va in background e sniffando non manda eventi advertising BTLE anche quando segnala che il servizio è attivo.

rawmain commented 4 years ago

Confermo che spegnendo prima il Bluethoot sono riuscito ad attivarla!

Tuttavia confermo anche che basta altrettanto poco tempo per trovarmi il servizio ucciso in background... vedo se riesco a tracciare il fattore scatenante.

Domanda : l'account Google associato è anche enrolled per la Beta dei Play Services e/o altri servizi Google ?

Motivo : riscontrato situazione analoga di anomalie/instabilità entry Notifiche EN in Impostazioni \ Google, indipendentemente dalla release GMS (20.15.16 / 20.18.17) con modulo nearby aggiornato per supporto EN, che era condizionata da questioni relative a KO check EN API dell'account in uso.

Occorsa infatti sia su CM13.0 (usata per test MM6.0.1) che su LOS15.1 e 16.0, utilizzando appunto un account region IT - enrolled beta Play Services, tanto con dispositivi non certificati - whitelisted che certificati.

In tal caso - quando non compariva correttamente l'entry EN nel chk Impostazioni Google - avevo appunto le medesime entry del tuo logcat, che poi sono quelle restituite dall'app frontend in virtù di KO rilevamento del supporto API GAEN.


Resettando & utilizzando account non enrolled beta & con region OK per GAEN (quali CH e IT), non ho avuto problemi di stabilità dell'entry notifiche EN = OK, indipendentemente anche dallo stato Active / Inactive di SU.

Tamponata tale situazione, non ho avuto problemi ON/OFF Bluetooth = sempre configurato le app testate, attivando previamente il Bluetooth da Quick Toogle e la geolocalizzazione in modalità basso consumo (NO GPS).

\ In merito alla questione background ho replicato l'impostazione, che invece applica automaticamente SwissCovid in fase di setup (Apturi Covid ed Immuni p.es. non lo fanno) = ho disabilitato manualmente l'ottimizzazione batteria, vedi immagine.

Screenshot_20200603-030300_Impostazioni - Copia

Non ho applicato ulteriori modifiche (mantenuto Profilo Prestazioni - Bilanciato, che di base imposto come predefinito).

Rilevo correttamente l'advertising BLE (che non è gestito dall'app, bensì dalle API GAEN, come per la gestione TEK/RPI n.d.r.) tanto con l'app frontend chiusa per più di 24h / 144 Intervalli (indipendentemente da quella in test, che al momento ha attivato le API) quanto negli switch tra diverse app frontend (vedasi video switch test ).

carlidel commented 4 years ago

Confesso di non riuscire a comprendere gran parte delle terminologie che usi, quindi non comprendo proprio il meccanismo che hai scoperto, ma ti posso dire che sul mio telefono è registrato il mio account Google italiano, e che l'unica beta alla quale sono iscritto è quella dei Play Services.

DrSchottky commented 4 years ago

@rawmain pure io ho riscontrato il problema di isBluetoothSupported=false Account con region IT, non mi risulta sia attualmente nel beta dei ps (lo è stato nei giorni scorsi però). Account condiviso su dispositivi multipli. Notato anche io una forte instabilità della cosa: a volte parte senza errori ma non emette, a volte diche che non sono attivate, l'opzione delle notifiche nei settaggi Google va e viene.

rawmain commented 4 years ago

@DrSchottky e @carlidel rispondo in un unico (lungo) messaggio.

In fase di impostazione l'app effettua prima i controlli di Enabled/Accesso per le ExposureNotifications API, cioè verifica se il servizio sia impostato in Impostazioni \ Google e se risponda OK il guard a cui è associato il placeholder (la scheda/pagina che si vede dopo aver cliccato su 'Notifiche di esposizione al COVID-19').

Finché non completa OK tale controlli, non aggiorna il controllo del supporto Bluetooth BLE, che è preimpostato false

public final boolean isBluetoothSupported(@org.jetbrains.annotations.NotNull()
    android.content.Context context) {
        return false;
    }

\ Nel logcat di @carlidel si vede OK 1° passaggio con KO 2° nel controllo Enabled per le ExposureNotifications API ed errore di connessione EN 39501 (restituito dal guard di autorizzazione/accesso API).

06-02 11:51:09.635  1224  1224 I ExposureNotification: ExposureNotificationChimeraService.onBind [CONTEXT service_id=236 ]
06-02 11:51:09.649  1224  4148 I ExposureNotification: Utils#isSupported enabled=true, isDeviceSupported=true, isBluetoothSupported=false [CONTEXT service_id=236 ]
06-02 11:51:09.661  8946  8946 W System.err: com.google.android.gms.common.api.ApiException: 17: API: Nearby.EXPOSURE_NOTIFICATION_API is not available on this device. Connection failed with: ConnectionResult{statusCode=UNKNOWN_ERROR_CODE(39501), resolution=null, message=null}

Se fosse fallito infatti già il 1° (servizio assente), avrebbe avuto invece p.es. questo tipo di log con diverso codice di errore connessione API 3950x :

06-03 12:55:32.994   856   856 I ExposureNotification: ExposureNotificationService created [CONTEXT service_id=236 ]
06-03 12:55:32.995   856   856 I ExposureNotification: ExposureNotificationChimeraService.onBind [CONTEXT service_id=236 ]
06-03 12:55:32.997   856   871 I ExposureNotification: Exposure notifications disabled. [CONTEXT service_id=236 ]
06-03 12:55:33.003  3289  3289 W System.err: com.google.android.gms.common.api.ApiException: 17: API: Nearby.EXPOSURE_NOTIFICATION_API is not available on this device. Connection failed with: ConnectionResult{statusCode=UNKNOWN_ERROR_CODE(39503), resolution=null, message=null}

Usando release ufficiali (quali appunto quelle pubblicate sul Play Store) ho rilevato l'errore 39501 associato ad anomalie/instabilità di comparsa del servizio Notifiche in 2 casi principali :


Un flusso di verifica/fix potrebbe essere quindi il seguente :

Passaggio A1

Se quest'ultima verifica è OK, si procede con il successivo A2, altrimenti si salta a B


Passaggio A2

Se l'attivazione di Apturi non ha restituito errori di accesso alle notifiche, si procede con il successivo A3, altrimenti si salta a B


Passaggio A3

Se non si riscontrano problemi nell'autorizzazione notifiche, si procede, altrimenti si salta a B.

Se anche il controllo di trasmissione dei beacon BLE è OK, è finita qui, altrimenti si passa a B


Passaggio B - Solo in caso di KO dei passaggi precedenti

Qualora compaia già, potete verificare con attivazione Bluetooth e passi successivi passaggio A1, per poi procedere (a scelta) con A2->A3 o direttamente con A3.

Nel caso non compaia il servizio, occorre attendere. Comunque di base - alla peggio compare entro le 24h.


Sorry per il papiro. Fateci sapere.

DrSchottky commented 4 years ago

@rawmain mi fermo ad A1, non ho nulla riguardo alle notifiche in Impostazioni\Google. Proverò ad attendere ulteriormente, ma era in quello stato già da ieri. Non so se l'abilitazione della funzionalità sia a device o ad account, perché con lo stesso sono loggato su un altro telefono sul quale funziona tutto.

UPDATE: ad un certo punto su tutti e tre i telefoni sono comparsi settaggi delle notifiche. Ne prendo uno, scarico Apturi, parte e funziona. la killo e provo a riavviarla: non parte. Dal settaggi Google è sparita (solo su quel telefono) di nuovo la voce relative alle notifiche. Scaricato immuni e ritorna errore 39501. Riavviando non cambia nulla

Prendo altro telefono, skippo lo step Apturi e vado direttamente con Immuni. Stessa cosa: parte la prima volta, killo e non riesce a ripartire. Settaggi notifiche spariti anche qui.

In tutto questo nessuna emissione, durante i test ho tenuto monitorato il traffico BLE da wireshark e non ho visto nulla passare. Good job, Google 😞

rawmain commented 4 years ago

UPDATE: ad un certo punto su tutti e tre i telefoni sono comparsi settaggi delle notifiche. Ne prendo uno, scarico Apturi, parte e funziona. la killo e provo a riavviarla: non parte. Dal settaggi Google è sparita (solo su quel telefono) di nuovo la voce relative alle notifiche. Scaricato immuni e ritorna errore 39501. Riavviando non cambia nulla

Prendo altro telefono, skippo lo step Apturi e vado direttamente con Immuni. Stessa cosa: parte la prima volta, killo e non riesce a ripartire. Settaggi notifiche spariti anche qui.

In tutto questo nessuna emissione, durante i test ho tenuto monitorato il traffico BLE da wireshark e non ho visto nulla passare.

Grazie intanto per l'update (utile tanto per altri utenti quanto per il team di sviluppo).

Queste situazioni di errori anomali, con il servizio Notifiche EN, che appare/scompare, sono infatti questioni indipendenti dalle app frontend nazionali.

Dipendono appunto da problemi di KO autorizzazione lato API per user / per device, come confermano anche riscontri simili nelle issue dell'app Svizzera (ved. issue SwissCovid #51).

Dato che sono le API (non le app) a gestire sia i codici TEK/RPI (ID) che l'advertising BLE Bluetooth, in presenza di situazioni anomale non funziona niente,

DrSchottky commented 4 years ago

Ho fatto qualche prova al volo e su tutti e tre i dispositivi ho il metodo [isMultipleAdvertisementSupported()](https://developer.android.com/reference/android/bluetooth/BluetoothAdapter#isMultipleAdvertisementSupported()) ritorna false, sebbene con uno dei tre, in modo un po' limitato, riesca comunque a fare advertising con l'app della Nordic. Leggo che è un modo un po' controverso (specie su hw datati) per determinare le funzionalità di advertising.

Allego informazioni HW dei 3 device, nei prossimi giorni cercherò di reperire HW un po' più recente da testare lg moto samsung

carlidel commented 4 years ago

Mi scuso se non mi sono fatto più vivo... solo ieri notte ho avuto tempo di tentare un reset totale del mio dispositivo anche per seguire le procedure indicate da @rawmain

La buona notizia è che il sistema tutto adesso pare funzionare! La app resta stabile e mi è pure comparso il banner EN tra le voci di impostazione account Google (ma se sapete istruirmi su come analizzare il flusso BLE per verificare la cosa, tanto meglio).

La cattiva notizia è che non so bene dire quale elemento in particolare ha messo a posto le cose. Mi sono limitato ad aggiornare il mio telefono all'ultima build di Lineage OS compatibile e a riflashare le OpenGapps, aggiornandole poi all'ultima versione non-beta.

Tuttavia, anche portando i Play Services di nuovo alla versione beta, non ho più riscontrato il bug. È probabile che sia anche tutto grazie all'ultimo update di Immuni, purtroppo non sono abbastanza navigato per riuscire a capire che cosa ha fatto funzionare le cose.

rawmain commented 4 years ago

Ho fatto qualche prova al volo e su tutti e tre i dispositivi ho il metodo [isMultipleAdvertisementSupported()](https://developer.android.com/reference/android/bluetooth/BluetoothAdapter#isMultipleAdvertisementSupported()) ritorna false, sebbene con uno dei tre, in modo un po' limitato, riesca comunque a fare advertising con l'app della Nordic. Leggo che è un modo un po' controverso (specie su hw datati) per determinare le funzionalità di advertising.

Allego informazioni HW dei 3 device, nei prossimi giorni cercherò di reperire HW un po' più recente da testare

Per i test GAEN ho infatti escluso a priori i terminali con commercializzazione precedente a 5 anni fa, onde restare comunque entro le raccomandazioni Apple+Google & minimizzare le limitazioni di supporto BLE lato dispositivi.

Questa è la situazione rilevata da nRF con il dispositivo più vecchio (2015) del lotto nei test GAEN con custom rom base CM/LOS a bordo. Per ora sta rispondendo bene nelle verifiche ristrette (5 altri device con API GAEN attive entro un raggio < 10 metri).

Screenshot_20200604-002410

Screenshot_20200604-002242_nRF_Connect

DrSchottky commented 4 years ago

@rawmain ho trovato un pattern abbasatnza ricorrente tra i device problematici Più che età del device è questione di ROM, anche i Huawei tutto sommato recenti ne soffrono.

rawmain commented 4 years ago

La buona notizia è che il sistema tutto adesso pare funzionare! La app resta stabile e mi è pure comparso il banner EN tra le voci di impostazione account Google (ma se sapete istruirmi su come analizzare il flusso BLE per verificare la cosa, tanto meglio).

Grazie per feedback/update.

Per quanto riguarda le verifiche di corretta trasmissione, è sufficiente usare un dispositivo con Bluetooth + software per scansione/rilevamento dei beacon BLE. Da computer si può usare Wireshark, ma vanno bene anche programmi più semplici senza funzioni avanzate per sniffare il traffico.

Da altro dispositivo Android puoi usare l'app nRF Connect o Bluetooth LE Scanner. Io per i test veloci di advertising BLE (controllo rilevamenti immediati/prolungati e verifica rotazioni BT MAC + RPI) utilizzo uno molto semplice, che filtra direttamente gli UUID 0xFD6F utilizzati dai beacon BLE delle API GAEN - Link .

IMG_20200604_145045

rawmain commented 4 years ago

@rawmain ho trovato un pattern abbasatnza ricorrente tra i device problematici Più che età del device è questione di ROM, anche i Huawei tutto sommato recenti ne soffrono.

Sin dai primissimi test con le app di tracing BT/BLE (quindi non solo API GAEN), ho sempre verificato/mantenuto le seguenti impostazioni nei test-device, indipendentemente che fossero con firmware stock o custom ROM :

Alcune issue segnalate & riscontrate con le build pubblicate Play Store 1.0.0 e 1.0.1 (come peraltro con altre soluzioni di tracing BT/BLE) dipendono proprio dall'abbinamento tra l'assenza di richiesta/implementazione di tali impostazioni in fase di configurazione app & le policy di gestione app dei diversi firmware (vendor stock e non).

Infatti, agendo manualmente sulle impostazioni, non ho riscontrato problemi di stop advertising in background con la build 1.0.0 ufficiale nemmeno sui 2 dispositivi con EMUI/HMS + GMS nel parco test (Huawei Nova 5T e P30). Non li ho testati con la 1.0.1 ufficiale, visto che sono stati esclusi nel controllo JSON per il download dal Play Store, ma non vi sarebbero state differenze.

resoli commented 4 years ago

Ringrazio tutti i partecipanti a questo thread per le informazioni.

Lascio qui un commento perchè mi sembra pertinente. Sto provando Immuni su dispositivo BQ Aquaris E4.5, (se non erro la certificazione per le emissioni risale a Maggio 2014). Nonostante il dispositvo non sia mai stato aggiornato ad Android 6.0, sono riuscito a compilare ed installare una versione custom di LineageOS 14.1 (corrispondente ad Android 7.1.2), completandolo con le pico gapps in modo da poter avere GAEN a bordo. Sia le EN dai PlayServices che Immuni si attivano senza problemi, ma a quanto pare il dispositivo non genera gli advertising GAEN (ho controllato con GAEN detector). In effetti nRF lo indica come non supportato:

krillin-ble

Anche logcat conferma:

09-14 14:05:13.343   998  2758 I ExposureNotification: Generating advertisement with version=80, tx=-24 [CONTEXT service_id=236 ]
09-14 14:05:13.348   998  2758 E BluetoothAdapter: Bluetooth LE advertising not supported
09-14 14:05:13.349   998  2758 W ExposureNotification: Advertising not supported, error code=ERROR_BLUETOOTH_NOT_SUPPORTED [CONTEXT service_id=236 ]

Possibile che un dispositivo incapace di generare advertising possa non innescare alcun avviso evidente all'utente, sia a livello di Play Services che di applicativo client?

stale[bot] commented 2 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.