ClientImpl

public class ClientImpl
extends JdwpAgent implements Client

java.lang.Object
   ↳ com.android.tradefed.device.server.jdwp.JdwpAgent
     ↳ com.android.tradefed.device.server.ClientImpl


Dies entspricht einem einzelnen Client, in der Regel einem Dalvik VM-Prozess.

Diese Klasse bietet Zugriff auf grundlegende Clientinformationen sowie Methoden zum Ausführen von Aktionen auf dem Client.

Detailliertere Informationen, die in der Regel in Echtzeit aktualisiert werden, sind über die Klasse ClientData verfügbar. Jedes Client-Objekt hat einen eigenen ClientData, auf den über getClientData() zugegriffen wird.

Zusammenfassung

Öffentliche Konstruktoren

ClientImpl(DeviceImpl device, SocketChannel chan, int pid)

Erstellen Sie ein Objekt für eine neue Clientverbindung.

Öffentliche Methoden

void captureView(String viewRoot, String view, DebugViewDumpHandler handler)
void close(boolean notify)

Schließen Sie den Client-Socket-Kanal.

boolean ddmSeen()

MonitorThread ruft diese Funktion auf, wenn eine DDM-Anfrage oder ‑Antwort erkannt wird.

void dumpDisplayList(String viewRoot, String view)
void dumpViewHierarchy(String viewRoot, boolean skipChildren, boolean includeProperties, boolean useV2, DebugViewDumpHandler handler)
void enableAllocationTracker(boolean enable)

Aktiviert oder deaktiviert den Zuweisungs-Tracker für diesen Kunden.

void executeGarbageCollector()

Erzwingt die Ausführung der Speicherbereinigung auf dem Client.

ClientData getClientData()

Gibt das ClientData-Objekt mit diesen Clientinformationen zurück.

int getDebuggerListenPort()

Gibt den Debugger-Port für diesen Client zurück.

IDevice getDevice()

Gibt das IDevice zurück, auf dem dieser Client ausgeführt wird.

DeviceImpl getDeviceImpl()

Gibt das DeviceImpl zurück, auf dem dieser Client ausgeführt wird.

JdwpPacket getJdwpPacket()

Gibt Informationen zum ersten vollständigen JDWP-Paket im Puffer zurück.

void initializeHeapUpdateStatus()
boolean isDdmAware()

Gibt true zurück, wenn die Client-VM DDM-fähig ist.

boolean isDebuggerAttached()

Gibt true zurück, wenn derzeit ein Debugger an den Client angehängt ist.

boolean isHeapUpdateEnabled()

Gibt zurück, ob ein Heap-Update aktiviert ist.

boolean isThreadUpdateEnabled()

Gibt zurück, ob die Thread-Aktualisierung aktiviert ist.

boolean isValid()

Gibt zurück, ob diese ClientImpl eine gültige Verbindung zur Anwendungs-VM hat.

void kill()

Sendet eine Kill-Nachricht an die VM.

void listViewRoots(DebugViewDumpHandler replyHandler)
void notifyVmMirrorExited()

Debugger-VM-Mirrors können ohne Wissen von DDMLib beendet werden, was zu verschiedenen Race- oder Permanent-Client-Verlustbedingungen führen kann.

void packetFailed(JdwpPacket reply)

Bei einer früheren Anfrage ist ein Fehler aufgetreten.

void read()

Daten aus unserem Channel lesen. Diese Methode sollte nur von einem Thread aufgerufen werden.

void register(Selector sel)

Registriert den Client mit einem Selektor. Sollte unmittelbar nach der Client-Erstellung aufgerufen werden.

void requestAllocationDetails()

Sendet eine Anfrage an die VM, um Informationen zu allen Zuweisungen zu senden, die seit dem Aufruf von enableAllocationTracker(boolean) mit enable auf null erfolgt sind.

void requestAllocationStatus()

Sendet eine Anfrage an die VM, um den Aktivierungsstatus der Zuweisungsanalyse zu senden.

void requestMethodProfilingStatus()

Sendet eine Anfrage an die VM, um den Aktivierungsstatus der Methodenprofilerstellung zu senden.

boolean requestNativeHeapInformation()

Sendet eine Anfrage zum Aktualisieren des nativen Heaps.

void requestThreadStackTrace(int threadId)

Sendet einen Request zum Aktualisieren des Thread-Stack-Trace.

void requestThreadUpdate()

Sendet eine Thread-Aktualisierungsanfrage.

void setHeapInfoUpdateEnabled(boolean enabled)
void setHeapSegmentUpdateEnabled(boolean enabled)
void setHeapUpdateEnabled(boolean enabled)

Aktiviert oder deaktiviert die Heap-Aktualisierung.

void setThreadUpdateEnabled(boolean enabled)

Aktiviert oder deaktiviert die Aktualisierung des Threads.

