Припинення програми 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
Не вдалося змусити його працювати (дозвіл відмовлено і вбивстві, і в су), але +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

32

По-перше, покладіть додаток на другий план (натисніть домашню кнопку пристрою)

Потім .... в терміналі ....

adb shell am kill com.your.package

11
ПРИМІТКА. Я не вірю, що це більше працює на рівнях API> 22.
dell116

це робиться на моєму Nexus 5 з Marshmallow
urSus

Це працює. Переконайтеся, що ви поклали додаток на другий план спочатку.
PhillyTheThrilly

17

ви можете використовувати наступне з консолі пристрою: pm disable com.my.app.packageщо вб'є це. Потім використовуйте pm enable com.my.app.packageтак, щоб ви могли запустити його знову.


1
На телефоні без коріння це, здається, нічого не робить.
Роберт Мюїл

Я перевірив це на не вкоріненому телефоні. Спочатку є деякі повідомлення, відхилені в дозволі, а потім це вбив мою програму / послугу DalvicVM. Просто дайте хвилині.
LikeYou

1
на укоріненому пристрої це працює, і це має додаткову перевагу від того, що зможете утримувати додаток / послугу. Це може бути бажано для тестування.
miki

2
Примітка. Вам потрібно adb shell, а потім запустити suспочатку.
kakyo

Попередження, це призведе до зникнення ярликів значка запуску для цього пакету навіть після повторного ввімкнення.
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

весело!


Я отримую "Операція не дозволена" у відповідь на виконання цієї команди
Abdul Rahman Shamair

0

У затемненні перейдіть до точки зору DDMS і на вкладці пристроїв натисніть на процес, який ви хочете вбити під пристроєм, на якому ви хочете його вбити. Тоді вам просто потрібно натиснути кнопку зупинки, і це повинно вбити процес.

Я не впевнений, як би ви це зробили з інструменту командного рядка, але повинен бути спосіб. Можливо, ви робите це через оболонку adb ...


Я знайшов фрагмент коду на GitHub про те, як це зробити з командного рядка, не запускаючи Eclipse і трохи розтягнувши його .
sschuberth

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.