59

我编写了一个带有远程接口的服务并将其安装在我的 PC 的 Eclipse AVD 上。我有一个客户端测试工具,它启动并调用服务中的方法。最初,我通过一个控制类和活动安装了该服务,现在我已将其删除,因此该服务的清单如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myname.gridservice"
android:versionCode="1"
android:versionName="1.0">
<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:debuggable="true">
    <service
        android:enabled="true"
        android:debuggable="true"
        android:name="OverlayService">
        <intent-filter>
            <action android:name="com.myname.OverlayService.SERVICE"/>
            <action android:name="com.myname.gridservice.IRemoteInterface" />
        </intent-filter>
    </service>
 </application>  
</manifest>   

所以没有活动标签。

当我从 Eclipse 中的调试图标启动它时,控制台告诉我它正在安装 apk(它是),但它没有显示为调试线程并且没有触发断点,尽管服务的行为目前还可以正如客户所见。如果我将服务标签包装在具有关联类的活动标签中并启动它,那么我可以调试它。

是否可以在不将其包装在活动中的情况下调试服务?

4

6 回答 6

92

以下是您可以分四个步骤执行的操作:

首先:在您的服务的第一个有趣的方法中(我在创建时使用):

/* (non-Javadoc)    
 * @see android.app.Service#onCreate()
 */
@Override
public void onCreate() {
    super.onCreate();
    //whatever else you have to to here...
    android.os.Debug.waitForDebugger();  // this line is key
}

第二waitForDebugger:在命令后的任意位置设置断点。

第三:通过 IDE(Eclipse/Android Studio/...)中的调试按钮启动应用程序。(您现在应该已经从清单中删除了主要的启动活动)

最后:启动 adb 并运行命令启动服务:

  • cd $PLATFORM_TOOLS
  • adb shell
  • am startservice -n com.google.android.apps.gtalkservice/com.google.android.gtalkservice.service.GTalkService
于 2011-06-29T19:19:08.800 回答
23

只要确保您不会忘记代码中的这行代码并发布您的 apk。如果您尝试在没有调试器的情况下运行您的应用程序,下面的行将会卡住。

android.os.Debug.waitForDebugger();

您还可以使用以下内容来确定调试器是否已连接:

android.os.Debug.isDebuggerConnected(); //Determine if a debugger is currently attached.
于 2013-06-10T17:01:05.967 回答
21

在此处输入图像描述

编辑 2018 按钮图标已更改

在此处输入图像描述

在此处输入图像描述

这很简单,您可以连接到您的应用程序服务。假设运行调试器不起作用,您可以通过按下带有上图所示箭头图标的调试来按下选择进程选项。选择您的服务,您现在应该可以调试您的服务了。

于 2015-08-18T18:58:18.613 回答
5

我认为应该使用 android.os.Debug.waitForDebugger() 以编程方式完成;

于 2011-06-13T12:51:59.223 回答
2

这适用于 Android Studio。我想在 Eclipse 中可能有类似的方式。

  1. 在调试模式下运行您的项目
  2. 将调试器附加到您的服务进程
于 2015-07-21T10:32:52.880 回答
2

一些答案正确地提到您想要插入

android.os.Debug.waitForDebugger(); 

进入服务的第一个有趣的方法。但是,从这些答案中并不清楚,Android Studio 调试器在服务启动时不会自动启动。

相反,您还需要等到服务启动,然后按下按钮附加到进程(参见 Android Studio 3.6.1 的屏幕截图 .. 它是按钮右侧的第三个debug按钮)。您将可以选择附加到的进程,其中一个是服务的单独进程。然后,您可以选择它以完成将调试器附加到服务的过程。

这是按钮,背景突出显示

当您将鼠标悬停在按钮上时

编辑,2020 年 8 月: Android Studio 4.0 中的按钮图标相同

于 2020-05-30T16:22:47.333 回答