从控制台停止Android应用


205

是否可以从控制台停止Android应用程序?就像是:

adb stop com.my.app.package

这样可以大大加快我们的测试过程。现在,我们每次都卸载/安装该应用程序,以确保手动测试用例以干净状态开头。

Answers:


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

这仅适用于在运行Shell时立即具有root用户权限的设备/仿真器。可以稍稍改进一下以su事先致电。

否则,您可以做(手动,或者我想脚本化):
pc $ adb -d shell
android $ su
android # ps
android # kill <process id from ps output>


6
无法使它正常工作(kill和su均拒绝了此权限),但是+1告诉我,我可以做的比我想象的要多得多。
hpique 2010年

9
啊,听起来您没有植根设备。它肯定至少可以在模拟器上运行!:)
Christopher Orr 2010年

1
也许您必须以读写方式重新挂载分区并以root身份运行adb:adb remount; 亚行根#这只是一个愚蠢的猜测思想
Rorist

569

停止应用的干净方法是:

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

这样,您不必找出进程ID。


28
这应该是该问题的公认答案。该问题不包括植根设备。
Dimitris

10
@Dimitris我在force-stop命令存在之前就在上面写下了答案。我更新了答案以指出这一点。
Christopher Orr 2013年

2
我还用一种真正提供运行测试的“干净条件”的好方法更新了答案。
Christopher Orr

重要的是,在此之后,您的BroadcastReceiver将无法工作(直到打开下一个应用程序)commonsware.com/blog/2011/07/13/…–
CAMOBAP

经过测试Android 9.0 API Level 28,即使找到与应用有关的应用,该应用仍会显示在“ 最近使用PID的应用”中。您是否知道如何完全停止应用程序运行,这甚至意味着从后台应用程序停止运行?
talha19年

32

首先,将应用置于后台(按设备的主屏幕按钮)

然后...在航站楼...

adb shell am kill com.your.package

11
注:我不相信这个工程了在API的水平> 22
dell116

它在使用棉花糖的Nexus 5上运行
urSus

这可行。但是请确保先将应用程序置于后台。
PhillyTheThrilly

17

您可以从设备控制台使用以下命令:pm disable com.my.app.package它将杀死它。然后使用,pm enable com.my.app.package以便您可以再次启动它。


1
在无根电话上,这似乎无能为力。
罗伯特·

我已经在非root用户的手机上对其进行了校验。首先,有一些权限被拒绝的消息,然后它杀死了我的DalvicVM应用程序/服务。请稍等一下。
LikeYou

1
在有根设备上可以正常工作,它还有一个好处,就是可以使应用程序/服务保持关闭状态。对于测试目的,这可能是理想的。
miki

2
注意:您需要先adb shell运行,然后再运行su
kakyo

警告,即使重新启用后,该包的启动器图标快捷方式也会消失。
Elad Nava 2014年

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

如果您定位到非root用户的设备和/或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

在eclipse中,转到DDMS透视图,然后在设备选项卡中,单击要杀死它的设备下要杀死的进程。然后,您只需要按一下“停止”按钮即可终止该过程。

我不确定如何从命令行工具执行此操作,但是必须有一种方法。也许您是通过adb shell来完成的...


在GitHub上找到了一个代码片段,代码片段说明了如何在不运行Eclipse的情况下从命令行执行此操作,并对其进行了少许扩展
sschuberth,2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.