Parando um aplicativo Android do console

205

É possível parar um aplicativo Android do console? Algo como:

adb stop com.my.app.package

Isso aceleraria muito nosso processo de teste. No momento, desinstalamos / instalamos o aplicativo todas as vezes para garantir que os casos de teste manuais comecem com um estado limpo.

hpique
fonte

Respostas:

146

Edit: Muito tempo depois que escrevi este post e ele foi aceito como resposta, o am force-stopcomando foi implementado pela equipe do Android, conforme mencionado nesta resposta .

Como alternativa: em vez de apenas interromper o aplicativo, já que você mencionou que deseja uma "lista limpa" para cada execução de teste, você pode usar o adb shell pm clear com.my.app.packageque interromperá o processo do aplicativo e limpará todos os dados armazenados para esse aplicativo.


Se você estiver no Linux:
adb shell ps | grep com.myapp | awk '{print $2}' | xargs adb shell kill

Isso funcionará apenas para dispositivos / emuladores nos quais você tenha root imediatamente após executar um shell. Provavelmente isso pode ser refinado um pouco para ligar com suantecedência.

Caso contrário, você pode fazer (manualmente, ou suponho que esteja com script):
pc $ adb -d shell
android $ su
android # ps
android # kill <process id from ps output>

Christopher Orr
fonte
6
Não foi possível fazê-lo funcionar (permissão negada para kill e su), mas +1 por me mostrar que posso fazer muito mais do que pensei com adb.
Hpique
9
Ah, parece que você não tem um dispositivo enraizado. Definitivamente funciona pelo menos no emulador! :)
Christopher Orr
1
Talvez você precise remontar a partição de leitura-gravação e execute o adb como root: adb remount; raiz adb # isso é apenas uma suposição estúpida pensou
Rorist
570

A maneira limpa de parar o aplicativo é:

adb shell am force-stop com.my.app.package

Dessa forma, você não precisa descobrir o ID do processo.

Enrico Ros
fonte
28
Essa deve ser a resposta aceita para esse problema. A pergunta não inclui um dispositivo raiz.
precisa
10
@ Dimitris Eu escrevi minha resposta acima antes que o force-stopcomando existisse. Eu atualizei minha resposta para apontar para esta.
Christopher Orr
2
Também atualizei minha resposta com uma boa maneira de realmente fornecer uma "lista limpa" para a execução de testes.
Christopher Orr
Ponto importante: após isso, o seu BroadcastReceiver não funcionará (até o próximo aplicativo ser aberto) commonsware.com/blog/2011/07/13/…
#
Testado em Android 9.0 API Level 28, o aplicativo ainda é exibido nos Aplicativos recentes, mesmo que ele PIDseja encontrado em relação ao aplicativo. Você sabe como parar o aplicativo completamente, o que significa mesmo nos aplicativos em segundo plano?
talha06
32

Primeiro, coloque o aplicativo em segundo plano (pressione o botão home do dispositivo)

Então .... em um terminal ....

adb shell am kill com.your.package
dell116
fonte
11
OBSERVAÇÃO Eu não acredito que isso funcione mais nos níveis de APIs> 22.
dell116 28/11
ele faz no meu Nexus 5 com Marshmallow
Ursus
Isso funciona. Lembre-se de colocar o aplicativo em segundo plano primeiro.
PhillyTheThrilly
17

você pode usar o seguinte no console do dispositivo: o pm disable com.my.app.packageque o matará. Em seguida, use pm enable com.my.app.packagepara que você possa iniciá-lo novamente.

Alguém algum lugar
fonte
1
Em um telefone sem raiz, isso parece não fazer nada.
Robert Muil
Eu o peguei em um telefone não enraizado. No começo, existem mensagens com permissão negada e, em seguida, ele matava meu aplicativo / serviço DalvicVM. Apenas dê um segundo.
LikeYou
1
em um dispositivo raiz, isso funciona e tem o benefício adicional de manter o aplicativo / serviço inativo. Isso pode ser desejável para fins de teste.
Miki
2
Nota: Você precisa e adb shell, em seguida, execute suprimeiro.
precisa saber é
Atenção, isso fará com que os atalhos do ícone do iniciador para esse pacote desapareçam, mesmo após a reativação.
Elad Nava
10

Se você tiver acesso ao pacote de aplicativos, poderá instalar com a opção -r e ele interromperá o processo se estiver em execução no momento como efeito colateral. Como isso:

adb -d install -r MyApp.apk ; adb -d shell am start -a android.intent.action.MAIN -n com.MyCompany.MyApp/.MyActivity

A opção -r preserva os dados atualmente associados ao aplicativo. No entanto, se você deseja uma lista limpa como você mencionou, pode não querer usar essa opção.

ThomasW
fonte
7

Se você segmentar um dispositivo não-rooteado e / ou tiver serviços em seu APK que não deseja parar também, as outras soluções não funcionarão.

Para resolver esse problema, recorri a um receptor de mensagem de broadcast que adicionei à minha atividade para pará-lo.

public class TestActivity extends Activity {
    private static final String STOP_COMMAND = "com.example.TestActivity.STOP";

    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            TestActivity.this.finish();
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //other stuff...

        registerReceiver(broadcastReceiver, new IntentFilter(STOP_COMMAND));
    }
}

Dessa forma, você pode emitir este comando adb para interromper sua atividade:

adb shell am broadcast -a com.example.TestActivity.STOP
Patrick Valsecchi
fonte
2

Se tudo o que você está procurando é matar um pacote

pkill package_name 

Deveria trabalhar

Steve
fonte
Nota: isso funciona apenas nas versões mais recentes do Android. O pkill não está disponível no meu emulador 4.4, mas está disponível no emulador do Android 6.
Simon Warta
1

adb shell killall -9 com.your.package.name

de acordo com o "controle de acesso obrigatório" do MAC, você provavelmente tem permissão para interromper o processo que não é iniciado pelo root

diverta-se!

sinan bilkay
fonte
Estou recebendo "Operação não permitida" na resposta à execução deste comando
Abdul Rahman Shamair
0

No eclipse, vá para a perspectiva DDMS e, na guia dispositivos, clique no processo que você deseja matar no dispositivo em que deseja matá-lo. Você só precisa pressionar o botão Parar e isso deve interromper o processo.

Não sei como você faria isso na ferramenta de linha de comando, mas deve haver uma maneira. Talvez você faça isso através do shell adb ...

matto1990
fonte
Encontrei um trecho de código no GitHub sobre como fazer isso na linha de comando sem executar o Eclipse e o estendi um pouco .
sschuberth
-1
pkill NAMEofAPP

Marshmallow não enraizado, termux e emulador de terminal.

William A. Krithinithis Kripto
fonte