Nota:
- adb dovrebbe già essere configurato su PC.
- Per Android precedenti alla versione 4.4.x, potrebbe essere necessario l'accesso root.
- Alcuni comandi non funzionerebbero su Android precedenti alla versione 5.1.
- Vai alla voce " App per app " se non hai familiarità o ti senti a disagio con la riga di comando e / o la riga di comando non riesce a risolvere il problema.
Modifica: taglia l'inseguimento nella soluzione precedente e segui solo questa sezione modificata.
Installa adb ed esegui questo comando:
adb shell "dumpsys window windows | toybox grep -i system_alert_window"
Otterresti l'output di tutti gli overlay attivi sullo schermo. Esempio di output con DU Screen Recorder, Tasker e AZ Screen Recorder che mostra sovrapposizioni attive sullo schermo:
bash-4.3 # adb shell "finestre della finestra di dumpsys | toybox grep -i system_alert_window"
mOwnerUid = 10087 mShowToOwnerOnly = true package = net.dinglisch.android.tasker appop = SYSTEM_ALERT_WINDOW
mOwnerUid = 10604 mShowToOwnerOnly = true package = com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
mOwnerUid = 10604 mShowToOwnerOnly = true package = com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
mOwnerUid = 10649 mShowToOwnerOnly = true package = com.duapps.recorder appop = SYSTEM_ALERT_WINDOW
mOwnerUid = 10649 mShowToOwnerOnly = true package = com.duapps.recorder appop = SYSTEM_ALERT_WINDOW
mOwnerUid = 10604 mShowToOwnerOnly = true package = com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
mOwnerUid = 10604 mShowToOwnerOnly = true package = com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
mOwnerUid = 10638 mShowToOwnerOnly = pacchetto vero = ninja.sesame.app.edge appop = SYSTEM_ALERT_WINDOW
Il testo evidenziato accanto a package = e prima di appop è il nome del pacchetto (s) dell'app (s) che attualmente disegna la sovrapposizione sullo schermo. Nel tuo caso, l'output incluso il nome del pacchetto sarebbe diverso.
Annotare i nomi dei pacchetti (d'ora in poi PKG) ed eseguire questo comando:
adb shell am force-stop PKG
Sostituire PKG con il nome del pacchetto annotato. Se avevi più nomi di pacchetto, ripeti il comando con un nome di pacchetto alla volta.
Il comando arresterebbe forzatamente l'app e quindi eliminerebbe l'overlay. Questo dovrebbe funzionare. In alternativa puoi rimuovere l'autorizzazione di "Disegna su altre app" (sovrapposizione dello schermo in breve) dalle app usando questo comando:
adb shell appops set PKG SYSTEM_ALERT_WINDOW ignore
Ancora una volta, sostituire PKG con il nome del pacchetto, se necessario. Inoltre, potrebbe essere necessario ripetere il comando di arresto forzato per il PKG. Se si decide di annullare le modifiche, sostituire ignora con consenti nel comando sopra indicato.
In alternativa, è possibile utilizzare Ops app per gestire le autorizzazioni dalla GUI.
Per sapere quale nome del pacchetto corrisponde a quale app è possibile provare un'app open source come Informazioni applicazioni . Cerca per nome del pacchetto e otterrai il nome dell'app.
Modifica terminata
Hai davvero bisogno di non leggere più ora . Lascio intatta la soluzione precedente (ovvero la sezione seguente) perché 21 persone che l'hanno votata l'hanno trovata utile e non voglio più sbagliare.
Un modo semplice sarebbe quello di scoprire tutte le app che hanno il permesso "disegna su altre app" e quindi individuarle da quelle attualmente attive sullo schermo. Successivamente, impegnarsi a fermare forzatamente quelle app comuni fino a quando non si individua l'app responsabile della sovrapposizione attiva.
Enumera le app che dispongono dell'autorizzazione per l'overlay
L'autorizzazione richiesta da un'app per creare un overlay è android.permission.SYSTEM_ALERT_WINDOW
(disegna su altre app).
Dobbiamo scoprire tutte le app installate che dispongono di tale autorizzazione. Sta a te scoprire un metodo per questo. La mia risposta qui può aiutarti.
Tieni presente che abbiamo bisogno dei nomi dei pacchetti delle app e non delle loro etichette.
Cherry-pick da windows attivo
Esegui il comando
adb shell dumpsys window windows
Questo ti darebbe dettagli su qualunque cosa causi la visualizzazione di qualcosa sullo schermo, incluso il nome del componente di un'app che la causa.
Come estrarre il nome dipende da te. Puoi provare questo comando comunque
adb shell 'dumpsys window windows | grep "Window #"'
Se ricevi l'errore: 'grep' non viene riconosciuto come comando interno o esterno , su Windows prova questo comando alternativo:
adb shell "dumpsys window windows | grep 'Window #'"
Uscita demo
Window # 4 Window {42065d50 u0 com.android.phone/com.mediatek.phone.UssdAlertActivity}:
Finestra # 5 finestra {42197468 u0 ginlemon.flowerpro / ginlemon.flower.HomeScreen}:
Window # 6 Window {420fdb58 u0 com.android.systemui.ImageWallpaper}:
Window # 7 Window {421e3b88 u0 com.android.contacts / com.android.contacts.activities.DialtactsActivity}:
Nell'output sopra, tutto ciò che ha successo u0
e precedente /
è il nome del pacchetto di un'app. Un'app può avere più componenti che visualizzano qualcosa sullo schermo.
Devi creare un elenco di quei nomi di pacchetti. Se hai BusyBox installato , puoi farlo
adb shell 'dumpsys window windows | grep "Window #" | sed -e "s/.*u0 //g" -e "s/\/.*//g" -e "s/}://g"'
Ad ogni modo, ora avresti due elenchi:
- Il primo elenco contiene tutte le app che dispongono dell'autorizzazione
android.permission.SYSTEM_ALERT_WINDOW
.
- Il secondo elenco contiene tutte le app che mostrano attivamente qualcosa sullo schermo.
Confronta questi due elenchi e le singole app che sono comuni in entrambi gli elenchi. Questo terzo elenco sarebbe costituito da app che dispongono dell'autorizzazione per disegnare una sovrapposizione e stanno attualmente disegnando una sovrapposizione attiva sullo schermo.
Tempo di uccidere
Uccidi ciascuna delle app della terza lista una per una e osserva lo stato della sovrapposizione. Puoi usare am force-stop PACKAGE_NAME --user 0
o qualsiasi altro metodo adatto a te. PACKAGE_NAME
è il nome del pacchetto dell'app.
EDIT : non è necessario uccidere un'app. Puoi considerare di negare all'app l'autorizzazione a disegnare su altre app. Usa questo comando:
adb shell 'appops set PACKAGE SYSTEM_ALERT_WINDOW deny' # replace PACKAGE with package name of the app
Per ripristinare le modifiche, sostituire deny con allow nel comando indicato ed eseguirlo.
Se utilizzi Android Marshmallow, puoi utilizzare questa risposta di Andrew T.
Nota: il suddetto comando è stato testato con successo su Android 5.1.1 e 6.0.1 (build CM). È anche possibile che il comando funzioni su Android 5.0.x ma non posso garantirlo . L'esecuzione di quel comando sulla versione di Android rilasciata prima di Lollipop causerebbe un errore.
Poiché spesso l'overlay è percepibile, scomparirebbe immediatamente nel momento in cui l'app che lo causa viene ucciso, quindi sapresti quale app sta causando quell'overlay.
App per app
Inizialmente suggerito da Izzy, è possibile utilizzare un'app che ha la funzionalità di elencare le autorizzazioni concesse alle app installate, per individuare le app con l'autorizzazione "disegna su altre app". Puoi cercare tale app da solo o utilizzare l'elenco Controllo autorizzazioni gestito da Izzy sul suo sito Web.
Avresti anche bisogno di un manager processo / app per forzare l'arresto / l'arresto di alcuni processi. Consiglio OS Monitor ma sei libero di usare qualsiasi app competente. Vedi le app correlate in Informazioni di sistema .
Solo a scopo dimostrativo
Ho provato Advanced Permission Manager per elencare le app con il permesso di "disegnare su altre app". Successivamente, sono passato a OS Monitor per vedere le app in esecuzione in primo piano e in background. Ho abbinato l'output di entrambe le app e ho forzato individualmente le app comuni in entrambe. È possibile interrompere un processo dall'interno del monitor del sistema operativo, quindi non è necessario passare alle impostazioni dell'app.
(Clicca sull'immagine per ingrandire)