Stoppen einer Android-App von der Konsole

205

Ist es möglich, eine Android-App von der Konsole aus zu stoppen? Etwas wie:

adb stop com.my.app.package

Dies würde unseren Testprozess so sehr beschleunigen. Im Moment deinstallieren / installieren wir die App jedes Mal, um sicherzustellen, dass die manuellen Testfälle mit einem sauberen Zustand beginnen.

hpique
quelle

Antworten:

146

Bearbeiten: Lange nachdem ich diesen Beitrag geschrieben hatte und er als Antwort akzeptiert wurde, wurde der am force-stopBefehl vom Android-Team implementiert , wie in dieser Antwort erwähnt .

Alternativ: Anstatt nur die App zu stoppen, können Sie verwenden, da Sie erwähnen, dass Sie für jeden Testlauf eine "saubere Tafel" wünschen adb shell pm clear com.my.app.package, die den App-Prozess stoppt und alle gespeicherten Daten für diese App löscht.


Wenn Sie unter Linux arbeiten:
adb shell ps | grep com.myapp | awk '{print $2}' | xargs adb shell kill

Dies funktioniert nur bei Geräten / Emulatoren, bei denen Sie unmittelbar nach dem Ausführen einer Shell über Root verfügen. Das kann wahrscheinlich etwas verfeinert werden, um suvorher anzurufen .

Andernfalls können Sie Folgendes tun (manuell oder vermutlich per Skript):
pc $ adb -d shell
android $ su
android # ps
android # kill <process id from ps output>

Christopher Orr
quelle
6
Konnte es nicht zum Laufen bringen (Erlaubnis sowohl für kill als auch für su verweigert), aber +1, um mir zu zeigen, dass ich mit adb viel mehr kann, als ich dachte.
Hpique
9
Ah, hört sich so an, als hätten Sie kein gerootetes Gerät. Zumindest auf dem Emulator funktioniert es definitiv! :)
Christopher Orr
1
Möglicherweise müssen Sie die Lese- / Schreibpartition der Partition erneut bereitstellen und adb als root ausführen: adb remount; adb root # das ist nur eine blöde Vermutung
Rorist
569

Die saubere Methode zum Stoppen der App ist:

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

Auf diese Weise müssen Sie die Prozess-ID nicht herausfinden.

Enrico Ros
quelle
28
Dies sollte die akzeptierte Antwort für dieses Problem sein. Die Frage enthält kein gerootetes Gerät.
Dimitris
10
@ Dimitris Ich habe meine Antwort oben geschrieben, bevor der force-stopBefehl existierte. Ich habe meine Antwort aktualisiert, um auf diese zu verweisen.
Christopher Orr
2
Außerdem habe ich meine Antwort mit einer guten Möglichkeit aktualisiert, wirklich eine "saubere Tafel" für die Durchführung von Tests bereitzustellen.
Christopher Orr
Wichtiger Punkt, dass Ihr BroadcastReceiver danach nicht mehr funktioniert (bis zum nächsten Öffnen der App) commonsware.com/blog/2011/07/13/…
CAMOBAP
Getestet am Android 9.0 API Level 28wird die App weiterhin in den letzten Apps angezeigt , obwohl PIDsie in Bezug auf die App gefunden wurde. Wissen Sie, wie Sie die App vollständig stoppen können, dh auch von den Hintergrund-Apps?
talha06
32

Stellen Sie zuerst die App in den Hintergrund (drücken Sie die Home-Taste des Geräts).

Dann .... in einem Terminal ....

adb shell am kill com.your.package
dell116
quelle
11
HINWEIS Ich glaube nicht, dass dies in API-Levels> 22 mehr funktioniert.
Dell116
es tut auf meinem Nexus 5 mit Marshmallow
urSus
Das funktioniert. Stellen Sie jedoch sicher, dass Sie die App zuerst in den Hintergrund stellen.
PhillyTheThrilly
17

In der Gerätekonsole können Sie Folgendes verwenden: pm disable com.my.app.packageDadurch wird es beendet. Verwenden pm enable com.my.app.packageSie dann, damit Sie es erneut starten können.

Irgendwer irgendwo
quelle
1
Auf einem nicht gerooteten Telefon scheint dies nichts zu bewirken.
Robert Muil
Ich habe es auf einem nicht gerooteten Telefon überprüft. Zuerst gibt es einige Nachrichten, denen die Erlaubnis verweigert wurde, und dann wurde meine DalvicVM-App / mein DalvicVM-Dienst beendet. Gib es einfach eine Sekunde.
LikeYou
1
Auf einem gerooteten Gerät funktioniert dies und es hat den zusätzlichen Vorteil, dass die App / der Dienst nicht verfügbar ist. Dies kann zu Testzwecken wünschenswert sein.
Miki
2
Hinweis: Sie müssen zuerst adb shellausführen su.
Kakyo
Warnung: Dadurch werden die Verknüpfungen für das Startsymbol für dieses Paket auch nach dem erneuten Aktivieren ausgeblendet.
Elad Nava
10

Wenn Sie Zugriff auf das Anwendungspaket haben, können Sie es mit der Option -r installieren. Der Vorgang wird abgebrochen, wenn er derzeit als Nebeneffekt ausgeführt wird. So was:

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

Die Option -r behält die aktuell mit der App verknüpften Daten bei. Wenn Sie jedoch eine saubere Tafel wünschen, wie Sie bereits erwähnt haben, möchten Sie diese Option möglicherweise nicht verwenden.

ThomasW
quelle
7

Wenn Sie auf ein nicht gerootetes Gerät abzielen und / oder Dienste in Ihrer APK haben, die Sie nicht ebenfalls stoppen möchten, funktionieren die anderen Lösungen nicht.

Um dieses Problem zu lösen, habe ich auf einen Broadcast-Nachrichtenempfänger zurückgegriffen, den ich meiner Aktivität hinzugefügt habe, um sie zu stoppen.

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

Auf diese Weise können Sie diesen Befehl adb ausgeben, um Ihre Aktivität zu stoppen:

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

Wenn Sie nur ein Paket töten wollen

pkill package_name 

sollte arbeiten

Steve
quelle
Hinweis: Dies funktioniert nur bei neueren Android-Versionen. pkill ist auf meinem 4.4-Emulator nicht verfügbar, aber auf dem Android 6-Emulator.
Simon Warta
1

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

Laut MAC "obligatorische Zugriffskontrolle" haben Sie wahrscheinlich die Berechtigung, einen Prozess abzubrechen, der nicht von root gestartet wird

habe Spaß!

Sinan Bilkay
quelle
0

Wechseln Sie in Eclipse zur DDMS-Perspektive und klicken Sie auf der Registerkarte Geräte unter dem Gerät, auf dem Sie es beenden möchten, auf den Prozess, den Sie beenden möchten. Sie müssen dann nur noch die Stopp-Taste drücken und der Vorgang sollte abgebrochen werden.

Ich bin mir nicht sicher, wie Sie dies über das Befehlszeilentool tun würden, aber es muss einen Weg geben. Vielleicht machst du es durch die ADB-Shell ...

matto1990
quelle
Ich habe auf GitHub ein Code-Snippet gefunden, wie man dies über die Befehlszeile macht, ohne Eclipse auszuführen, und es leicht erweitert .
sschuberth
-1
pkill NAMEofAPP

Nicht verwurzelter Marshmallow-, Termux- und Terminal-Emulator.

William A. Krithinithis Kripto
quelle