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.

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>


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.


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

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.


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.


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

2

Wenn Sie nur ein Paket töten wollen

pkill package_name 

sollte arbeiten


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ß!


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 ...


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.