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 ClientData zawierający informacje o tym kliencie.

int getDebuggerListenPort()

Zwraca port debugera dla tego klienta.

IDevice getDevice()

Zwraca IDevice, na którym działa ten klient.

DeviceImpl getDeviceImpl()

Zwraca DeviceImpl, na którym działa ten klient.

JdwpPacket getJdwpPacket()

Zwraca informacje o pierwszym pełnym pakiecie JDWP w buforze.

void initializeHeapUpdateStatus()
boolean isDdmAware()

Zwraca true, jeśli maszyna wirtualna klienta obsługuje DDM.

boolean isDebuggerAttached()

Zwraca wartość true, jeśli do klienta jest obecnie podłączony debugger.

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 ClientImpl ma prawidłowe połączenie z maszyną wirtualną aplikacji.

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 Client utraty danych.

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 enableAllocationTracker(boolean) z parametrem enable ustawionym na null.

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 ClientImpl.

void toggleMethodProfiling()

Ta metoda została wycofana. Zamiast niej użyj zasad startMethodTracer(), stopMethodTracer(), startSamplingProfiler(int, TimeUnit) lub stopSamplingProfiler().

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

getDevice

public IDevice getDevice ()

Zwraca IDevice, na którym działa ten klient.

Zwroty
IDevice

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

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)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)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()ThreadInfo.getStackTrace().

Powiadomienie o dostępności nowych danych otrzymasz za pomocą usługi AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int)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)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)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