Android 为什么要等待调试器,然后将调试器附加到进程?

Android 为什么要等待调试器,然后将调试器附加到进程?,android,android-service,android-testing,android-debug,android-developer-api,Android,Android Service,Android Testing,Android Debug,Android Developer Api,它的意义是什么 android.os.Debug.waitForDebugger(); 我知道我们[有时]需要使用来调试,但我的问题是: 为什么我们必须这样做 为什么会有这种方法?它还有什么其他用途 这对我们意味着什么?我们为什么要这样做?为什么必须以这种方式调试服务,而不是活动或广播接收器 有人会认为在项目中调试任何类型的代码都是很简单的。但事实并非如此。无论如何,不适用于服务 这个特别程序存在的原因是什么?它还有什么用途 等待调试器连接。一旦调试器连接,就会返回,因此如果要立即开始跟

它的意义是什么

android.os.Debug.waitForDebugger();
我知道我们[有时]需要使用来调试,但我的问题是:

  • 为什么我们必须这样做
  • 为什么会有这种方法?它还有什么其他用途
  • 这对我们意味着什么?我们为什么要这样做?为什么必须以这种方式调试
    服务
    ,而不是
    活动
    广播接收器
有人会认为在项目中调试任何类型的代码都是很简单的。但事实并非如此。无论如何,不适用于
服务

这个特别程序存在的原因是什么?它还有什么用途

等待调试器连接。一旦调试器连接,就会返回,因此如果要立即开始跟踪,需要在waitForDebugger()调用后放置一个断点

为什么
仍然没有答案

更新

我发现了这个功能的一个用例:当Android应用程序在应用程序进程终止后自动重启时。当用户在应用程序设置中切换运行时权限时,进程被终止。更一般地说,每当

android.os.Process.killProcess(android.os.Process.myPid());
被称为

要在进程重新启动后调试应用程序,请在代码中写入
android.os.debug.waitForDebugger()
,然后将调试器附加到当前进程

这是该函数的一个用例

参考资料

可能相关


.

我不确定我的答案是否正确,因为你可能会认为里面有复杂的见解。实际上,有一个非常直接的过程,用来连接和截取过程响应

  • 为什么会有这种方法?它还有什么其他用途
如你所见,回答这个问题相当简单。由于进程拦截期间的竞争条件,您将无法在早期断点停止,应调用
waitForDebugger()
。在最常见的地方,如
服务
调试和
应用程序

  • “将调试器附加到进程”意味着什么?为什么我们必须这样做?为什么必须以这种方式调试服务,而不是活动或广播接收器

这是另一个问题,我不确定这里的上下文,但是。我们需要调用该方法,并在使用另一个进程从清单中获取
服务
的情况下手动附加到流程。显然,调试网桥将通过应用程序在当前活动进程上设置,但由于我们可以从另一个进程运行
服务
,我们需要手动将其添加到调试网桥并等待调试连接

试图结束/否决该问题的人既不知道答案,也无法回答。我发布这个问题是因为没有人问它。谁在报告中说你需要
android.os.Debug.waitForDebugger()
来调试
Service
的代码?不,这不是真的:服务代码除了activity code之外没有其他处理方式。这个问题确实很有趣,但是太广泛了。是的,我第一次尝试:我在
onStartCommand
的第一行中放置了一个断点,并调用
startService
,调试器在该断点上停止-如果您使用的服务运行在与原始包不同的进程中,那么请在您的问题中显式编写它-正常的服务工作没有问题有趣。这正是我想要的,有更多的细节和例子。默认情况下,
服务
是否始终与应用程序在同一进程中运行?@Y.S抱歉,由于工作场所发生变化,服务正忙)
服务
始终与应用程序在同一进程中运行。除非您在清单中对其进行更改,否则为什么能够使
服务从另一个进程开始工作?对于应用程序和后台应该分开工作的情况。仅适用于ex.
玩家
。通过关闭播放器应用程序,您正在破坏它的进程,但您需要保持音乐播放。要使活动音乐中的任务保持活动状态,您可以使用独立进程的
服务
。@Y.S将
服务
与独立进程一起使用的另一个非常棘手的例子是,这是因为处理本机崩溃。默认情况下,您无法捕获本机库中的异常。相反,您可以使用另一个进程将本机杠杆放置在
服务中
,并创建
活页夹
进行通信。在崩溃的情况下,后台服务将关闭,但主应用程序将继续工作。并且可以重新启动服务。