tangguo

调试服务

android

我已经编写了带有远程接口的服务,并将其安装在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(它确实是),但是它并没有作为调试线程出现,也没有触发断点,尽管该服务的行为到目前为止还可以如客户所见。如果将服务标签包装在具有关联类的活动标签中并启动它,则可以对其进行调试。

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


阅读 421

收藏
2020-11-03

共1个答案

小编典典

您可以按照以下四个步骤进行操作:

首先:在您的服务的第一个有趣方法中(我在create上使用过):

/* (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
2020-11-03