ClientImpl

public class ClientImpl
extends JdwpAgent implements Client

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


Cela représente un seul client, généralement un processus de VM Dalvik.

Cette classe donne accès aux informations de base sur le client, ainsi qu'aux méthodes permettant d'effectuer des actions sur le client.

Pour obtenir des informations plus détaillées, généralement mises à jour en temps réel, vous pouvez accéder à la classe ClientData. Chaque objet Client possède son propre ClientData, accessible via getClientData().

Résumé

Constructeurs publics

ClientImpl(DeviceImpl device, SocketChannel chan, int pid)

Créez un objet pour une nouvelle connexion client.

Méthodes publiques

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

Fermez le canal du socket client.

boolean ddmSeen()

MonitorThread appelle cette méthode lorsqu'il détecte une requête ou une réponse DDM.

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

Active ou désactive le suivi de l'allocation pour ce client.

void executeGarbageCollector()

Force le client à exécuter son récupérateur de mémoire.

ClientData getClientData()

Renvoie l'objet ClientData contenant ces informations sur le client.

int getDebuggerListenPort()

Renvoie le port du débogueur pour ce client.

IDevice getDevice()

Renvoie le IDevice sur lequel ce client est exécuté.

DeviceImpl getDeviceImpl()

Renvoie le DeviceImpl sur lequel ce client est exécuté.

JdwpPacket getJdwpPacket()

Renvoie des informations sur le premier paquet JDWP complet du tampon.

void initializeHeapUpdateStatus()
boolean isDdmAware()

Renvoie true si la VM cliente est compatible avec DDM.

boolean isDebuggerAttached()

Renvoie true si un débogueur est actuellement associé au client.

boolean isHeapUpdateEnabled()

Indique si une mise à jour du tas est activée.

boolean isThreadUpdateEnabled()

Indique si la mise à jour du thread est activée.

boolean isValid()

Indique si cette ClientImpl dispose d'une connexion valide à la VM de l'application.

void kill()

Envoie un message d'arrêt à la VM.

void listViewRoots(DebugViewDumpHandler replyHandler)
void notifyVmMirrorExited()

Les clones de VM du débogueur peuvent se fermer à l'insu de DDMLib, ce qui entraîne diverses conditions de perte de course ou permanente de Client.

void packetFailed(JdwpPacket reply)

Une demande précédente a échoué.

void read()

Lire les données de notre canal. Ne doit être appelé que depuis un seul thread.

void register(Selector sel)

Enregistre le client auprès d'un sélecteur. Cette méthode doit être appelée immédiatement après la création du client.

void requestAllocationDetails()

Envoie une requête à la VM pour qu'elle envoie les informations sur toutes les allocations qui ont eu lieu depuis l'appel à enableAllocationTracker(boolean) avec enable défini sur null.

void requestAllocationStatus()

Envoie une requête à la VM pour qu'elle envoie l'état d'activation du suivi de l'allocation.

void requestMethodProfilingStatus()

Envoie une requête à la VM pour qu'elle envoie l'état d'activation du profilage de méthode.

boolean requestNativeHeapInformation()

Envoie une demande de mise à jour du tas natif.

void requestThreadStackTrace(int threadId)

Envoie une demande de mise à jour de la trace de pile de threads.

void requestThreadUpdate()

Envoie une demande de mise à jour du thread.

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

Active ou désactive la mise à jour du tas.

void setThreadUpdateEnabled(boolean enabled)

Active ou désactive la mise à jour du thread.

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

Renvoie une représentation sous forme de chaîne de l'objet ClientImpl.

void toggleMethodProfiling()

Cette méthode est obsolète. Utilisez plutôt startMethodTracer(), stopMethodTracer(), startSamplingProfiler(int, TimeUnit) ou stopSamplingProfiler().

void update(int changeMask)
void updateHeapInfo()

Déclenche une seule mise à jour du tas.

Méthodes protégées

void send(JdwpPacket packet)

Envoyez un paquet DDM au client.

