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

205

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

adb stop com.my.app.package

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

hpique
источник

Ответы:

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
dell116
источник
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 сохраняет данные, связанные с приложением. Однако, если вы хотите получить чистый лист, как вы упомянули, вы можете не захотеть использовать эту опцию.

ThomasW
источник
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 ...

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

Не рутированный зефир, termux и эмулятор терминала.

Уильям А. Критинитис Крипто
источник