Arrêt d'une application Android à partir de la console

205

Est-il possible d'arrêter une application Android depuis la console? Quelque chose comme:

adb stop com.my.app.package

Cela accélérerait tellement notre processus de test. À l'heure actuelle, nous désinstallons / installons l'application à chaque fois pour nous assurer que les cas de test manuels commencent avec un état propre.

hpique
la source

Réponses:

146

Edit: Longtemps après que j'ai écrit ce post et qu'il ait été accepté comme réponse, la am force-stopcommande a été implémentée par l'équipe Android, comme mentionné dans cette réponse .

Alternativement: Plutôt que d'arrêter l'application, puisque vous mentionnez vouloir une "table rase" pour chaque test, vous pouvez utiliser adb shell pm clear com.my.app.package, ce qui arrêtera le processus d'application et effacera toutes les données stockées pour cette application.


Si vous êtes sous Linux:
adb shell ps | grep com.myapp | awk '{print $2}' | xargs adb shell kill

Cela ne fonctionnera que pour les appareils / émulateurs où vous avez root immédiatement après l'exécution d'un shell. Cela peut probablement être légèrement affiné pour appeler à l' suavance.

Sinon, vous pouvez faire (manuellement, ou je suppose par script):
pc $ adb -d shell
android $ su
android # ps
android # kill <process id from ps output>

Christopher Orr
la source
6
Impossible de le faire fonctionner (autorisation refusée à la fois pour kill et su), mais +1 pour me montrer que je peux faire beaucoup plus que je ne le pensais avec adb.
hpique
9
Ah, on dirait que vous n'avez pas d'appareil enraciné. Cela fonctionne certainement sur l'émulateur au moins! :)
Christopher Orr
1
Vous devrez peut-être remonter la partition en lecture-écriture et exécuter adb en tant que root: adb remount; adb root # c'est juste une idée stupide
Rorist
570

La façon la plus simple d'arrêter l'application est:

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

De cette façon, vous n'avez pas à comprendre l'ID du processus.

Enrico Ros
la source
28
Cela devrait être la réponse acceptée pour ce problème. La question ne comprend pas de périphérique enraciné.
Dimitris
10
@Dimitris J'ai écrit ma réponse ci-dessus avant que la force-stopcommande n'existe. J'ai mis à jour ma réponse pour pointer celle-ci.
Christopher Orr
2
J'ai également mis à jour ma réponse avec un bon moyen de vraiment fournir une "table rase" pour l'exécution des tests.
Christopher Orr
Point important qu'après cela, votre BroadcastReceiver ne fonctionnera pas (jusqu'à la prochaine application ouverte) commonsware.com/blog/2011/07/13/…
CAMOBAP
Testée sur Android 9.0 API Level 28, l'application est toujours affichée dans les applications récentes même si elle PIDse trouve concernant l'application. Savez-vous comment arrêter complètement l'application, ce qui signifie même à partir des applications d'arrière-plan?
talha06
32

Tout d'abord, mettez l'application en arrière-plan (appuyez sur le bouton d'accueil de l'appareil)

Puis .... dans un terminal ....

adb shell am kill com.your.package
dell116
la source
11
NOTE Je ne crois pas que cela fonctionne plus dans les niveaux d'API> 22.
dell116
il le fait sur mon Nexus 5 avec Marshmallow
urSus
Cela marche. Assurez-vous de mettre d'abord l'application en arrière-plan.
PhillyTheThrilly
17

vous pouvez utiliser ce qui suit à partir de la console de l'appareil: pm disable com.my.app.packagece qui le tuera. Ensuite, utilisez-le pm enable com.my.app.packagepour pouvoir le relancer.

Quelqu'un quelque part
la source
1
Sur un téléphone non rooté, cela semble ne rien faire.
Robert Muil
Je l'ai vérifié sur un téléphone non rooté. Au début, il y a des messages d'autorisation refusée, puis cela a tué mon application / service DalvicVM. Donnez-lui juste une seconde.
LikeYou
1
sur un appareil enraciné, cela fonctionne, et cela a l'avantage supplémentaire de pouvoir maintenir l'application / le service hors tension. Cela peut être souhaitable à des fins de test.
miki
2
Remarque: vous devez adb shell, puis exécutez d' suabord.
kakyo
Attention, cela fera disparaître les raccourcis des icônes du lanceur pour ce package, même après la réactivation.
Elad Nava
10

Si vous avez accès au package d'application, vous pouvez installer avec l'option -r et il tuera le processus s'il est actuellement en cours d'exécution comme effet secondaire. Comme ça:

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

L'option -r conserve les données actuellement associées à l'application. Cependant, si vous voulez une table rase comme vous le mentionnez, vous ne voudrez peut-être pas utiliser cette option.

ThomasW
la source
7

Si vous ciblez un appareil non rooté et / ou avez des services dans votre APK que vous ne voulez pas arrêter également, les autres solutions ne fonctionneront pas.

Pour résoudre ce problème, j'ai eu recours à un récepteur de diffusion de messages que j'ai ajouté à mon activité afin de l'arrêter.

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

De cette façon, vous pouvez exécuter cette commande adb pour arrêter votre activité:

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

Si tout ce que vous cherchez est de tuer un paquet

pkill package_name 

devrait marcher

Steve
la source
Remarque: cela ne fonctionne que sur les nouvelles versions d'Android. pkill n'est pas disponible sur mon émulateur 4.4 mais est disponible sur l'émulateur Android 6.
Simon Warta
1

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

selon MAC "contrôle d'accès obligatoire", vous avez probablement la permission de tuer le processus qui n'est pas démarré par root

s'amuser!

sinan bilkay
la source
Je reçois "Opération non autorisée" en réponse à l'exécution de cette commande
Abdul Rahman Shamair
0

Dans eclipse, accédez à la perspective DDMS et dans l'onglet des périphériques, cliquez sur le processus que vous souhaitez tuer sous le périphérique sur lequel vous souhaitez le tuer. Il vous suffit alors d'appuyer sur le bouton d'arrêt et cela devrait tuer le processus.

Je ne sais pas comment vous le feriez à partir de l'outil de ligne de commande, mais il doit y avoir un moyen. Peut-être que vous le faites via le shell adb ...

matto1990
la source
J'ai trouvé un extrait de code sur GitHub sur la façon de le faire à partir de la ligne de commande sans exécuter Eclipse et je l'ai légèrement étendu .
sschuberth
-1
pkill NAMEofAPP

Guimauve non enracinée, émulateur termux et terminal.

William A. Krithinithis Kripto
la source