2010-10-24 9 views
45

J'ai écrit un service avec une interface à distance et l'ai installé sur mon Eclipse AVD. J'ai un harnais de test client qui démarre et invoque des méthodes dans le service. Au départ, je devais le service installé par une classe de contrôle et d'activité, que je l'ai maintenant retiré, de sorte que le manifeste pour le service ressemble à:Mise au point d'un service

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

donc il n'y a pas de balise d'activité. Lorsque je la lance à partir de l'icône de débogage dans Eclipse, la console me dit qu'elle installe apk (ce qu'elle est), mais elle n'apparaît pas comme un thread de débogage et les points d'arrêt ne sont pas déclenchés, bien que le comportement du service soit OK aussi loin que le client le voit. Si je place le tag de service dans une balise d'activité qui a une classe associée et le lance, alors je peux le déboguer

Est-il possible de déboguer le service sans l'encapsuler dans une activité?

+1

Dans une autre question, vous avez dit que vous connaissez la réponse. Répondez simplement à la question et après deux jours, vous pourrez l'accepter. – Janusz

+0

réponse est ici http://stackoverflow.com/questions/5379129/debugging-not-working-in-a-service-class-what-can-cause-this-issue –

Répondre

6

Je pense que cela devrait être fait par programme avec android.os.Debug.waitForDebugger();

72

Voici ce que vous pouvez faire en quatre étapes:

Première: Dans la première méthode intéressante de votre service (je le créer):

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

Deuxièmement: des points d'arrêt après la waitForDebuggerCommand.

Troisièmement: Lancez l'application via le bouton de débogage dans Eclipse. (Vous devriez probablement avoir supprimé la principale activité de lancement du manifeste maintenant)

Dernière: Lancement adb et exécutez la commande pour démarrer un service:

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

bien, je viens de réaliser que Bien que cela fonctionne bien sur mes appareils émulés, il ne fonctionne pas du tout sur mon htc inspire 4g. il semble que la commande pour lancer le service à partir de la ligne cmd fonctionne, mais le débogueur ne s'attache jamais. Je ne sais pas pourquoi ... Je suis revenu au lancement d'une activité principale comme suggéré précédemment ... –

+2

Notez que la ligne "waitForDebugger" ne signifie pas que le service se cassera sur cette ligne. Cela signifie simplement "commencer à regarder pour les points d'arrêt, et arrêter * sur eux *" –

+3

Attention - Cela signifie également que si un débogueur n'est pas vraiment attaché, le code suivant cette instruction ne s'exécutera pas. –

18

Assurez-vous de ne pas oublier cette ligne de code dans votre code et de libérer votre apk. Si vous essayez d'exécuter votre application sans le débogueur, la ligne ci-dessous sera bloquée.

android.os.Debug.waitForDebugger(); 

vous pouvez également utiliser les éléments suivants pour déterminer si le débogueur est connecté:

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

Cela fonctionne dans Android Studio. Il pourrait y avoir une manière similaire dans Eclipse je suppose.

  1. exécuter votre projet en mode débogage
  2. attach débogueur à votre processus de service
13

enter image description here

Cela a donc été couvert Ornithoptère ... mais leur réponse ne dit pas " Comment faire. Les réponses ci-dessus qui disent «écrivez ceci dans votre code» n'ont pas fonctionné pour moi.

Exécutez votre application. appuyez sur le bouton dans la photo, sélectionnez votre processus backgroud, pour moi sa synchronisation. Je ne sais pas si la synchronisation est pour les adaptateurs de synchronisation seulement.