ClientImpl
public
class
ClientImpl
extends JdwpAgent
implements
Client
| java.lang.Object | ||
| ↳ | com.android.tradefed.device.server.jdwp.JdwpAgent | |
| ↳ | com.android.tradefed.device.server.ClientImpl | |
Reprezentuje to pojedynczego klienta, zwykle proces maszyny wirtualnej Dalvik.
Ta klasa zapewnia dostęp do podstawowych informacji o kliencie, a także do metod wykonywania działań na kliencie.
Bardziej szczegółowe informacje, zwykle aktualizowane w czasie rzeczywistym, są dostępne w klasie ClientData. Każdy obiekt Client ma własny obiekt ClientData, do którego dostęp uzyskuje się za pomocą getClientData().
Podsumowanie
Publiczne konstruktory | |
|---|---|
ClientImpl(DeviceImpl device, SocketChannel chan, int pid)
Utwórz obiekt dla nowego połączenia klienta. |
|
Metody publiczne | |
|---|---|
void
|
captureView(String viewRoot, String view, DebugViewDumpHandler handler)
|
void
|
close(boolean notify)
Zamknij kanał gniazda klienta. |
boolean
|
ddmSeen()
Wątek MonitorThread wywołuje tę metodę, gdy wykryje żądanie lub odpowiedź DDM. |
void
|
dumpDisplayList(String viewRoot, String view)
|
void
|
dumpViewHierarchy(String viewRoot, boolean skipChildren, boolean includeProperties, boolean useV2, DebugViewDumpHandler handler)
|
void
|
enableAllocationTracker(boolean enable)
Włącza lub wyłącza narzędzie do śledzenia alokacji w przypadku tego klienta. |
void
|
executeGarbageCollector()
Wymusza na kliencie uruchomienie modułu odśmiecania pamięci. |
ClientData
|
getClientData()
Zwraca obiekt |
int
|
getDebuggerListenPort()
Zwraca port debugera dla tego klienta. |
IDevice
|
getDevice()
Zwraca |
DeviceImpl
|
getDeviceImpl()
Zwraca |
JdwpPacket
|
getJdwpPacket()
Zwraca informacje o pierwszym pełnym pakiecie JDWP w buforze. |
void
|
initializeHeapUpdateStatus()
|
boolean
|
isDdmAware()
Zwraca |
boolean
|
isDebuggerAttached()
Zwraca wartość |
boolean
|
isHeapUpdateEnabled()
Zwraca informację, czy włączona jest aktualizacja sterty. |
boolean
|
isThreadUpdateEnabled()
Zwraca informację, czy aktualizacja wątku jest włączona. |
boolean
|
isValid()
Zwraca informację, czy ten |
void
|
kill()
Wysyła do maszyny wirtualnej komunikat o zakończeniu działania. |
void
|
listViewRoots(DebugViewDumpHandler replyHandler)
|
void
|
notifyVmMirrorExited()
Kopie maszyn wirtualnych debuggera mogą kończyć działanie bez wiedzy DDMLib, co prowadzi do różnych warunków wyścigu lub trwałych |
void
|
packetFailed(JdwpPacket reply)
Wcześniejsze żądanie zakończyło się niepowodzeniem. |
void
|
read()
Odczytuje dane z naszego kanału. Funkcja powinna być wywoływana tylko z jednego wątku. |
void
|
register(Selector sel)
Rejestruje klienta za pomocą selektora. Należy go wywołać natychmiast po utworzeniu klienta. |
void
|
requestAllocationDetails()
Wysyła do maszyny wirtualnej prośbę o przesłanie informacji o wszystkich przydziałach, które miały miejsce od czasu wywołania funkcji |
void
|
requestAllocationStatus()
Wysyła do maszyny wirtualnej prośbę o przesłanie stanu włączenia śledzenia alokacji. |
void
|
requestMethodProfilingStatus()
Wysyła do maszyny wirtualnej żądanie przesłania stanu włączenia profilowania metody. |
boolean
|
requestNativeHeapInformation()
Wysyła prośbę o aktualizację sterty natywnej. |
void
|
requestThreadStackTrace(int threadId)
Wysyła żądanie aktualizacji śladu stosu wątku. |
void
|
requestThreadUpdate()
Wysyła prośbę o aktualizację wątku. |
void
|
setHeapInfoUpdateEnabled(boolean enabled)
|
void
|
setHeapSegmentUpdateEnabled(boolean enabled)
|
void
|
setHeapUpdateEnabled(boolean enabled)
Włącza lub wyłącza aktualizację sterty. |
void
|
setThreadUpdateEnabled(boolean enabled)
Włącza lub wyłącza aktualizację wątku. |
void
|
startMethodTracer()
|
boolean
|
startOpenGlTracing()
|
void
|
startSamplingProfiler(int samplingInterval, TimeUnit timeUnit)
|
void
|
stopMethodTracer()
|
boolean
|
stopOpenGlTracing()
|
void
|
stopSamplingProfiler()
|
String
|
toString()
Zwraca ciąg znaków reprezentujący obiekt |
void
|
toggleMethodProfiling()
Ta metoda została wycofana.
Zamiast niej użyj zasad |
void
|
update(int changeMask)
|
void
|
updateHeapInfo()
Wysyła pojedynczą aktualizację sterty. |
Metody chronione | |
|---|---|
void
|
send(JdwpPacket packet)
Wysyłanie pakietu DDM do klienta. |
Publiczne konstruktory
ClientImpl
public ClientImpl (DeviceImpl device, SocketChannel chan, int pid)
Utwórz obiekt dla nowego połączenia klienta.
| Parametry | |
|---|---|
device |
DeviceImpl: urządzenie, do którego należy ten klient |
chan |
SocketChannel: połączony ERROR(/SocketChannel). |
pid |
int: identyfikator procesu klienta. |
Metody publiczne
captureView
public void captureView (String viewRoot,
String view,
DebugViewDumpHandler handler)| Parametry | |
|---|---|
viewRoot |
String |
view |
String |
handler |
DebugViewDumpHandler |
zamknij
public void close (boolean notify)
Zamknij kanał gniazda klienta. Jeśli jest z nami powiązany debugger, zamknij go.
Zamknięcie kanału powoduje jego automatyczne wyrejestrowanie z selektora. Musimy jednak przejść przez pętlę selektora, zanim pozwoli on na zamknięcie deskryptorów plików. Obowiązek ten spoczywa na osobie dzwoniącej.
| Parametry | |
|---|---|
notify |
boolean: czy powiadomić słuchaczy o zmianie. |
ddmSeen
public boolean ddmSeen ()
Wątek MonitorThread wywołuje tę metodę, gdy wykryje żądanie lub odpowiedź DDM. Jeśli nie widzieliśmy wcześniej pakietu DDM, przechodzimy do stanu ST_READY i zwracamy wartość „false”. W przeciwnym razie zwraca wartość „true”.
Chodzi o to, aby wątek MonitorThread wiedział, kiedy po raz pierwszy zobaczymy pakiet DDM, dzięki czemu będziemy mogli wysłać transmisję do modułów obsługi, gdy zostanie nawiązane połączenie z klientem. Ta metoda jest zsynchronizowana, więc wysyłamy transmisję tylko raz.
| Zwroty | |
|---|---|
boolean |
|
dumpDisplayList
public void dumpDisplayList (String viewRoot,
String view)| Parametry | |
|---|---|
viewRoot |
String |
view |
String |
dumpViewHierarchy
public void dumpViewHierarchy (String viewRoot,
boolean skipChildren,
boolean includeProperties,
boolean useV2,
DebugViewDumpHandler handler)| Parametry | |
|---|---|
viewRoot |
String |
skipChildren |
boolean |
includeProperties |
boolean |
useV2 |
boolean |
handler |
DebugViewDumpHandler |
enableAllocationTracker
public void enableAllocationTracker (boolean enable)
Włącza lub wyłącza narzędzie do śledzenia alokacji w przypadku tego klienta.
Jeśli ta opcja jest włączona, maszyna wirtualna zacznie śledzić informacje o przydziale. Wywołanie funkcji requestAllocationDetails() spowoduje, że maszyna wirtualna wyśle informacje o wszystkich przydziałach, które miały miejsce między włączeniem a żądaniem.
| Parametry | |
|---|---|
enable |
boolean |
executeGarbageCollector
public void executeGarbageCollector ()
Wymusza na kliencie uruchomienie modułu odśmiecania pamięci.
getClientData
public ClientData getClientData ()
Zwraca obiekt ClientData zawierający informacje o tym kliencie.
| Zwroty | |
|---|---|
ClientData |
|
getDebuggerListenPort
public int getDebuggerListenPort ()
Zwraca port debugera dla tego klienta.
| Zwroty | |
|---|---|
int |
|
getDeviceImpl
public DeviceImpl getDeviceImpl ()
Zwraca DeviceImpl, na którym działa ten klient.
| Zwroty | |
|---|---|
DeviceImpl |
|
getJdwpPacket
public JdwpPacket getJdwpPacket ()
Zwraca informacje o pierwszym pełnym pakiecie JDWP w buforze.
Jeśli nie mamy jeszcze pełnego pakietu, zwróć wartość null.
Jeśli nie otrzymaliśmy jeszcze uzgadniania JDWP, czekamy na nie i przetwarzamy je bez przyznawania się do tego. Po otrzymaniu uzgadniania wysyłamy komunikat „HELO”, dlatego może to spowodować wyjątek IOException.
Kolejność operacji podczas nawiązywania połączenia jest następująca:
Po stronie hosta: 1) adb track-jdwp, 2) odbieranie zaktualizowanej listy identyfikatorów PID zawierających proces aplikacji. 3) Otwórz/przekaż dalej port debugera i połącz się z urządzeniem. 4) Przeprowadź procedurę uzgadniania połączenia. 5) Wyślij HELO i poczekaj na odpowiedź.
Po stronie urządzenia/procesu: a) utwórz kopię procesu zygote i zaktualizuj ADB o identyfikator PID; b) wyślij APNM, jeśli port debugera jest połączony („<pre-initialize>”); c) powiąż proces z rzeczywistą aplikacją i pakietem; d) wyślij zaktualizowany APNM, jeśli port debugera jest połączony.
Obie powyższe sekwencje wykonania działają całkowicie równolegle, a jedynym ograniczeniem jest to, że a) musi nastąpić przed 2).
| Zwroty | |
|---|---|
JdwpPacket |
|
initializeHeapUpdateStatus
public void initializeHeapUpdateStatus ()
isDdmAware
public boolean isDdmAware ()
Zwraca true, jeśli maszyna wirtualna klienta obsługuje DDM.
Połączenia są tu dozwolone tylko po nawiązaniu połączenia.
| Zwroty | |
|---|---|
boolean |
|
isDebuggerAttached
public boolean isDebuggerAttached ()
Zwraca wartość true, jeśli do klienta jest obecnie podłączony debugger.
| Zwroty | |
|---|---|
boolean |
|
isHeapUpdateEnabled
public boolean isHeapUpdateEnabled ()
Zwraca informację, czy włączona jest aktualizacja sterty.
| Zwroty | |
|---|---|
boolean |
|
Zobacz też:
isThreadUpdateEnabled
public boolean isThreadUpdateEnabled ()
Zwraca informację, czy aktualizacja wątku jest włączona.
| Zwroty | |
|---|---|
boolean |
|
isValid
public boolean isValid ()
Zwraca informację, czy ten ClientImpl ma prawidłowe połączenie z maszyną wirtualną aplikacji.
| Zwroty | |
|---|---|
boolean |
|
zabijać,
public void kill ()
Wysyła do maszyny wirtualnej komunikat o zakończeniu działania. Nie musi to działać, jeśli maszyna wirtualna jest w stanie awarii.
listViewRoots
public void listViewRoots (DebugViewDumpHandler replyHandler)
| Parametry | |
|---|---|
replyHandler |
DebugViewDumpHandler |
notifyVmMirrorExited
public void notifyVmMirrorExited ()
Kopie maszyn wirtualnych debuggera mogą kończyć działanie bez wiedzy DDMLib, co prowadzi do różnych warunków wyścigu lub trwałych Client utraty danych. Musimy powiadomić DDMLib, że dołączony obecnie debuger kończy działanie i zamyka połączenie z kopią maszyny wirtualnej.
packetFailed
public void packetFailed (JdwpPacket reply)
Wcześniejsze żądanie zakończyło się niepowodzeniem. Jest to oczekiwana odpowiedź na komunikat HELO podczas komunikacji z klientem innym niż DDM.
| Parametry | |
|---|---|
reply |
JdwpPacket |
czytaj
public void read ()
Odczytuje dane z naszego kanału. Funkcja powinna być wywoływana tylko z jednego wątku.
Ta funkcja jest wywoływana, gdy wiadomo, że dane są dostępne, ale w buforze nie ma jeszcze pełnego pakietu. Jeśli bufor jest pełny, powiększ go.
zarejestrować się,
public void register (Selector sel)
Rejestruje klienta za pomocą selektora. Należy go wywołać natychmiast po utworzeniu klienta.
| Parametry | |
|---|---|
sel |
Selector |
requestAllocationDetails
public void requestAllocationDetails ()
Wysyła do maszyny wirtualnej prośbę o przesłanie informacji o wszystkich przydziałach, które miały miejsce od czasu wywołania funkcji enableAllocationTracker(boolean) z parametrem enable ustawionym na null. Jest to działanie asynchroniczne.
Informacje o przydziale są dostępne pod adresem ClientData.getAllocations(). Powiadomienie o dostępności nowych danych otrzymasz za pomocą usługi AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) z obiektem changeMask zawierającym maskę Client.CHANGE_HEAP_ALLOCATIONS.
requestAllocationStatus
public void requestAllocationStatus ()
Wysyła do maszyny wirtualnej prośbę o przesłanie stanu włączenia śledzenia alokacji. Jest to działanie asynchroniczne.
Stan przydzielenia można sprawdzić za pomocą ClientData.getAllocationStatus(). Powiadomienie o dostępności nowego stanu zostanie przesłane przez AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) z changeMask zawierającym maskę Client.CHANGE_HEAP_ALLOCATION_STATUS.
requestMethodProfilingStatus
public void requestMethodProfilingStatus ()
Wysyła do maszyny wirtualnej żądanie przesłania stanu włączenia profilowania metody. Jest to działanie asynchroniczne.
Stan przydzielenia można sprawdzić za pomocą ClientData.getAllocationStatus(). Powiadomienie o dostępności nowego stanu zostanie przesłane przez AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) z changeMask zawierającym maskę Client.CHANGE_HEAP_ALLOCATION_STATUS.
requestNativeHeapInformation
public boolean requestNativeHeapInformation ()
Wysyła żądanie aktualizacji sterty natywnej. Jest to działanie asynchroniczne.
Informacje o pamięci sterty natywnej są dostępne dla ClientData.getNativeAllocationList(). Powiadomienie o dostępności nowych danych otrzymasz za pomocą usługi AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) z obiektem changeMask zawierającym maskę Client.CHANGE_NATIVE_HEAP_DATA.
| Zwroty | |
|---|---|
boolean |
|
requestThreadStackTrace
public void requestThreadStackTrace (int threadId)
Wysyła żądanie aktualizacji śladu stosu wątku. Jest to działanie asynchroniczne.
Informacje o wątku są dostępne dla ClientData.getThreads() i ThreadInfo.getStackTrace().
Powiadomienie o dostępności nowych danych otrzymasz za pomocą usługi AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) z changeMask zawierającym maskę Client.CHANGE_THREAD_STACKTRACE.
| Parametry | |
|---|---|
threadId |
int |
requestThreadUpdate
public void requestThreadUpdate ()
Wysyła prośbę o aktualizację wątku. Jest to działanie asynchroniczne.
Informacje o wątku są dostępne pod adresem ClientData.getThreads(). Powiadomienie o dostępności nowych danych otrzymasz w AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) z changeMask zawierającym maskę Client.CHANGE_THREAD_DATA.
setHeapInfoUpdateEnabled
public void setHeapInfoUpdateEnabled (boolean enabled)
| Parametry | |
|---|---|
enabled |
boolean |
setHeapSegmentUpdateEnabled
public void setHeapSegmentUpdateEnabled (boolean enabled)
| Parametry | |
|---|---|
enabled |
boolean |
setHeapUpdateEnabled
public void setHeapUpdateEnabled (boolean enabled)
Włącza lub wyłącza aktualizację sterty.
Jeśli true, każdy GC spowoduje, że klient wyśle informacje o stercie.
Informacje o stercie są dostępne dla ClientData.getVmHeapData().
Powiadomienie o dostępności nowych danych zostanie przesłane przez AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) z changeMask zawierającym wartość Client.CHANGE_HEAP_DATA.
| Parametry | |
|---|---|
enabled |
boolean: flaga włączania |
setThreadUpdateEnabled
public void setThreadUpdateEnabled (boolean enabled)
Włącza lub wyłącza aktualizację wątku.
Jeśli true, maszyna wirtualna będzie mogła wysyłać informacje o wątkach. Informacje o wątku
należy przesyłać za pomocą funkcji requestThreadUpdate().
| Parametry | |
|---|---|
enabled |
boolean: flaga włączenia. |
startMethodTracer
public void startMethodTracer ()
startOpenGlTracing
public boolean startOpenGlTracing ()
| Zwroty | |
|---|---|
boolean |
|
startSamplingProfiler
public void startSamplingProfiler (int samplingInterval,
TimeUnit timeUnit)| Parametry | |
|---|---|
samplingInterval |
int |
timeUnit |
TimeUnit |
stopMethodTracer
public void stopMethodTracer ()
stopOpenGlTracing
public boolean stopOpenGlTracing ()
| Zwroty | |
|---|---|
boolean |
|
stopSamplingProfiler
public void stopSamplingProfiler ()
toString
public String toString ()
Zwraca ciąg znaków reprezentujący obiekt ClientImpl.
| Zwroty | |
|---|---|
String |
|
toggleMethodProfiling
public void toggleMethodProfiling ()
Ta metoda została wycofana.
Zamiast niej używaj kolumn startMethodTracer(), stopMethodTracer(), startSamplingProfiler(int, TimeUnit) lub stopSamplingProfiler().
Przełącza stan profilowania metody.
Zaktualizuj
public void update (int changeMask)
| Parametry | |
|---|---|
changeMask |
int |
updateHeapInfo
public void updateHeapInfo ()
Wysyła pojedynczą aktualizację sterty.
Metody chronione
wyślij
protected void send (JdwpPacket packet)
Wysyłanie pakietu DDM do klienta.
Najlepiej byłoby, gdybyśmy mogli to zrobić za pomocą jednego zapisu na kanale. Jeśli tak się nie stanie, musimy uniemożliwić innym osobom pisanie na kanale do czasu ukończenia tego pakietu, więc synchronizujemy się na kanale.
Kolejnym celem jest uniknięcie niepotrzebnych kopii buforowych, dlatego zapisujemy bezpośrednio z obiektu ByteBuffer pakietu JdwpPacket.
| Parametry | |
|---|---|
packet |
JdwpPacket |