从控制台停止Android应用程序

从控制台停止Android应用程序,android,testing,adb,Android,Testing,Adb,是否可以从控制台停止Android应用程序?比如: adb stop com.my.app.package 这将大大加快我们的测试过程。现在,我们每次都卸载/安装该应用程序,以确保手动测试用例以干净的状态启动。在eclipse中,转到DDMS透视图,在设备选项卡中,在要终止它的设备下单击要终止的进程。然后只需按下停止按钮,它就会终止进程 我不确定您将如何从命令行工具执行此操作,但必须有一种方法。也许你可以通过adb外壳来实现…编辑:在我写了这篇文章并被接受为答案很久之后,am force st

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

adb stop com.my.app.package

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

在eclipse中,转到DDMS透视图,在设备选项卡中,在要终止它的设备下单击要终止的进程。然后只需按下停止按钮,它就会终止进程


我不确定您将如何从命令行工具执行此操作,但必须有一种方法。也许你可以通过adb外壳来实现…

编辑:在我写了这篇文章并被接受为答案很久之后,
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

如果您有权访问应用程序包,那么您可以使用-r选项进行安装,如果进程当前作为副作用运行,它将终止进程。像这样:

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


-r选项保留当前与应用程序关联的数据。但是,如果你想要像你提到的那样一笔勾销,你可能不想使用该选项。

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

停止应用程序的干净方法是:

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

这样,您就不必计算进程ID。

如果您以非根设备为目标,并且/或者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

首先,将应用程序置于后台(按下设备的主页按钮)

然后……在终点站

adb shell am kill com.your.package

如果你想要的只是杀死一个包裹

pkill package_name 
应该有用

pkill NAMEofAPP

无根棉花糖、termux和终端仿真器。

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

根据MAC“强制访问控制” 您可能有权终止进程 它不是由root启动的


玩得开心

我在Linux上尝试了所有答案,在无根设备API级别23上调试没有任何效果, 所以我找到了另一种调试方法 从开发者选项->应用程序部分->检查不保留活动 这样,当你把应用程序放在后台时,它就会被杀死


请记住在完成调试后取消选中它

无法让它工作(kill和su的权限都被拒绝),但是+1向我展示了我可以用adb做比我想象的更多的事情。啊,听起来你好像没有根设备。它至少可以在模拟器上运行!:)也许您必须以读写方式重新装载分区,并以root身份运行adb:adb remount;adb root#这只是一个愚蠢的猜测,我认为adb shell ps | grep com.myapp | awk{print$2}| xargs adb shell su-0 kill在无根手机上有效这似乎没什么作用。我在无根手机上检查过它。起初有一些权限被拒绝的消息,然后它杀死了我的DalvicVM应用程序/服务。只需在根设备上稍等片刻,它就可以正常工作,而且它还有一个额外的好处,就是能够关闭应用程序/服务。这可能是出于测试目的。注意:您需要
adb shell
,然后首先运行
su
。警告,这将使该软件包的启动程序图标快捷方式消失,即使在重新启用之后。我发现了一个关于如何在不运行Eclipse和的情况下从命令行执行此操作的方法。这应该是这个问题的公认答案。这个问题不包括根设备。@Dimitris在
强制停止
命令存在之前,我在上面写下了我的答案。我更新了我的答案,指向这一个。我还更新了我的答案,用一种很好的方式为运行测试提供了一个“干净的板岩”。重要的一点是,在此之后,您的广播接收器将无法工作(直到下一个应用程序打开)在
Android 9.0 API Level 28上测试,即使找到与应用程序相关的
PID
,该应用程序仍会显示在最近的应用程序中。你知道如何完全停止应用程序,这意味着即使在后台应用程序中也会停止吗?注意,我认为在API级别>22的情况下,这种方法不再有效。它在我的Nexus 5和棉花糖上确实有效。不过,请确保先将应用程序放在后台。注意:这只适用于较新的Android版本。pkill在我的4.4仿真器上不可用,但在Android 6仿真器上可用。在运行此命令的响应中,我得到了“不允许操作”