Constructeurs publics

ClientImpl

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

Créez un objet pour une nouvelle connexion client.

Paramètres
device DeviceImpl : appareil auquel appartient ce client

chan SocketChannel : ERROR(/SocketChannel) connecté.

pid int : PID du client.

Méthodes publiques

captureView

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

Paramètres
viewRoot String

view String

handler DebugViewDumpHandler

fermer

public void close (boolean notify)

Fermez le canal du socket client. Si un débogueur est associé à nous, fermez-le également.

La fermeture d'un canal le désinscrit automatiquement du sélecteur. Cependant, nous devons parcourir la boucle du sélecteur avant qu'elle ne les libère et ne permette la fermeture des descripteurs de fichiers. L'appelant est censé gérer cela.

Paramètres
notify boolean : indique si les écouteurs doivent être informés d'un changement.

ddmSeen

public boolean ddmSeen ()

MonitorThread appelle cette méthode lorsqu'il détecte une requête ou une réponse DDM. Si nous n'avons jamais vu de paquet DDM auparavant, nous faisons passer l'état à ST_READY et renvoyons "false". Sinon, renvoie simplement "true".

L'idée est d'informer MonitorThread lorsque nous voyons un paquet DDM pour la première fois, afin que nous puissions envoyer une diffusion aux gestionnaires lorsqu'une connexion client est établie. Cette méthode est synchronisée afin que nous n'envoyions la diffusion qu'une seule fois.

Renvoie
boolean

dumpDisplayList

public void dumpDisplayList (String viewRoot, 
                String view)

Paramètres
viewRoot String

view String

dumpViewHierarchy

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

Paramètres
viewRoot String

skipChildren boolean

includeProperties boolean

useV2 boolean

handler DebugViewDumpHandler

enableAllocationTracker

public void enableAllocationTracker (boolean enable)

Active ou désactive le suivi de l'allocation pour ce client.

Si cette option est activée, la VM commence à suivre les informations d'allocation. Un appel à requestAllocationDetails() permet à la VM d'envoyer des informations sur toutes les allocations qui ont eu lieu entre l'activation et la demande.

Paramètres
enable boolean

executeGarbageCollector

public void executeGarbageCollector ()

Force le client à exécuter son récupérateur de mémoire.

getClientData

public ClientData getClientData ()

Renvoie l'objet ClientData contenant ces informations sur le client.

Renvoie
ClientData

getDebuggerListenPort

public int getDebuggerListenPort ()

Renvoie le port du débogueur pour ce client.

Renvoie
int

getDevice

public IDevice getDevice ()

Renvoie le IDevice sur lequel ce client est exécuté.

Renvoie
IDevice

getDeviceImpl

public DeviceImpl getDeviceImpl ()

Renvoie le DeviceImpl sur lequel ce client est exécuté.

Renvoie
DeviceImpl

getJdwpPacket

public JdwpPacket getJdwpPacket ()

Renvoie des informations sur le premier paquet JDWP complet du tampon.

Si nous n'avons pas encore de paquet complet, renvoyez la valeur "null".

Si nous n'avons pas encore reçu l'établissement de liaison JDWP, nous le recherchons ici et le consommons sans l'admettre. Dès réception, nous envoyons le message "HELO", ce qui peut entraîner une IOException.

Notez que l'ordre des opérations pour établir une connexion est le suivant :

Côté hôte : 1) adb track-jdwp ; 2) recevoir la liste mise à jour des PID contenant le processus de l'application. 3) Ouvrez/transférez le port du débogueur et connectez-vous à l'appareil. 4) Effectuez le handshake. 5) Envoyez HELO et attendez la réponse.

Côté appareil/processus : a) Fork zygote et mise à jour d'ADB avec le PID. b) Envoi d'APNM si le port du débogueur est connecté ("<pre-initialize>"). c) Liaison du processus à l'application et au package réels. d) Envoi d'APNM mis à jour si le port du débogueur est connecté.

