Zatrzymywanie aplikacji na Androida z konsoli

205

Czy można zatrzymać aplikację na Androida z konsoli? Coś jak:

adb stop com.my.app.package

Przyspieszyłoby to nasz proces testowy. W tej chwili za każdym razem odinstalowujemy / instalujemy aplikację, aby upewnić się, że ręczne przypadki testowe zaczynają się od stanu czystego.

hpique
źródło

Odpowiedzi:

146

Edycja: Długo po tym, jak napisałem ten post i został zaakceptowany jako odpowiedź, am force-stoppolecenie zostało zaimplementowane przez zespół Androida, jak wspomniano w tej odpowiedzi .

Alternatywnie: Zamiast tylko zatrzymywać aplikację, ponieważ wspominasz o potrzebie „czystego konta” dla każdego uruchomienia testowego, możesz użyć tego adb shell pm clear com.my.app.package, co zatrzyma proces aplikacji i usunie wszystkie zapisane dane dla tej aplikacji.


Jeśli korzystasz z systemu Linux:
adb shell ps | grep com.myapp | awk '{print $2}' | xargs adb shell kill

Będzie to działać tylko w przypadku urządzeń / emulatorów, w których rootujesz natychmiast po uruchomieniu powłoki. Można to prawdopodobnie nieco ulepszyć, aby zadzwonić suwcześniej.

W przeciwnym razie możesz zrobić (ręcznie lub, jak sądzę, skryptowo):
pc $ adb -d shell
android $ su
android # ps
android # kill <process id from ps output>

Christopher Orr
źródło
6
Nie mogłem go uruchomić (odmowa zgody zarówno na zabicie, jak i na su), ale +1 za pokazanie mi, że mogę zrobić o wiele więcej niż myślałem z adb.
hpique
9
Ach, brzmi jakbyś nie miał zrootowanego urządzenia. Zdecydowanie działa przynajmniej na emulatorze! :)
Christopher Orr,
1
Może trzeba ponownie zamontować partycję do odczytu i zapisu i uruchomić adb jako root: adb remount; adb root # to tylko głupia przypuszczenie
Rorist
570

Najprostszym sposobem zatrzymania aplikacji jest:

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

W ten sposób nie musisz ustalać identyfikatora procesu.

Enrico Ros
źródło
28
To powinna być zaakceptowana odpowiedź na ten problem. Pytanie nie obejmuje zrootowanego urządzenia.
Dimitris,
10
@Dimitris Napisałem moją odpowiedź powyżej, zanim force-stopkomenda istniała. Zaktualizowałem swoją odpowiedź, aby wskazać tę.
Christopher Orr,
2
Zaktualizowałem też swoją odpowiedź dobrym sposobem, aby naprawdę zapewnić „czyste konto” do przeprowadzania testów.
Christopher Orr,
Ważna uwaga, że ​​po tym twój BroadcastReceiver nie będzie działał (do momentu otwarcia następnej aplikacji) commonsware.com/blog/2011/07/13/…
CAMOBAP
Testowana Android 9.0 API Level 28aplikacja nadal wyświetla się w najnowszych aplikacjach, nawet jeśli PIDznaleziono ją w odniesieniu do aplikacji. Czy wiesz, jak całkowicie zatrzymać aplikację, co oznacza nawet z aplikacji działających w tle?
talha06
32

Najpierw umieść aplikację w tle (naciśnij przycisk początkowy urządzenia)

Następnie .... w terminalu ....

adb shell am kill com.your.package
dell116
źródło
11
UWAGA Nie sądzę, aby to
działało
robi to na moim Nexusie 5 z Marshmallow
urSus
To działa. Najpierw jednak umieść aplikację w tle.
PhillyTheThrilly
17

z konsoli urządzenia możesz skorzystać z następujących opcji: pm disable com.my.app.packagektóra go zabije. Następnie użyj pm enable com.my.app.package, aby móc go ponownie uruchomić.

Ktoś gdzieś
źródło
1
Na nierootowanym telefonie wydaje się to nic nie robić.
Robert Muil
Sprawdziłem to na nierootowanym telefonie. Na początku są wiadomości o odmowie zgody, a potem zabiła moją aplikację / usługę DalvicVM. Daj mi chwilę.
Like You
1
na zrootowanym urządzeniu to działa i ma dodatkową zaletę polegającą na utrzymaniu aplikacji / usługi w stanie wyłączonym. Może to być pożądane do celów testowych.
miki,
2
Uwaga: musisz najpierw adb shelluruchomić su.
kakyo
Uwaga: spowoduje to zniknięcie skrótów ikony programu uruchamiającego dla tego pakietu, nawet po ponownym włączeniu.
Elad Nava
10

Jeśli masz dostęp do pakietu aplikacji, możesz zainstalować z opcją -r, a proces zostanie zabity, jeśli jest uruchomiony jako efekt uboczny. Lubię to:

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

Opcja -r zachowuje dane aktualnie powiązane z aplikacją. Jeśli jednak chcesz mieć czystą tablicę, o której wspomniałeś, możesz nie chcieć korzystać z tej opcji.

ThomasW
źródło
7

Jeśli zaatakujesz niezrootowane urządzenie i / lub masz w sobie usługi APK, których również nie chcesz zatrzymać, inne rozwiązania nie będą działać.

Aby rozwiązać ten problem, skorzystałem z odbiornika wiadomości rozgłoszeniowych, który dodałem do mojej działalności, aby go zatrzymać.

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

W ten sposób możesz wydać polecenie adb, aby zatrzymać swoją aktywność:

adb shell am broadcast -a com.example.TestActivity.STOP
Patrick Valsecchi
źródło
2

Jeśli wszystko, czego szukasz, to zabicie paczki

pkill package_name 

powinno działać

Steve
źródło
Uwaga: działa to tylko w nowszych wersjach Androida. pkill nie jest dostępny w emulatorze 4.4, ale jest dostępny w emulatorze Androida 6.
Simon Warta
1

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

zgodnie z MAC „obowiązkową kontrolą dostępu” prawdopodobnie masz uprawnienia do zabicia procesu, który nie jest uruchamiany przez roota

baw się dobrze!

sinan bilkay
źródło
Otrzymuję komunikat „Operacja niedozwolona” w odpowiedzi na uruchomienie tego polecenia
Abdul Rahman Shamair
0

W Eclipse przejdź do perspektywy DDMS, a na zakładce urządzenia kliknij proces, który chcesz zabić pod urządzeniem, na którym chcesz go zabić. Następnie wystarczy nacisnąć przycisk Stop, co powinno zabić proces.

Nie jestem pewien, jak zrobiłbyś to z narzędzia wiersza poleceń, ale musi być jakiś sposób. Może robisz to przez powłokę adb ...

matto1990
źródło
Znalazłem fragment kodu na GitHub, jak to zrobić z wiersza poleceń bez uruchamiania Eclipse i nieznacznie go rozszerzyłem .
sschuberth
-1
pkill NAMEofAPP

Nierootowany emulator marshmallow, termux i terminal.

William A. Krithinithis Kripto
źródło