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 |
int
|
getDebuggerListenPort()
Gibt den Debugger-Port für diesen Client zurück. |
IDevice
|
getDevice()
Gibt das |
DeviceImpl
|
getDeviceImpl()
Gibt das |
JdwpPacket
|
getJdwpPacket()
Gibt Informationen zum ersten vollständigen JDWP-Paket im Puffer zurück. |
void
|
initializeHeapUpdateStatus()
|
boolean
|
isDdmAware()
Gibt |
boolean
|
isDebuggerAttached()
Gibt |
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 |
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- |
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 |
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 |
void
|
toggleMethodProfiling()
Diese Methode ist veraltet.
Verwenden Sie stattdessen |
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 |