void startMethodTracer()
boolean startOpenGlTracing()
void startSamplingProfiler(int samplingInterval, TimeUnit timeUnit)
void stopMethodTracer()
boolean stopOpenGlTracing()
void stopSamplingProfiler()
String toString()

Gibt eine Stringdarstellung des ClientImpl-Objekts zurück.

void toggleMethodProfiling()

Diese Methode ist veraltet. Verwenden Sie stattdessen startMethodTracer(), stopMethodTracer(), startSamplingProfiler(int, TimeUnit) oder stopSamplingProfiler().

void update(int changeMask)
void updateHeapInfo()

Löst ein einzelnes Heap-Update aus.

Geschützte Methoden

void send(JdwpPacket packet)

Senden Sie ein DDM-Paket an den Client.

Öffentliche Konstruktoren

ClientImpl

public ClientImpl (DeviceImpl device, 
                SocketChannel chan, 
                int pid)

Erstellen Sie ein Objekt für eine neue Clientverbindung.

Parameter
device DeviceImpl: das Gerät, zu dem dieser Client gehört

chan SocketChannel: das verbundene ERROR(/SocketChannel).

pid int: die Client-PID.

Öffentliche Methoden

captureView

public void captureView (String viewRoot, 
                String view, 
                DebugViewDumpHandler handler)

Parameter
viewRoot String

view String

handler DebugViewDumpHandler

Schließen

public void close (boolean notify)

Schließen Sie den Client-Socket-Kanal. Schließen Sie auch alle Debugger, die mit uns verknüpft sind.

Wenn Sie einen Channel schließen, wird er automatisch aus der Auswahl entfernt. Wir müssen jedoch die Selektorschleife durchlaufen, bevor die Dateideskriptoren geschlossen werden können. Der Anrufer muss das regeln.

Parameter
notify boolean: Gibt an, ob die Listener über eine Änderung benachrichtigt werden sollen.

ddmSeen

public boolean ddmSeen ()

MonitorThread ruft diese Funktion auf, wenn eine DDM-Anfrage oder ‑Antwort erkannt wird. Wenn wir noch kein DDM-Paket gesehen haben, wechseln wir in den Status ST_READY und geben „false“ zurück. Andernfalls wird „true“ zurückgegeben.

Die Idee ist, den MonitorThread zu informieren, wenn wir zum ersten Mal ein DDM-Paket sehen, damit wir eine Broadcast-Nachricht an die Handler senden können, wenn eine Clientverbindung hergestellt wird. Diese Methode ist synchronisiert, sodass der Broadcast nur einmal gesendet wird.

Returns
boolean

dumpDisplayList

public void dumpDisplayList (String viewRoot, 
                String view)

Parameter
viewRoot String

view String

dumpViewHierarchy

public void dumpViewHierarchy (String viewRoot, 
                boolean skipChildren, 
                boolean includeProperties, 
                boolean useV2, 
                DebugViewDumpHandler handler)

Parameter
viewRoot String

skipChildren boolean

includeProperties boolean

useV2 boolean

handler DebugViewDumpHandler

enableAllocationTracker

public void enableAllocationTracker (boolean enable)

Aktiviert oder deaktiviert den Zuweisungs-Tracker für diesen Kunden.

Wenn diese Option aktiviert ist, werden für die VM Zuweisungsinformationen erfasst. Bei einem Aufruf von requestAllocationDetails() sendet die VM die Informationen zu allen Zuweisungen, die zwischen der Aktivierung und der Anfrage erfolgt sind.

Parameter
enable boolean

executeGarbageCollector

public void executeGarbageCollector ()

Erzwingt die Ausführung der Speicherbereinigung auf dem Client.

getClientData

public ClientData getClientData ()

Gibt das ClientData-Objekt mit diesen Clientinformationen zurück.

Returns
ClientData

getDebuggerListenPort

public int getDebuggerListenPort ()

Gibt den Debugger-Port für diesen Client zurück.

Returns
int

getDevice

public IDevice getDevice ()

Gibt das IDevice zurück, auf dem dieser Client ausgeführt wird.

Returns
IDevice

getDeviceImpl

public DeviceImpl getDeviceImpl ()

Gibt das DeviceImpl zurück, auf dem dieser Client ausgeführt wird.

Returns
DeviceImpl

getJdwpPacket

public JdwpPacket getJdwpPacket ()

Gibt Informationen zum ersten vollständigen JDWP-Paket im Puffer zurück.

Wenn wir noch kein vollständiges Paket haben, wird „null“ zurückgegeben.

Wenn wir den JDWP-Handshake noch nicht erhalten haben, warten wir hier darauf und verarbeiten ihn, ohne dies zuzugeben. Nach Erhalt senden wir die „HELO“-Nachricht, weshalb hier eine IOException ausgelöst werden kann.

