Por que os aplicativos desativados ainda estão em execução?

8

Percebi que aplicativos (como o Google Contacts Sync) que foram desativados usando o gerenciador de aplicativos Android (KitKat) ainda aparecem como em execução ao usar as ferramentas do observador de processos. Isso é verdade mesmo após a reinicialização do dispositivo.

Por que os aplicativos desativados ainda estão em execução? Existe uma maneira eficaz (e segura) de realmente desabilitá-los?

Soluções que requerem privilégios de root são aceitáveis.

(Observe que, no exemplo específico acima, você pode dizer ao Android para não sincronizar seus contatos, mas ele ainda executa o processo de sincronização de contatos do Google. Mas não vamos nos debruçar sobre esse exemplo ... é apenas um exemplo.)

RockPaperLizard
fonte
Bem ao lado do botão "Desativar" está o botão "Forçar parada". Pressione e o processo deve terminar e não iniciar mais.
GiantTree
@GiantTree Thanks. Após uma reinicialização, ele não será iniciado novamente?
RockPaperLizard
4
No seu caso, sim, porque um aplicativo do sistema chamou explicitamente um serviço exportado desse pacote e a única maneira de eliminar esse processo com segurança (e qualquer outro) é matando-o ativamente usando o Greenify, o Amplify (requer Xposed) ou aplicativos semelhantes. Nota: isso não deve acontecer e deve ser considerado um bug, porque o PackageManager tem a tarefa de não permitir que um aplicativo desativado seja executado.
GiantTree
11
Bem, a esse respeito, desabilitei todos os serviços, receptores, atividades e provedores de conteúdo, bem como o aplicativo SystemUI. Reinicie o dispositivo e adivinhe o que o aplicativo ainda foi carregado na memória (como não é o caso da pm block/hide), o que me faz pensar no que está causando o carregamento do aplicativo agora. Outra questão é que, enquanto estava carregado na memória, é possível observar sua ausência superficial por falta de plano de fundo, temas, barra de status e muito mais. Talvez uma nova questão possa ser elaborada a partir disso.
Firelord
11
@Firelord Acho que foi o que mencionei acima: se você desabilitar um aplicativo, ele será "marcado como desabilitado" (e não será exibido no iniciador, etc.) - mas ainda será registrado no sistema (gerenciador de pacotes), para que outros aplicativos possam encontrá-lo e chame suas intenções. Parece que ocultar / bloquear é bastante comparável a uma "desinstalação que deixa os .apkdados para trás" - para que o aplicativo fique "completamente não registrado e invisível para tudo, exceto o gerenciador de arquivos", para que outros aplicativos não possam mais chamar suas intenções da maneira que puderem encontre-os.
Izzy

Respostas:

7

Seu Android não precisa ter acesso root para desativar verdadeiramente um aplicativo, se você tiver a versão 4.4.x ou superior. Tudo o que você precisa éconfiguração na depuração de PC e USB ativada em um dispositivo não enraizado ou em um aplicativo de emulador de terminal para um dispositivo enraizado (você também pode usar adb).

Se você verificar o uso do Package Manger ( pm), verá

bloco pm [--user USER_ID] PACKAGE_OR_COMPONENT ")
pm desbloquear [--user USER_ID] PACKAGE_OR_COMPONENT ")

Para o Lollipop, seria

pm hide [--user USER_ID] PACKAGE_OR_COMPONENT ")
pm exibir [- usuário USER_ID] PACKAGE_OR_COMPONENT ")

Para bloquear ou ocultar um pacote (é seguro), basta

pm block PACKAGE # for KitKat
pm hide PACKAGE  # for Lollipop

Para desbloquear ou reexibir o pacote, faça

pm unblock PACKAGE #for KitKat 
pm unhide PACKAGE  # for Lollipop

PACKAGE→ nome do pacote de um aplicativo. Para saber o nome do pacote de um aplicativo:

Anexe o adb shellcomando before very para executá-los no PC.

A função por trás do hide tem o seguinte comentário dentro do código-fonte

Coloca o pacote em um estado oculto, que é quase como um estado desinstalado, tornando o pacote indisponível, mas não remove os dados ou o arquivo do pacote real. O aplicativo pode ser oculto, redefinindo o estado oculto ou instalando-o

Comentários semelhantes são feitos para o bloco aqui .

Para verificar a reivindicação, você pode usar alguns serviços do sistema, como meminfo, procstatse activityusando a ferramenta dumpsys , ou mesmo listar todos os processos usando ps. Você não encontrará uma presença ativa do aplicativo bloqueado / oculto.

O mesmo vale para muitos aplicativos do sistema desabilitados usando a GUI ou pm disablenão para todos os aplicativos, pois mesmo um aplicativo desabilitado pode receber transmissões pelas quais se registrou, o que só pode ser feito se for carregado na memória 1 . No entanto, um aplicativo desativado não pode agir por conta própria, nem pode ser executado por qualquer outro aplicativo.

Argumentei algumas das diferenças entre ocultar / bloquear e desativar na minha pergunta pm hide VS pm disable - a crise de identidade . Ele fornece apenas informações suplementares a esta resposta para que você possa ignorá-la.

EDITAR:

Parece que a técnica não funciona para todos os aplicativos no Android KitKat. Nesse caso, simplesmente revogue a permissão de leitura do APK do aplicativo ou remova a extensão .APK do nome do arquivo do aplicativo (sugerido por Jaskaranbir uma vez), seguido por uma reinicialização suave / completa. É o mesmo que excluir um aplicativo do sistema, com a única diferença de que todos os arquivos permaneceriam em seu lugar.

Ambas as etapas podem ser executadas usando qualquer aplicativo gerenciador de arquivos raiz. O caminho da linha de comando é:

adb shell su -c 'chmod 000 /data/app/PACKAGE*'             # 000 means no read-write-executable permission to user,group and others. 
adb shell su -c 'mv /data/app/PACKAGE* /data/app/PACKAGE'  # doing renaming by moving the file
adb reboot

1: Falta de evidência técnica para apoiar o fato

Senhor do Fogo
fonte
Ótima resposta! Obrigado! É melhor primeiro desativar o aplicativo usando o gerenciador de aplicativos Android padrão ou o melhor é garantir que ele não esteja desativado lá?
RockPaperLizard
Não há necessidade de desativar o aplicativo se você optar por pm block/hidedeixá-lo intocado.
Firelord
Se já estiver desativado, é melhor reativá-lo?
RockPaperLizard
11
Isso é bizarro. Eu testei o systemui de bloqueio no meu Kitkat e, para minha surpresa, o bloco está funcionando como desabilitado, esse aplicativo permanece na memória. O processo SystemUI foi bifurcado, mesmo que eu o matasse. Não sei se é um bug ou um comportamento desejado, mas, em qualquer caso, isso contrasta com as minhas descobertas relacionadas ao pirulito indicadas na resposta. Eu acho que a resposta é bastante inútil agora.
Firelord
11
@RockPaperLizard, esqueci de lhe contar um truque muito simples. Revogue as permissões de leitura do arquivo do pacote (ou diretório base, no caso do Lollipop), reinicie e pronto. Por exemplo, com permissões de root, você pode parar o SystemUI dessa maneira adb shell su -c "chmod 111 /system/app/SystemUI.apk",. 111 significa definir apenas permissões executáveis ​​para proprietário, grupo e outros. Reinicialize e o aplicativo estará ausente no sistema. Você também pode configurá-lo 000.
Firelord