Les deux séquences d'exécution ci-dessus s'exécutent entièrement en parallèle, la seule contrainte étant que a) se produit avant 2).

Renvoie
JdwpPacket

initializeHeapUpdateStatus

public void initializeHeapUpdateStatus ()

isDdmAware

public boolean isDdmAware ()

Renvoie true si la VM cliente est compatible avec DDM.

L'appel n'est autorisé qu'une fois la connexion établie.

Renvoie
boolean

isDebuggerAttached

public boolean isDebuggerAttached ()

Renvoie true si un débogueur est actuellement associé au client.

Renvoie
boolean

isHeapUpdateEnabled

public boolean isHeapUpdateEnabled ()

Indique si une mise à jour du tas est activée.

Renvoie
boolean

isThreadUpdateEnabled

public boolean isThreadUpdateEnabled ()

Indique si la mise à jour du thread est activée.

Renvoie
boolean

isValid

public boolean isValid ()

Indique si cette ClientImpl dispose d'une connexion valide à la VM de l'application.

Renvoie
boolean

arrête

public void kill ()

Envoie un message d'arrêt à la VM. Cette méthode ne fonctionne pas nécessairement si la VM est dans un état d'échec.

listViewRoots

public void listViewRoots (DebugViewDumpHandler replyHandler)

Paramètres
replyHandler DebugViewDumpHandler

notifyVmMirrorExited

public void notifyVmMirrorExited ()

Les clones de VM du débogueur peuvent se fermer à l'insu de DDMLib, ce qui entraîne diverses conditions de perte de course ou permanente de Client. Nous devons informer DDMLib que le débogueur actuellement associé est en train de se fermer et de mettre fin à sa connexion miroir de VM.

packetFailed (échec du paquet)

public void packetFailed (JdwpPacket reply)

Une demande précédente a échoué. Il s'agit de la réponse attendue à un message HELO lorsque vous communiquez avec un client non DDM.

Paramètres
reply JdwpPacket

lire

public void read ()

Lire les données de notre canal. Ne doit être appelé que depuis un seul thread.

Cette méthode est appelée lorsque les données sont disponibles, mais que nous n'avons pas encore de paquet complet dans le tampon. Si le tampon est plein, développez-le.

s'inscrire

public void register (Selector sel)

Enregistre le client auprès d'un sélecteur. Cette méthode doit être appelée immédiatement après la création du client.

Paramètres
sel Selector

requestAllocationDetails

public void requestAllocationDetails ()

Envoie une requête à la VM pour qu'elle envoie les informations sur toutes les allocations qui ont eu lieu depuis l'appel à enableAllocationTracker(boolean) avec enable défini sur null. Il s'agit d'une opération asynchrone.

Vous pouvez accéder aux informations sur l'allocation via ClientData.getAllocations(). La notification indiquant que les nouvelles données sont disponibles sera reçue via AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) avec un changeMask contenant le masque Client.CHANGE_HEAP_ALLOCATIONS.

requestAllocationStatus

public void requestAllocationStatus ()

Envoie une requête à la VM pour qu'elle envoie l'état d'activation du suivi de l'allocation. Il s'agit d'une opération asynchrone.

L'état de l'allocation est accessible via ClientData.getAllocationStatus(). La notification indiquant que le nouvel état est disponible sera reçue via AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) avec un changeMask contenant le masque Client.CHANGE_HEAP_ALLOCATION_STATUS.

requestMethodProfilingStatus

public void requestMethodProfilingStatus ()

Envoie une requête à la VM pour qu'elle envoie l'état d'activation du profilage de méthode. Il s'agit d'une opération asynchrone.

L'état de l'allocation est accessible via ClientData.getAllocationStatus(). La notification indiquant que le nouvel état est disponible sera reçue via AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) avec un changeMask contenant le masque Client.CHANGE_HEAP_ALLOCATION_STATUS.

requestNativeHeapInformation

public boolean requestNativeHeapInformation ()

Envoie une requête de mise à jour du tas natif. Cette opération est asynchrone.