Die Reihenfolge der Vorgänge beim Herstellen einer Verbindung ist:

Hostseite: 1) adb track-jdwp 2) Aktualisierte Liste der PIDs mit dem App-Prozess empfangen. 3) Öffnen/leiten Sie den Debugger-Port weiter und stellen Sie eine Verbindung zum Gerät her. 4. Handshake durchführen. 5) HELO senden und auf Antwort warten.

Geräte-/Prozessseite: a) Zygote forken und ADB mit der PID aktualisieren. b) APNM senden, wenn der Debugger-Port verbunden ist („<pre-initialize>“). c) Prozess an die tatsächliche Anwendung und das Paket binden. d) Aktualisierte APNM senden, wenn der Debugger-Port verbunden ist.

Die beiden oben genannten Ausführungssequenzen laufen vollständig parallel ab. Die einzige Einschränkung ist, dass a) vor 2) erfolgt.

Returns
JdwpPacket

initializeHeapUpdateStatus

public void initializeHeapUpdateStatus ()

isDdmAware

public boolean isDdmAware ()

Gibt true zurück, wenn die Client-VM DDM-fähig ist.

Anrufe sind hier erst nach dem Herstellen der Verbindung möglich.

Returns
boolean

isDebuggerAttached

public boolean isDebuggerAttached ()

Gibt true zurück, wenn derzeit ein Debugger an den Client angehängt ist.

Returns
boolean

isHeapUpdateEnabled

public boolean isHeapUpdateEnabled ()

Gibt zurück, ob ein Heap-Update aktiviert ist.

Returns
boolean

Weitere Informationen

isThreadUpdateEnabled

public boolean isThreadUpdateEnabled ()

Gibt zurück, ob die Thread-Aktualisierung aktiviert ist.

Returns
boolean

isValid

public boolean isValid ()

Gibt zurück, ob diese ClientImpl eine gültige Verbindung zur Anwendungs-VM hat.

Returns
boolean

aufhören

public void kill ()

Sendet eine Kill-Nachricht an die VM. Das funktioniert nicht unbedingt, wenn sich die VM in einem abgestürzten Zustand befindet.

listViewRoots

public void listViewRoots (DebugViewDumpHandler replyHandler)

Parameter
replyHandler DebugViewDumpHandler

notifyVmMirrorExited

public void notifyVmMirrorExited ()

Debugger-VM-Mirrors können ohne Wissen von DDMLib beendet werden, was zu verschiedenen Race- oder Permanent-Client-Verlustbedingungen führen kann. Wir müssen DDMLib darüber informieren, dass der aktuell angehängte Debugger beendet wird und die VM-Spiegelverbindung beendet.

packetFailed

public void packetFailed (JdwpPacket reply)

Bei einer früheren Anfrage ist ein Fehler aufgetreten. Dies ist die erwartete Antwort auf eine HELO-Nachricht, wenn Sie mit einem Nicht-DDM-Client kommunizieren.

Parameter
reply JdwpPacket

lesen

public void read ()

Daten aus unserem Channel lesen. Diese Methode sollte nur von einem Thread aufgerufen werden.

Diese Methode wird aufgerufen, wenn Daten verfügbar sind, aber noch kein vollständiges Paket im Puffer vorhanden ist. Wenn der Puffer voll ist, erweitern Sie ihn.

registrieren

public void register (Selector sel)

Registriert den Client mit einem Selektor. Sollte unmittelbar nach der Client-Erstellung aufgerufen werden.

Parameter
sel Selector

requestAllocationDetails

public void requestAllocationDetails ()

Sendet eine Anfrage an die VM, um Informationen zu allen Zuweisungen zu senden, die seit dem Aufruf von enableAllocationTracker(boolean) mit enable auf null erfolgt sind. Dieser Vorgang ist asynchron.

Die Zuweisungsinformationen sind über ClientData.getAllocations() verfügbar. Die Benachrichtigung, dass die neuen Daten verfügbar sind, wird über AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) mit einem changeMask empfangen, das die Maske Client.CHANGE_HEAP_ALLOCATIONS enthält.

requestAllocationStatus

public void requestAllocationStatus ()

Sendet eine Anfrage an die VM, um den Aktivierungsstatus der Zuweisungsanalyse zu senden. Dies ist ein asynchroner Vorgang.

Der Zuweisungsstatus kann über ClientData.getAllocationStatus() abgerufen werden. Die Benachrichtigung, dass der neue Status verfügbar ist, wird über AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) mit einem changeMask mit der Maske Client.CHANGE_HEAP_ALLOCATION_STATUS empfangen.

requestMethodProfilingStatus

public void requestMethodProfilingStatus ()

Sendet eine Anfrage an die VM, um den Aktivierungsstatus der Methodenprofilerstellung zu senden. Dies ist ein asynchroner Vorgang.

