我已经编写了带有远程接口的服务,并将其安装在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(它确实是),但是它并没有作为调试线程出现,也没有触发断点,尽管该服务的行为到目前为止还可以如客户所见。如果将服务标签包装在具有关联类的活动标签中并启动它,则可以对其进行调试。
是否可以在不将其包装在活动中的情况下调试该服务?
您可以按照以下四个步骤进行操作:
首先:在您的服务的第一个有趣方法中(我在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