Les informations sur le tas natif sont accessibles via ClientData.getNativeAllocationList(). La notification indiquant que les nouvelles données sont disponibles sera reçue via AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) avec un changeMask contenant le masque Client.CHANGE_NATIVE_HEAP_DATA.

Renvoie
boolean

requestThreadStackTrace

public void requestThreadStackTrace (int threadId)

Envoie une demande de mise à jour de la trace de pile de threads. Il s'agit d'une opération asynchrone.

Les informations sur le fil de discussion sont accessibles par ClientData.getThreads() et ThreadInfo.getStackTrace().

Vous recevrez une notification indiquant que les nouvelles données sont disponibles via AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) avec un changeMask contenant le masque Client.CHANGE_THREAD_STACKTRACE.

Paramètres
threadId int

requestThreadUpdate

public void requestThreadUpdate ()

Envoie une demande de mise à jour du thread. Il s'agit d'une opération asynchrone.

Les informations sur le thread sont accessibles via ClientData.getThreads(). La notification indiquant que les nouvelles données sont disponibles sera reçue via AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) avec un changeMask contenant le masque Client.CHANGE_THREAD_DATA.

setHeapInfoUpdateEnabled

public void setHeapInfoUpdateEnabled (boolean enabled)

Paramètres
enabled boolean

setHeapSegmentUpdateEnabled

public void setHeapSegmentUpdateEnabled (boolean enabled)

Paramètres
enabled boolean

setHeapUpdateEnabled

public void setHeapUpdateEnabled (boolean enabled)

Active ou désactive la mise à jour du tas.

Si la valeur est true, tout GC entraînera l'envoi des informations de tas par le client.

Les informations sur le tas sont accessibles via ClientData.getVmHeapData().

Vous recevrez une notification indiquant que les nouvelles données sont disponibles via AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) avec un changeMask contenant la valeur Client.CHANGE_HEAP_DATA.

Paramètres
enabled boolean : indicateur d'activation

setThreadUpdateEnabled

public void setThreadUpdateEnabled (boolean enabled)

Active ou désactive la mise à jour du thread.

Si la valeur est true, la VM pourra envoyer des informations sur les threads. Les informations sur les threads doivent être demandées avec requestThreadUpdate().

Paramètres
enabled boolean : indicateur d'activation.

startMethodTracer

public void startMethodTracer ()

startOpenGlTracing

public boolean startOpenGlTracing ()

Renvoie
boolean

startSamplingProfiler

public void startSamplingProfiler (int samplingInterval, 
                TimeUnit timeUnit)

Paramètres
samplingInterval int

timeUnit TimeUnit

stopMethodTracer

public void stopMethodTracer ()

stopOpenGlTracing

public boolean stopOpenGlTracing ()

Renvoie
boolean

stopSamplingProfiler

public void stopSamplingProfiler ()

toString

public String toString ()

Renvoie une représentation sous forme de chaîne de l'objet ClientImpl.

Renvoie
String

toggleMethodProfiling

public void toggleMethodProfiling ()

Cette méthode est obsolète.
Utilisez plutôt startMethodTracer(), stopMethodTracer(), startSamplingProfiler(int, TimeUnit) ou stopSamplingProfiler().

Active ou désactive l'état du profilage de la méthode.

update

public void update (int changeMask)

Paramètres
changeMask int

updateHeapInfo

public void updateHeapInfo ()

Déclenche une seule mise à jour du tas.

Méthodes protégées

envoyer

protected void send (JdwpPacket packet)

Envoyez un paquet DDM au client.

Idéalement, nous pouvons le faire avec une seule écriture de canal. Si cela ne se produit pas, nous devons empêcher toute autre personne d'écrire sur le canal jusqu'à ce que ce paquet soit terminé. Nous synchronisons donc le canal.

Un autre objectif est d'éviter les copies de tampon inutiles. Nous écrivons donc directement à partir du ByteBuffer de JdwpPacket.

Paramètres
packet JdwpPacket