Der Zuweisungsstatus kann über ClientData.getAllocationStatus() abgerufen werden. Die Benachrichtigung, dass der neue Status verfügbar ist, wird über AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) mit einem changeMask mit der Maske Client.CHANGE_HEAP_ALLOCATION_STATUS empfangen.

requestNativeHeapInformation

public boolean requestNativeHeapInformation ()

Sendet eine Anfrage zum Aktualisieren des nativen Heaps. Dies erfolgt asynchron.

Auf die Informationen zum nativen Heap kann über ClientData.getNativeAllocationList() zugegriffen werden. Die Benachrichtigung, dass die neuen Daten verfügbar sind, wird über AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) mit einem changeMask empfangen, das die Maske Client.CHANGE_NATIVE_HEAP_DATA enthält.

Returns
boolean

requestThreadStackTrace

public void requestThreadStackTrace (int threadId)

Sendet einen Request zum Aktualisieren des Thread-Stack-Trace. Dieser Vorgang ist asynchron.

Auf die Thread-Informationen kann über ClientData.getThreads() und ThreadInfo.getStackTrace() zugegriffen werden.

Die Benachrichtigung, dass die neuen Daten verfügbar sind, wird über AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) mit einem changeMask empfangen, das die Maske Client.CHANGE_THREAD_STACKTRACE enthält.

Parameter
threadId int

requestThreadUpdate

public void requestThreadUpdate ()

Sendet eine Thread-Aktualisierungsanfrage. Dieser Vorgang ist asynchron.

Auf die Thread-Informationen kann über ClientData.getThreads() zugegriffen werden. Die Benachrichtigung, dass die neuen Daten verfügbar sind, wird über AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) mit einem changeMask empfangen, das die Maske Client.CHANGE_THREAD_DATA enthält.

setHeapInfoUpdateEnabled

public void setHeapInfoUpdateEnabled (boolean enabled)

Parameter
enabled boolean

setHeapSegmentUpdateEnabled

public void setHeapSegmentUpdateEnabled (boolean enabled)

Parameter
enabled boolean

setHeapUpdateEnabled

public void setHeapUpdateEnabled (boolean enabled)

Aktiviert oder deaktiviert die Heap-Aktualisierung.

Wenn true, wird durch jeden GC die Heap-Informationen des Clients gesendet.

Auf die Heap-Informationen kann über ClientData.getVmHeapData() zugegriffen werden.

Die Benachrichtigung, dass die neuen Daten verfügbar sind, wird über AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) mit einem changeMask mit dem Wert Client.CHANGE_HEAP_DATA empfangen.

Parameter
enabled boolean: das Aktivierungs-Flag

setThreadUpdateEnabled

public void setThreadUpdateEnabled (boolean enabled)

Aktiviert oder deaktiviert die Aktualisierung des Threads.

Wenn true, kann die VM Threadinformationen senden. Thread-Informationen müssen mit requestThreadUpdate() angefordert werden.

Parameter
enabled boolean: Das Aktivierungsflag.

startMethodTracer

public void startMethodTracer ()

startOpenGlTracing

public boolean startOpenGlTracing ()

Returns
boolean

startSamplingProfiler

public void startSamplingProfiler (int samplingInterval, 
                TimeUnit timeUnit)

Parameter
samplingInterval int

timeUnit TimeUnit

stopMethodTracer

public void stopMethodTracer ()

stopOpenGlTracing

public boolean stopOpenGlTracing ()

Returns
boolean

stopSamplingProfiler

public void stopSamplingProfiler ()

toString

public String toString ()

Gibt eine Stringdarstellung des ClientImpl-Objekts zurück.

Returns
String

toggleMethodProfiling

public void toggleMethodProfiling ()

Diese Methode wurde eingestellt.
Verwenden Sie stattdessen startMethodTracer(), stopMethodTracer(), startSamplingProfiler(int, TimeUnit) oder stopSamplingProfiler().

Schaltet den Status für das Methodenprofiling um.

update

public void update (int changeMask)

Parameter
changeMask int

updateHeapInfo

public void updateHeapInfo ()

Löst ein einzelnes Heap-Update aus.

Geschützte Methoden

senden

protected void send (JdwpPacket packet)

Senden Sie ein DDM-Paket an den Client.

Idealerweise können wir dies mit einem einzigen Kanal schreiben. Wenn das nicht passiert, müssen wir verhindern, dass jemand anderes auf den Kanal schreibt, bis dieses Paket abgeschlossen ist. Deshalb synchronisieren wir auf dem Kanal.

Ein weiteres Ziel ist es, unnötige Pufferkopien zu vermeiden. Daher schreiben wir direkt aus dem ByteBuffer des JdwpPacket.

Parameter
packet JdwpPacket