Arresto di un'app Android dalla console


205

È possibile interrompere un'app Android dalla console? Qualcosa di simile a:

adb stop com.my.app.package

Accelererebbe così tanto il nostro processo di test. Al momento disinstalliamo / installiamo l'app ogni volta per assicurarci che i casi di test manuali inizino con uno stato pulito.

Risposte:


146

Modifica: molto tempo dopo aver scritto questo post ed è stato accettato come risposta, il am force-stopcomando è stato implementato dal team di Android, come indicato in questa risposta .

In alternativa: anziché interrompere semplicemente l'app, poiché si menziona la necessità di una "lavagna pulita" per ogni esecuzione di test, è possibile utilizzare adb shell pm clear com.my.app.package, che interromperà il processo dell'app e cancellerà tutti i dati memorizzati per tale app.


Se sei su Linux:
adb shell ps | grep com.myapp | awk '{print $2}' | xargs adb shell kill

Funzionerà solo per dispositivi / emulatori in cui hai root immediatamente dopo aver eseguito una shell. Questo può probabilmente essere leggermente raffinato per essere chiamatosu anticipo.

Altrimenti, puoi fare (manualmente o suppongo che sia scriptato):
pc $ adb -d shell
android $ su
android # ps
android # kill <process id from ps output>


6
Non è riuscito a farlo funzionare (permesso negato sia per kill che su), ma +1 per avermi mostrato che posso fare molto di più di quanto pensassi con adb.
hpique,

9
Ah, sembra che tu non abbia un dispositivo rootato. Funziona sicuramente sull'emulatore almeno! :)
Christopher Orr,

1
Forse devi rimontare la partizione read-write ed eseguire adb come root: adb remount; adb root # è solo una stupida ipotesi
Rorist,

570

Il modo pulito per interrompere l'app è:

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

In questo modo non è necessario capire l'ID del processo.


28
Questa dovrebbe essere la risposta accettata per questo problema. La domanda non include un dispositivo rooted.
Dimitris

10
@Dimitris Ho scritto la mia risposta sopra prima che force-stopesistesse il comando. Ho aggiornato la mia risposta per indicare questa.
Christopher Orr,

2
Inoltre ho aggiornato la mia risposta con un buon modo per fornire davvero una "lavagna pulita" per l'esecuzione dei test.
Christopher Orr,

Punto importante che dopo questo il tuo BroadcastReceiver non funzionerà (fino alla prossima app aperta) commonsware.com/blog/2011/07/13/…
CAMOBAP

Testato Android 9.0 API Level 28, l'app viene ancora visualizzata nelle app recenti anche se PIDsi trova l'app relativa all'app. Sai come interrompere completamente l'app, il che significa anche dalle app in background?
talha06,

32

Innanzitutto, metti l'app in background (premi il pulsante Home del dispositivo)

Quindi .... in un terminale ....

adb shell am kill com.your.package

11
NOTA Non credo che questo
funzioni

lo fa sul mio Nexus 5 con Marshmallow
urSus

Questo funziona Assicurati di mettere prima l'app in background.
PhillyTheThrilly,

17

è possibile utilizzare quanto segue dalla console del dispositivo: pm disable com.my.app.packageche lo ucciderà. Quindi utilizzare in pm enable com.my.app.packagemodo da poterlo riavviare.


1
Su un telefono non rootato questo sembra non fare nulla.
Robert Muil,

L'ho controllato su un telefono non rootato. All'inizio ci sono alcuni messaggi di autorizzazione negati e poi ha ucciso la mia app / servizio DalvicVM. Dagli solo un secondo.
LikeYou

1
su un dispositivo rootato funziona e ha l'ulteriore vantaggio di essere in grado di mantenere l'app / il servizio inattivo. Questo può essere desiderabile a scopo di test.
miki,

2
Nota: è necessario adb shell, quindi eseguire suprima.
Kakyo,

Attenzione, questo farà scomparire le scorciatoie dell'icona di avvio per quel pacchetto, anche dopo la riattivazione.
Elad Nava,

10

Se hai accesso al pacchetto dell'applicazione, puoi installarlo con l'opzione -r e questo interromperà il processo se è attualmente in esecuzione come effetto collaterale. Come questo:

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

L'opzione -r conserva i dati attualmente associati all'app. Tuttavia, se si desidera una lavagna pulita come quella menzionata, è possibile che non si desideri utilizzare tale opzione.


7

Se scegli come target un dispositivo non rootato e / o hai servizi nel tuo APK che non vuoi fermare, le altre soluzioni non funzioneranno.

Per risolvere questo problema, ho fatto ricorso a un ricevitore di messaggi broadcast che ho aggiunto alla mia attività per fermarlo.

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));
    }
}

In questo modo, puoi emettere questo comando adb per interrompere la tua attività:

adb shell am broadcast -a com.example.TestActivity.STOP

2

Se tutto ciò che stai cercando è uccidere un pacchetto

pkill package_name 

dovrebbe funzionare


Nota: funziona solo su versioni Android più recenti. pkill non è disponibile sul mio emulatore 4.4 ma è disponibile sull'emulatore Android 6.
Simon Warta,

1

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

in base al "controllo di accesso obbligatorio" MAC probabilmente hai il permesso di terminare il processo che non è stato avviato da root

divertiti!


Ricevo "Operazione non consentita" in risposta all'esecuzione di questo comando
Abdul Rahman Shamair,

0

In eclipse vai alla prospettiva DDMS e nella scheda Dispositivi fai clic sul processo che vuoi uccidere sotto il dispositivo su cui vuoi ucciderlo. Devi solo premere il pulsante di arresto e questo dovrebbe interrompere il processo.

Non sono sicuro di come lo faresti dallo strumento da riga di comando, ma ci deve essere un modo. Forse lo fai attraverso la shell adb ...


Ho trovato uno snippet di codice su GitHub su come farlo dalla riga di comando senza eseguire Eclipse e l' ho leggermente esteso .
sschuberth,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.