2010-10-24 6 views
45

Escribí un servicio con una interfaz remota y lo instalé en el Eclipse AVD de mi PC. Tengo un arnés de prueba de cliente que inicia e invoca métodos en el servicio. Inicialmente tuve el servicio instalado por una clase de control y la actividad, que ahora he eliminado, por lo que el manifiesto para el servicio será similar a:Depuración de un servicio

<?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> 

lo que no hay etiqueta de actividad.

Cuando lo ejecuto desde el icono de depuración en Eclipse, la consola me dice que está instalando el apk (que es), pero no aparece como un subproceso de depuración y puntos de interrupción no se desencadenan, aunque el comportamiento del servicio es OK en la medida en que el cliente lo vea. Si envuelvo la etiqueta de servicio en una etiqueta de actividad que tiene una clase asociada y la ejecuto, entonces puedo depurarla

¿Es posible depurar el servicio sin incluirlo en una actividad?

+1

En otra pregunta, dijo que ya conoce la respuesta. Simplemente responda la pregunta usted mismo y después de dos días también podrá aceptarla. – Janusz

+0

respuesta está aquí http://stackoverflow.com/questions/5379129/debugging-not-working-in-a-service-class-what-can-cause-this-issue –

Respuesta

6

Creo que debería hacerse programáticamente con android.os.Debug.waitForDebugger();

72

Esto es lo que puede hacer en cuatro pasos:

Primero: En el primer método interesante de su servicio (he usado en crear):

/* (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 
} 

Segundo: posicionar puntos de parada después de la waitForDebuggerCommand.

Tercero: inicie la aplicación mediante el botón de depuración en Eclipse. (Probablemente debería haber retirado la actividad de lanzamiento del manifiesto por ahora)

Última: adb Iniciar y ejecutar el comando para iniciar un servicio:

  • cd $PLATFORM_TOOLS
  • adb shell
  • am startservice -n com.google.android.apps.gtalkservice/com.google.android.gtalkservice.service.GTalkService
+1

así, me di cuenta de que mientras esto funciona bien en mis dispositivos emulados, no funciona en absoluto en mi htc inspire 4g. parece que el comando para iniciar el servicio desde la línea cmd funciona, sin embargo, el depurador nunca se conecta. No estoy seguro de por qué ... he vuelto a lanzar una actividad principal como se sugirió anteriormente ... –

+2

tenga en cuenta que la línea "waitForDebugger" no significa que el servicio se romperá en esa línea. Simplemente significa "comenzar a buscar puntos de interrupción y detener * en ellos *" –

+3

Advertencia: también significa que si un depurador no está realmente conectado, el código que sigue a esa declaración no se ejecutará. –

18

solo asegúrate de no olvidar esta línea de código en tu código y liberar tu apk. si intenta ejecutar su aplicación sin el depurador, la línea siguiente se atascará.

android.os.Debug.waitForDebugger(); 

También se puede utilizar el siguiente para determinar si está conectado el depurador:

android.os.Debug.isDebuggerConnected(); //Determine if a debugger is currently attached. 
2

Esto funciona en Android Studio. Puede haber una manera similar en Eclipse, supongo.

  1. ejecutar el proyecto en modo de depuración
  2. adjuntar depurador a su proceso de servicio
13

enter image description here

Así que esto ha sido cubierto Ornithopter ... pero su respuesta no dice en realidad " Cómo hacerlo. Las respuestas anteriores que dicen "escriba esto en su código" no funcionaron para mí.

Ejecuta tu aplicación. presione el botón en la foto, seleccione su proceso de fondo, para mí su sincronización. No sé si la sincronización es solo para adaptadores de sincronización.

Cuestiones relacionadas