web-dev-qa-db-fra.com

Débogage d'un service

J'ai écrit un service avec une interface distante et l'ai installé sur Eclipse AVD de mon PC. J'ai un faisceau de test client qui démarre et appelle des méthodes dans le service. Initialement, le service a été installé par une classe et une activité de contrôle, que j'ai maintenant supprimées, de sorte que le manifeste du service ressemble à:

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

il n'y a donc pas de balise d'activité.

Lorsque je le lance à partir de l'icône de débogage dans Eclipse, la console me dit qu'il installe l'apk (ce qu'il est), mais il n'apparaît pas en tant que thread de débogage et les points d'arrêt ne sont pas déclenchés, bien que le comportement du service soit correct dans la mesure où le client le voit. Si j'enveloppe la balise de service dans une balise d'activité qui a une classe associée et que je la lance, je peux la déboguer

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

54
NickT

Voici ce que vous pouvez faire en quatre étapes:

First: Dans la première méthode intéressante de votre service (j'ai utilisé sur 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
}

Second: Définissez des points d'arrêt n'importe où après la commande waitForDebugger.

Troisième: Lancer l'application via le bouton de débogage dans votre IDE (Eclipse/Android Studio/...). (Vous auriez probablement dû supprimer l'activité de lancement principale du manifeste) maintenant)

Last: Lancez 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
79
Brian Sweeney

assurez-vous juste de ne pas oublier cette ligne de code dans votre code et libérez votre apk. si vous essayez d'exécuter votre application sans le débogueur, la ligne ci-dessous restera 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.
22
Gilson

enter image description here

L'icône du bouton Modifier 2018 a été modifiée

enter image description here

enter image description here

C'est assez simple, vous pouvez vous connecter à votre service d'application. En supposant que l'exécution du débogueur ne fonctionne pas, vous pouvez appuyer sur l'option de processus de sélection en appuyant sur le débogage avec une icône de flèche illustrée ci-dessus. Sélectionnez votre service et vous devriez maintenant pouvoir déboguer votre service.

20
StarWind0

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

5
vipw

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

  1. exécutez votre projet en mode débogage
  2. associez le débogueur à votre processus de service
2
Ornithopter