Odpowiedzi:
Edycja: Długo po tym, jak napisałem ten post i został zaakceptowany jako odpowiedź, am force-stop
polecenie 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ć su
wcześ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>
Najprostszym sposobem zatrzymania aplikacji jest:
adb shell am force-stop com.my.app.package
W ten sposób nie musisz ustalać identyfikatora procesu.
force-stop
komenda istniała. Zaktualizowałem swoją odpowiedź, aby wskazać tę.
Android 9.0 API Level 28
aplikacja nadal wyświetla się w najnowszych aplikacjach, nawet jeśli PID
znaleziono ją w odniesieniu do aplikacji. Czy wiesz, jak całkowicie zatrzymać aplikację, co oznacza nawet z aplikacji działających w tle?
Najpierw umieść aplikację w tle (naciśnij przycisk początkowy urządzenia)
Następnie .... w terminalu ....
adb shell am kill com.your.package
z konsoli urządzenia możesz skorzystać z następujących opcji: pm disable com.my.app.package
która go zabije. Następnie użyj pm enable com.my.app.package
, aby móc go ponownie uruchomić.
adb shell
uruchomić su
.
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.
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
Jeśli wszystko, czego szukasz, to zabicie paczki
pkill package_name
powinno działać
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!
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 ...
pkill NAMEofAPP
Nierootowany emulator marshmallow, termux i terminal.