Nota:
- O adb já deve estar configurado no PC.
- Para Android anterior à versão 4.4.x, pode ser necessário acesso root.
- Alguns comandos não funcionariam no Android anterior à versão 5.1.
- Vá para o título " Aplicativos para aplicativos " se você não estiver familiarizado ou desconfortável com a linha de comando e / ou se a linha de comando não resolver o problema.
Editar: reduza a busca na solução anterior e siga apenas esta seção editada.
Configure adb e execute este comando:
adb shell "dumpsys window windows | toybox grep -i system_alert_window"
Você obteria a saída de todas as sobreposições ativas na tela. Exemplo de uma saída com o DU Screen Recorder, Tasker e AZ Screen Recorder mostrando sobreposições ativas na tela:
bash-4.3 # adb shell "janelas da janela do dumpsys | toybox grep -i system_alert_window"
mOwnerUid = 10087 mShowToOwnerOnly = pacote verdadeiro = net.dinglisch.android.tasker appop = SYSTEM_ALERT_WINDOW
mOwnerUid = 10604 mShowToOwnerOnly = true pacote = com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
mOwnerUid = 10604 mShowToOwnerOnly = true pacote = com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
mOwnerUid = 10649 mShowToOwnerOnly = pacote verdadeiro = com.duapps.recorder appop = SYSTEM_ALERT_WINDOW
mOwnerUid = 10649 mShowToOwnerOnly = pacote verdadeiro = com.duapps.recorder appop = SYSTEM_ALERT_WINDOW
mOwnerUid = 10604 mShowToOwnerOnly = true pacote = com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
mOwnerUid = 10604 mShowToOwnerOnly = true pacote = com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
mOwnerUid = 10638 mShowToOwnerOnly = pacote verdadeiro = ninja.sesame.app.edge appop = SYSTEM_ALERT_WINDOW
O texto destacado ao lado de package = e antes do appop é o (s) nome (s) do pacote do (s) aplicativo (s) atualmente desenhando sobreposição na tela. No seu caso, a saída, incluindo os nomes dos pacotes, será diferente.
Anote os nomes dos pacotes (doravante denominados PKG) e execute este comando:
adb shell am force-stop PKG
Substitua PKG pelo nome do pacote que você anotou. Se você tiver vários nomes de pacotes, repita o comando com um nome de pacote por vez.
O comando interromperia o aplicativo com força e descartaria a sobreposição. Isso deve funcionar. Como alternativa, você pode retirar a permissão de "Desenhar sobre outros aplicativos" (sobreposição de tela em resumo) dos aplicativos usando este comando:
adb shell appops set PKG SYSTEM_ALERT_WINDOW ignore
Mais uma vez, substitua PKG pelo nome do pacote, conforme necessário. Além disso, pode ser necessário repetir o comando force-stop para o PKG. Se você decidir reverter as alterações, substitua ignorar por permitir no comando acima mencionado.
Como alternativa, você pode usar o App Ops para gerenciar as permissões da GUI.
Para saber qual nome do pacote corresponde a qual aplicativo, você pode tentar um aplicativo de código aberto, como Informações sobre aplicativos . Pesquise pelo nome do pacote e você obterá o nome do aplicativo.
Edição concluída
Você realmente não precisa mais ler agora . Estou deixando a solução anterior (ou seja, a seção a seguir) intacta, porque 21 pessoas que votaram acharam isso útil e eu não quero mais estragar tudo.
Uma maneira simples seria descobrir todos os aplicativos com a permissão "desenhar sobre outros aplicativos" e depois selecioná-los dentre os que estão atualmente ativos na tela. Posteriormente, envolva a interrupção forçada desses aplicativos comuns até apontar o aplicativo responsável pela sobreposição ativa.
Enumerar aplicativos com permissão para sobreposição
A permissão exigida por um aplicativo para criar uma sobreposição é android.permission.SYSTEM_ALERT_WINDOW
(desenhar sobre outros aplicativos).
Precisamos descobrir todos os aplicativos instalados com a referida permissão. Cabe a você descobrir um método para isso. Minha resposta aqui pode ajudá-lo.
Observe que precisamos dos nomes dos pacotes dos aplicativos e não de seus rótulos.
Escolha cereja nas janelas ativas
Execute o comando
adb shell dumpsys window windows
Isso fornecerá detalhes sobre o que está causando a exibição de algo na tela, incluindo o nome do componente de um aplicativo que está causando o problema.
A decisão de como você extrairia o nome é sua. Você pode tentar este comando no entanto
adb shell 'dumpsys window windows | grep "Window #"'
Se você receber o erro: 'grep' não é reconhecido como um comando interno ou externo , no Windows, tente este comando alternativo:
adb shell "dumpsys window windows | grep 'Window #'"
Saída de demonstração
Janela nº 4 Janela {42065d50 u0 com.android.phone/com.mediatek.phone.UssdAlertActivity}:
Janela nº 5 Janela {42197468 u0 ginlemon.flowerpro / ginlemon.flower.HomeScreen}:
Janela nº 6 Janela {420fdb58 u0 com.android.systemui.ImageWallpaper}:
Janela nº 7 Janela {421e3b88 u0 com.android.contacts / com.android.contacts.activities.DialtactsActivity}:
Na saída acima, qualquer coisa com êxito u0
e precedente /
é o nome do pacote de um aplicativo. Um aplicativo pode ter vários componentes exibindo algo na tela.
Você deve criar uma lista desses nomes de pacotes. Se você tiver o BusyBox instalado , poderá fazer
adb shell 'dumpsys window windows | grep "Window #" | sed -e "s/.*u0 //g" -e "s/\/.*//g" -e "s/}://g"'
De qualquer forma, agora você teria duas listas:
- Primeira lista contém todos os aplicativos com permissão
android.permission.SYSTEM_ALERT_WINDOW
.
- A segunda lista contém todos os aplicativos que exibem ativamente algo na tela.
Compare essas duas listas e selecione aplicativos comuns em ambas as listas. Essa terceira lista constituiria aplicativos com permissão para desenhar sobreposições e atualmente está desenhando uma sobreposição ativa na tela.
Hora de matar
Mate cada um dos aplicativos da terceira lista, um por um, e observe o estado da sobreposição. Você pode usar am force-stop PACKAGE_NAME --user 0
ou qualquer outro método que melhor lhe convier. PACKAGE_NAME
é o nome do pacote do aplicativo.
EDIT : Não é necessário matar um aplicativo. Você pode negar ao aplicativo a permissão para passar por cima de outros aplicativos. Use este comando:
adb shell 'appops set PACKAGE SYSTEM_ALERT_WINDOW deny' # replace PACKAGE with package name of the app
Para reverter as alterações, substitua deny por allow no referido comando e execute-o.
Se você estiver executando o Android Marshmallow, esta resposta de Andrew T. pode ser usada.
Nota: O comando acima mencionado foi testado com sucesso no Android 5.1.1 e 6.0.1 (compilações do CM). Também é possível que o comando funcione no Android 5.0.x, mas não posso garantir . A execução desse comando na versão Android lançada antes do Lollipop causaria falha.
Como muitas vezes a sobreposição é perceptível, ela desaparece instantaneamente no momento em que o aplicativo que o causa é eliminado; portanto, você saberia qual aplicativo estava causando essa sobreposição.
Aplicativos para aplicativos
Originalmente sugerido por Izzy, você pode usar um aplicativo com a funcionalidade de listar permissões concedidas aos aplicativos instalados, para destacar os aplicativos com a permissão "desenhar sobre outros aplicativos". Você pode pesquisar esse aplicativo por conta própria ou usar o verificador de permissão da lista mantido por Izzy em seu site.
Você também precisaria de um gerente de processo / aplicativo para forçar / interromper / matar alguns processos. Eu recomendo o OS Monitor, mas você tem a liberdade de usar qualquer aplicativo competente. Veja aplicativos relacionados em Informações do sistema .
Apenas para fins de demonstração
Tentei o Advanced Permission Manager para listar aplicativos com permissão para "desenhar sobre outros aplicativos". Depois, mudei para o OS Monitor para ver os aplicativos sendo executados em primeiro e segundo plano. Combinei a saída dos dois aplicativos e parei individualmente os aplicativos comuns em ambos. Você pode interromper um processo de dentro do Monitor do SO, portanto, não é necessário alternar para as configurações do aplicativo.
(Clique na imagem para ampliar)