【问题标题】:Stopping an Android app from console从控制台停止 Android 应用
【发布时间】:2011-03-08 05:19:52
【问题描述】:

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

adb stop com.my.app.package

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

【问题讨论】:

    标签: android testing adb


    【解决方案1】:

    “停止”命令实现为force-stop;停止后台应用程序运行。如果它在前台,它也会停止:例如。

    adb shell am force-stop com.android.providers.telephony
    

    清除包裹也会删除它们的数据,例如。

    adb shell pm clear com.android.providers.telephony
    

    将删除你所有的短信

    小心你选择哪一个。

    【讨论】:

      【解决方案2】:

      我在 Linux 上尝试了所有答案,在无根设备 API 级别 23 上调试没有任何效果, 所以我找到了调试的替代方案 从开发人员选项-> 应用程序部分-> 选中不保留活动 这样,当您将应用程序置于后台时,它就会被杀死

      P.S 调试完成后记得取消勾选

      【讨论】:

        【解决方案3】:

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

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

        玩得开心!

        【讨论】:

        • 我在运行此命令的响应中收到“不允许操作”
        【解决方案4】:

        编辑:在我写这篇文章并被接受为答案很久之后,am force-stop 命令被 Android 团队改为implemented,正如this answer 中提到的那样。

        替代方案: 既然您提到希望每次测试运行都“干净”,您可以使用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>

        【讨论】:

        • 无法让它工作(kill 和 su 的权限都被拒绝),但 +1 向我展示了我可以用 adb 做的事情比我想象的要多。
        • 啊,听起来你没有root设备。它至少可以在模拟器上运行! :)
        • 也许你必须重新挂载分区读写并以root身份运行adb:adb remount; adb root # 这只是一个愚蠢的猜测
        • adb shell ps | grep com.myapp | awk '{print $2}' | xargs adb shell su -0 kill 为我工作
        【解决方案5】:
        pkill NAMEofAPP
        

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

        【讨论】:

        • 它在termux中还活着。
        【解决方案6】:

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

        然后....在终端中....

        adb shell am kill com.your.package
        

        【讨论】:

        • 注意我认为这在 API 级别 > 22 中不再有效。
        • 它在我的 Nexus 5 上使用 Marshmallow
        • 这行得通。不过,请确保先将应用置于后台。
        【解决方案7】:

        如果你正在寻找的只是杀死一个包

        pkill package_name 
        

        应该工作

        【讨论】:

        • 注意:这仅适用于较新的 Android 版本。 pkill 在我的 4.4 模拟器上不可用,但在 Android 6 模拟器上可用。
        【解决方案8】:

        如果您以非 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
        

        【讨论】:

          【解决方案9】:

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

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

          这样您就不必弄清楚进程 ID。

          【讨论】:

          • 这应该是这个问题的公认答案。该问题不包括有根设备。
          • @Dimitris 在force-stop 命令存在之前,我在上面写了我的答案。我更新了我的答案以指向这个。
          • 另外,我用一种真正为运行测试提供“干净石板”的好方法更新了我的答案。
          • 重要一点,在此之后您的 BroadcastReceiver 将无法工作(直到下一个应用程序打开)commonsware.com/blog/2011/07/13/…
          • Android 9.0 API Level 28 上测试,该应用仍然显示在最近的应用中,即使找到了关于该应用的PID。你知道如何完全停止应用程序,这意味着即使是后台应用程序?
          【解决方案10】:

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

          【讨论】:

          • 在没有root的手机上,这似乎什么也没做。
          • 我在非root手机上检查过。起初有一些权限被拒绝的消息,然后它杀死了我的 DalvVM 应用程序/服务。稍等一下。
          • 在有根设备上这是可行的,并且它具有能够保持应用程序/服务关闭的额外好处。出于测试目的,这可能是可取的。
          • 注意:你需要adb shell,然后先运行su
          • 警告,这将使该软件包的启动器图标快捷方式消失,即使在重新启用后也是如此。
          【解决方案11】:

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

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

          -r 选项保留当前与应用关联的数据。但是,如果您想要像您提到的那样干净,您可能不想使用该选项。

          【讨论】:

            【解决方案12】:

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

            我不确定您如何通过命令行工具执行此操作,但一定有办法。也许你是通过 adb shell 来做的……

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-05-14
            • 2015-11-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-14
            • 1970-01-01
            相关资源
            最近更新 更多