2010-10-24 14 views
45

Napisałem usługę ze zdalnym interfejsem i zainstalowałem ją na komputerze Eclipse AVD. Mam uprząż testową klienta, która uruchamia i wywołuje metody w usłudze. Początkowo miałem usługę instalowany przez klasę sterowania i aktywności, co mam teraz usunięte, tak że manifest dla usługi wygląda następująco:Debugowanie usługi

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

więc nie ma znacznika aktywności.

Po uruchomieniu go z ikony debugowania w Eclipse, konsola mówi mi, że instaluje apk (który jest), ale nie pojawia się jako wątek debugowania, a punkty przerwania nie są uruchamiane, chociaż zachowanie usługi jest OK, o ile klient to widzi. Jeśli otworzę tag usługi w znaczniku aktywności, który ma przypisaną klasę i uruchomi go, to mogę go zdebugować. Czy mogę debugować usługę bez zawijania jej w działanie?

+1

W innym pytaniu powiedziałeś, że znasz odpowiedź. Po prostu odpowiedz sobie na to pytanie i po dwóch dniach możesz je również zaakceptować. – Janusz

+0

Odpowiedź jest tutaj http://stackoverflow.com/questions/5379129/debugging-not-working-in-a-service-class-what-can-cause-this-issue –

Odpowiedz

6

Myślę, że należy to zrobić programowo za pomocą android.os.Debug.waitForDebugger();

72

Oto co można zrobić w czterech etapach:

pierwsze: W pierwszym interesującym sposobie usługi (użyłem na stworzenie):

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

drugie: Komplet punktów przerwa po waitForDebuggerCommand.

Po trzecie: Uruchom aplikację za pomocą przycisku debugowania w Eclipse. (Należy prawdopodobnie usunął główną działalność launch z manifestu teraz)

Ostatnio: Wprowadzenie adb i uruchom polecenie, aby uruchomić usługę:

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

dobrze, po prostu sobie sprawę, że podczas gdy to działa dobrze na moich emulowanych urządzeniach, to nie działa w ogóle na moim htc inspirować 4g. wydaje się, że polecenie uruchomienia usługi z wiersza cmd działa, ale debugger nigdy nie dołącza. nie wiem, dlaczego ... Wróciłem do uruchomienia głównej aktywności, jak sugerowano wcześniej ... –

+2

Należy zauważyć, że linia "waitForDebugger" nie oznacza, że ​​usługa zostanie rozbita na tej linii. Oznacza to po prostu "rozpocznij oglądanie dla punktów przerwania i zatrzymaj * na nich *" –

+3

Ostrzeżenie - Oznacza to również, że jeśli debugger rzeczywiście nie jest dołączony, kod następujący po tym oświadczeniu nie zostanie wykonany. –

18

tylko pamiętaj, aby nie zapomnieć o tym wierszu kodu w kodzie i zwolnić apk. jeśli spróbujesz uruchomić aplikację bez debugera, poniższa linia utknie.

android.os.Debug.waitForDebugger(); 

również można użyć następujących czynności, aby ustalić, czy debugger jest podłączony:

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

to działa w Android Studio. Być może istnieje podobny sposób w Eclipse.

  1. uruchomić projekt w trybie debugowania
  2. dołączyć debugera do procesu obsługi
13

enter image description here

Więc ta została pokryta ornitopterem ... ale ich odpowiedź faktycznie nie powiedzieć " Jak to zrobić. Powyższe odpowiedzi, które mówią "napisz to w swoim kodzie", nie sprawdziły się u mnie.

Uruchom aplikację. naciśnij przycisk na zdjęciu, wybierz proces backgroud, dla mnie jego synchronizacja. Nie wiem, czy synchronizacja dotyczy tylko adapterów synchronizacji.