Остановка приложения Android из консоли


205

Можно ли остановить приложение Android с консоли? Что-то вроде:

adb stop com.my.app.package

Это сильно ускорит наш процесс тестирования. Прямо сейчас мы удаляем / устанавливаем приложение каждый раз, чтобы убедиться, что ручные тесты начинаются с чистого состояния.

Ответы:


146

Изменить: Спустя долгое время после того, как я написал этот пост, и он был принят в качестве ответа, am force-stopкоманда была реализована командой Android, как упоминалось в этом ответе .

Альтернатива: вместо того, чтобы просто останавливать приложение, поскольку вы упоминаете, что хотите «чистый лист» для каждого запуска теста, вы можете использовать его adb shell pm clear com.my.app.package, что остановит процесс приложения и очистит все сохраненные данные для этого приложения.


Если вы работаете в Linux:
adb shell ps | grep com.myapp | awk '{print $2}' | xargs adb shell kill

Это будет работать только для устройств / эмуляторов, где у вас есть root сразу после запуска оболочки. Это, вероятно, можно немного уточнить, чтобы позвонить suзаранее.

В противном случае, вы можете сделать (вручную, или я полагаю, по сценарию):
pc $ adb -d shell
android $ su
android # ps
android # kill <process id from ps output>


6
Не удалось заставить его работать (отказано в разрешении как для kill, так и для su), но +1 за то, что показал мне, что я могу сделать намного больше, чем я думал с adb.
hpique

9
Ах, похоже, у вас нет рутированного устройства. Это определенно работает на эмуляторе, по крайней мере! :)
Кристофер Орр

1
Возможно, вам нужно перемонтировать раздел для чтения и записи и запустить adb от имени root: adb remount; adb root # это просто глупая догадка
Rorist

570

Чистый способ остановить приложение:

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

Таким образом, вам не нужно выяснять идентификатор процесса.


28
Это должен быть принятый ответ для этой проблемы. Вопрос не включает рутованное устройство.
Димитрис

10
@Dimitris Я написал свой ответ выше, прежде чем force-stopкоманда существовала. Я обновил свой ответ, чтобы указать на этот.
Кристофер Орр

2
Также я обновил свой ответ хорошим способом предоставления «чистого листа» для запуска тестов.
Кристофер Орр

Важно отметить, что после этого ваш BroadcastReceiver не будет работать (до следующего открытия приложения) commonsware.com/blog/2011/07/13/…
CAMOBAP

После тестирования Android 9.0 API Level 28приложение все еще отображается в последних приложениях, даже если PIDоно найдено в приложении. Вы знаете , как остановить приложение полностью , которое означает , что даже от фоновых приложений?
talha06

33

Сначала поместите приложение в фоновый режим (нажмите кнопку «Домой» на устройстве)

Тогда .... в терминале ....

adb shell am kill com.your.package

11
П р и м е ч а н и е - Я не верю, что это больше работает на уровнях API> 22.
dell116

это происходит на моем Nexus 5 с
Зефиром

Это работает. Убедитесь, что вы сначала поместили приложение в фоновый режим.
PhillyTheThrilly

17

Вы можете использовать следующее из консоли устройства: pm disable com.my.app.packageкоторое убьет его. Затем используйте, pm enable com.my.app.packageчтобы вы могли запустить его снова.


1
На телефоне без рута это, кажется, ничего не делает.
Роберт Мюл

Я проверил это на некорневом телефоне. Сначала появляются сообщения об отказе в разрешении, а затем это убивает мое приложение / службу DalvicVM. Просто дайте ему секунду.
LikeYou

1
на рутованном устройстве это работает, и оно имеет дополнительное преимущество, заключающееся в том, что приложение / служба могут быть недоступны. Это может быть желательно для целей тестирования.
Мики

2
Примечание: вам нужно adb shell, а затем запустить в suпервую очередь.
Каке

Предупреждение: это приведет к тому, что ярлыки на панели запуска для этого пакета исчезнут даже после повторного включения.
Elad Nava

10

Если у вас есть доступ к пакету приложения, вы можете установить его с параметром -r, и он убьет процесс, если он запущен как побочный эффект. Как это:

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

Опция -r сохраняет данные, связанные с приложением. Однако, если вы хотите получить чистый лист, как вы упомянули, вы можете не захотеть использовать эту опцию.


7

Если вы нацелены на некорневое устройство и / или в вашем APK есть службы, которые вы также не хотите останавливать, другие решения не будут работать.

Чтобы решить эту проблему, я прибег к получателю широковещательных сообщений, добавленному в свою деятельность, чтобы остановить его.

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

Таким образом, вы можете выполнить эту команду adb, чтобы остановить вашу деятельность:

adb shell am broadcast -a com.example.TestActivity.STOP

2

Если все, что вы ищете, это убить посылку

pkill package_name 

должно сработать


Примечание: это работает только на новых версиях Android. pkill недоступен в моем эмуляторе 4.4, но доступен в эмуляторе Android 6.
Симон Варта

1

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

в соответствии с MAC «обязательный контроль доступа» у вас, вероятно, есть разрешение на уничтожение процесса, который не запускается пользователем root

радоваться, веселиться!


Я получаю «Операция не разрешена» в ответ на выполнение этой команды
Абдул Рахман Шамайр

0

В eclipse перейдите в перспективу DDMS и на вкладке устройства щелкните процесс, который вы хотите уничтожить, на устройстве, на котором вы хотите его уничтожить. Затем вам просто нужно нажать кнопку остановки, и это должно убить процесс.

Я не уверен, как бы вы сделали это с помощью инструмента командной строки, но должен быть способ. Может быть, вы делаете это через оболочку ADB ...


Я нашел фрагмент кода на GitHub о том, как сделать это из командной строки без запуска Eclipse, и немного его расширил .
Щуберт

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.