ClientImpl

public class ClientImpl
extends JdwpAgent implements Client

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


Representa un solo cliente, por lo general, un proceso de VM de Dalvik.

Esta clase brinda acceso a información básica del cliente, así como a métodos para realizar acciones en el cliente.

Se puede acceder a información más detallada, que suele actualizarse en tiempo real, a través de la clase ClientData. Cada objeto Client tiene su propio ClientData al que se accede a través de getClientData().

Resumen

Constructores públicos

ClientImpl(DeviceImpl device, SocketChannel chan, int pid)

Crea un objeto para una conexión de cliente nueva.

Métodos públicos

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

Cierra el canal de socket del cliente.

boolean ddmSeen()

MonitorThread llama a este método cuando ve una solicitud o respuesta de DDM.

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

Habilita o inhabilita el Allocation tracker para este cliente.

void executeGarbageCollector()

Fuerza al cliente a ejecutar su recolector de elementos no utilizados.

ClientData getClientData()

Devuelve el objeto ClientData que contiene la información de este cliente.

int getDebuggerListenPort()

Devuelve el puerto del depurador para este cliente.

IDevice getDevice()

Devuelve el IDevice en el que se ejecuta este cliente.

DeviceImpl getDeviceImpl()

Devuelve el DeviceImpl en el que se ejecuta este cliente.

JdwpPacket getJdwpPacket()

Es la información de devolución del primer paquete JDWP completo en el búfer.

void initializeHeapUpdateStatus()
boolean isDdmAware()

Devuelve true si la VM del cliente es compatible con DDM.

boolean isDebuggerAttached()

Devuelve true si hay un depurador conectado al cliente.

boolean isHeapUpdateEnabled()

Devuelve si alguna actualización del montón está habilitada.

boolean isThreadUpdateEnabled()

Devuelve si la actualización del hilo está habilitada.

boolean isValid()

Devuelve un valor que indica si este ClientImpl tiene una conexión válida con la VM de la aplicación.

void kill()

Envía un mensaje de cierre a la VM.

void listViewRoots(DebugViewDumpHandler replyHandler)
void notifyVmMirrorExited()

Los duplicados de la VM del depurador pueden salir por detrás de DDMLib, lo que genera varias condiciones de pérdida de Client permanentes o de carrera.

void packetFailed(JdwpPacket reply)

Se produjo un error en una solicitud anterior.

void read()

Lee datos de nuestro canal y solo se debe llamar desde un subproceso.

void register(Selector sel)

Registra el cliente con un Selector y se debe llamar inmediatamente después de la creación del cliente.

void requestAllocationDetails()

Envía una solicitud a la VM para que envíe la información sobre todas las asignaciones que se produjeron desde la llamada a enableAllocationTracker(boolean) con enable establecido en null.

void requestAllocationStatus()

Envía una solicitud a la VM para que envíe el estado de habilitación del seguimiento de asignación.

void requestMethodProfilingStatus()

Envía una solicitud a la VM para que envíe el estado de habilitación de la generación de perfiles de métodos.

boolean requestNativeHeapInformation()

Envía una solicitud de actualización del heap nativo.

void requestThreadStackTrace(int threadId)

Envía una solicitud de actualización del registro de seguimiento de la pila de subprocesos.

void requestThreadUpdate()

Envía una solicitud de actualización del subproceso.

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

Habilita o inhabilita la actualización del montón.

void setThreadUpdateEnabled(boolean enabled)

Habilita o inhabilita la actualización del subproceso.

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

Devuelve una representación de cadena del objeto ClientImpl.

void toggleMethodProfiling()

Este método dejó de estar disponible. En su lugar, usa startMethodTracer(), stopMethodTracer(), startSamplingProfiler(int, TimeUnit) o stopSamplingProfiler().

void update(int changeMask)
void updateHeapInfo()

Activa una sola actualización del montón.

Métodos protegidos

void send(JdwpPacket packet)

Envía un paquete de DDM al cliente.

Constructores públicos

ClientImpl

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

Crea un objeto para una conexión de cliente nueva.

Parámetros
device DeviceImpl: Es el dispositivo al que pertenece este cliente.

chan SocketChannel: Es el ERROR(/SocketChannel) conectado.

pid int: Es el PID del cliente.

Métodos públicos

captureView

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

Parámetros
viewRoot String

view String

handler DebugViewDumpHandler

cerrar

public void close (boolean notify)

Cierra el canal de socket del cliente. Si hay un depurador asociado con nosotros, ciérralo también.

Si cierras un canal, se anulará automáticamente su registro en el selector. Sin embargo, debemos iterar a través del bucle del selector antes de que realmente los deje ir y permita que se cierren los descriptores de archivos. Se espera que la persona que llama administre eso.

Parámetros
notify boolean: Indica si se debe notificar a los objetos de escucha sobre un cambio.

ddmSeen

public boolean ddmSeen ()

MonitorThread llama a este método cuando ve una solicitud o respuesta de DDM. Si no vimos un paquete de DDM antes, avanzamos el estado a ST_READY y devolvemos "false". De lo contrario, solo devuelve verdadero.

La idea es que MonitorThread sepa cuándo vemos un paquete DDM por primera vez, de modo que podamos enviar una transmisión a los controladores cuando se realice una conexión del cliente. Este método está sincronizado para que solo enviemos la transmisión una vez.

Muestra
boolean

dumpDisplayList

public void dumpDisplayList (String viewRoot, 
                String view)

Parámetros
viewRoot String

view String

dumpViewHierarchy

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

Parámetros
viewRoot String

skipChildren boolean

includeProperties boolean

useV2 boolean

handler DebugViewDumpHandler

enableAllocationTracker

public void enableAllocationTracker (boolean enable)

Habilita o inhabilita el Allocation tracker para este cliente.

Si está habilitada, la VM comenzará a hacer un seguimiento de la información de asignación. Una llamada a requestAllocationDetails() hará que la VM envíe la información sobre todas las asignaciones que ocurrieron entre la habilitación y la solicitud.

Parámetros
enable boolean

executeGarbageCollector

public void executeGarbageCollector ()

Fuerza al cliente a ejecutar su recolector de elementos no utilizados.

getClientData

public ClientData getClientData ()

Devuelve el objeto ClientData que contiene la información de este cliente.

Muestra
ClientData

getDebuggerListenPort

public int getDebuggerListenPort ()

Devuelve el puerto del depurador para este cliente.

Muestra
int

getDevice

public IDevice getDevice ()

Devuelve el IDevice en el que se ejecuta este cliente.

Muestra
IDevice

getDeviceImpl

public DeviceImpl getDeviceImpl ()

Devuelve el DeviceImpl en el que se ejecuta este cliente.

Muestra
DeviceImpl

getJdwpPacket

public JdwpPacket getJdwpPacket ()

Es la información de devolución del primer paquete JDWP completo en el búfer.

Si aún no tenemos un paquete completo, devolvemos un valor nulo.

Si aún no recibimos el handshake de JDWP, lo observamos aquí y lo consumimos sin admitir que lo hicimos. Al recibirlo, enviamos el mensaje "HELO", por lo que esto puede arrojar una IOException.

Ten en cuenta que el orden de las operaciones para establecer una conexión es el siguiente:

En el host: 1) adb track-jdwp 2) Recibe la lista actualizada de PIDs que contiene el proceso de la app. 3) Abre o reenvía el puerto del depurador y conéctate al dispositivo. 4) Realiza el protocolo de enlace. 5) Envía HELO y espera la respuesta.

Lado del dispositivo o proceso: a) Bifurca zygote y actualiza ADB con el PID. b) Envía APNM si el puerto del depurador está conectado ("<pre-initialize>"). c) Vincula el proceso a la aplicación y el paquete reales. d) Envía el APNM actualizado si el puerto del depurador está conectado.

Las dos secuencias de ejecución anteriores se ejecutan de forma completamente paralela, con la única restricción de que a) ocurre antes de 2).

Muestra
JdwpPacket

initializeHeapUpdateStatus

public void initializeHeapUpdateStatus ()

isDdmAware

public boolean isDdmAware ()

Devuelve true si la VM del cliente es compatible con DDM.

Solo se permite llamar aquí después de que se haya establecido la conexión.

Muestra
boolean

isDebuggerAttached

public boolean isDebuggerAttached ()

Devuelve true si hay un depurador conectado al cliente.

Muestra
boolean

isHeapUpdateEnabled

public boolean isHeapUpdateEnabled ()

Devuelve si alguna actualización del montón está habilitada.

Muestra
boolean

isThreadUpdateEnabled

public boolean isThreadUpdateEnabled ()

Devuelve si la actualización del hilo está habilitada.

Muestra
boolean

isValid

public boolean isValid ()

Devuelve un valor que indica si este ClientImpl tiene una conexión válida con la VM de la aplicación.

Muestra
boolean

matar

public void kill ()

Envía un mensaje de cierre a la VM. Esto no necesariamente funciona si la VM está en un estado de falla.

listViewRoots

public void listViewRoots (DebugViewDumpHandler replyHandler)

Parámetros
replyHandler DebugViewDumpHandler

notifyVmMirrorExited

public void notifyVmMirrorExited ()

Los duplicados de la VM del depurador pueden salir por detrás de DDMLib, lo que genera varias condiciones de pérdida de Client permanentes o de carrera. Debemos notificar a DDMLib que el depurador adjunto actualmente está saliendo y cerrando su conexión de duplicación de VM.

packetFailed

public void packetFailed (JdwpPacket reply)

Se produjo un error en una solicitud anterior. Esta es la respuesta esperada a un mensaje HELO cuando se habla con un cliente que no es de DDM.

Parámetros
reply JdwpPacket

leer

public void read ()

Lee datos de nuestro canal y solo se debe llamar desde un subproceso.

Se llama a este método cuando se sabe que hay datos disponibles y aún no tenemos un paquete completo en el búfer. Si el búfer está al máximo de su capacidad, expándelo.

registrar

public void register (Selector sel)

Registra el cliente con un Selector y se debe llamar inmediatamente después de la creación del cliente.

Parámetros
sel Selector

requestAllocationDetails

public void requestAllocationDetails ()

Envía una solicitud a la VM para que envíe la información sobre todas las asignaciones que se produjeron desde la llamada a enableAllocationTracker(boolean) con enable establecido en null. Esta operación es asíncrona.

ClientData.getAllocations() puede acceder a la información de asignación. La notificación de que los datos nuevos están disponibles se recibirá a través de AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) con un changeMask que contiene la máscara Client.CHANGE_HEAP_ALLOCATIONS.

requestAllocationStatus

public void requestAllocationStatus ()

Envía una solicitud a la VM para que envíe el estado de habilitación del seguimiento de asignación. Esta operación es asíncrona.

ClientData.getAllocationStatus() puede acceder al estado de asignación. La notificación de que el nuevo estado está disponible se recibirá a través de AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) con un changeMask que contiene la máscara Client.CHANGE_HEAP_ALLOCATION_STATUS.

requestMethodProfilingStatus

public void requestMethodProfilingStatus ()

Envía una solicitud a la VM para que envíe el estado de habilitación de la generación de perfiles de métodos. Esta operación es asíncrona.

ClientData.getAllocationStatus() puede acceder al estado de asignación. La notificación de que el nuevo estado está disponible se recibirá a través de AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) con un changeMask que contiene la máscara Client.CHANGE_HEAP_ALLOCATION_STATUS.

requestNativeHeapInformation

public boolean requestNativeHeapInformation ()

Envía una solicitud de actualización del heap nativo. Esta acción es asíncrona.

Se puede acceder a la información del heap nativo con ClientData.getNativeAllocationList(). La notificación de que los datos nuevos están disponibles se recibirá a través de AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) con un changeMask que contiene la máscara Client.CHANGE_NATIVE_HEAP_DATA.

Muestra
boolean

requestThreadStackTrace

public void requestThreadStackTrace (int threadId)

Envía una solicitud de actualización del registro de seguimiento de la pila de subprocesos. Esta operación es asíncrona.

ClientData.getThreads() y ThreadInfo.getStackTrace() pueden acceder a la información del subproceso.

La notificación de que los datos nuevos están disponibles se recibirá a través de AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) con un changeMask que contiene la máscara Client.CHANGE_THREAD_STACKTRACE.

Parámetros
threadId int

requestThreadUpdate

public void requestThreadUpdate ()

Envía una solicitud de actualización del subproceso. Esta operación es asíncrona.

ClientData.getThreads() puede acceder a la información del subproceso. La notificación de que los datos nuevos están disponibles se recibirá a través de AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) con un changeMask que contiene la máscara Client.CHANGE_THREAD_DATA.

setHeapInfoUpdateEnabled

public void setHeapInfoUpdateEnabled (boolean enabled)

Parámetros
enabled boolean

setHeapSegmentUpdateEnabled

public void setHeapSegmentUpdateEnabled (boolean enabled)

Parámetros
enabled boolean

setHeapUpdateEnabled

public void setHeapUpdateEnabled (boolean enabled)

Habilita o inhabilita la actualización del montón.

Si es true, cualquier GC hará que el cliente envíe su información de montón.

Se puede acceder a la información del heap con ClientData.getVmHeapData().

La notificación de que los datos nuevos están disponibles se recibirá a través de AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) con un changeMask que contiene el valor Client.CHANGE_HEAP_DATA.

Parámetros
enabled boolean: Es la marca de habilitación.

setThreadUpdateEnabled

public void setThreadUpdateEnabled (boolean enabled)

Habilita o inhabilita la actualización del subproceso.

Si es true, la VM podrá enviar información de subprocesos. La información del subproceso se debe solicitar con requestThreadUpdate().

Parámetros
enabled boolean: Es la marca de habilitación.

startMethodTracer

public void startMethodTracer ()

startOpenGlTracing

public boolean startOpenGlTracing ()

Muestra
boolean

startSamplingProfiler

public void startSamplingProfiler (int samplingInterval, 
                TimeUnit timeUnit)

Parámetros
samplingInterval int

timeUnit TimeUnit

stopMethodTracer

public void stopMethodTracer ()

stopOpenGlTracing

public boolean stopOpenGlTracing ()

Muestra
boolean

stopSamplingProfiler

public void stopSamplingProfiler ()

toString

public String toString ()

Devuelve una representación de cadena del objeto ClientImpl.

Muestra
String

toggleMethodProfiling

public void toggleMethodProfiling ()

Este método dejó de estar disponible.
En su lugar, usa startMethodTracer(), stopMethodTracer(), startSamplingProfiler(int, TimeUnit) o stopSamplingProfiler().

Activa o desactiva el estado de generación de perfiles de métodos.

update

public void update (int changeMask)

Parámetros
changeMask int

updateHeapInfo

public void updateHeapInfo ()

Activa una sola actualización del montón.

Métodos protegidos

enviar

protected void send (JdwpPacket packet)

Envía un paquete de DDM al cliente.

Lo ideal es que podamos hacerlo con una sola escritura de canal. Si eso no sucede, debemos impedir que cualquier otra persona escriba en el canal hasta que se complete este paquete, por lo que nos sincronizamos en el canal.

Otro objetivo es evitar copias innecesarias del búfer, por lo que escribimos directamente desde el ByteBuffer de JdwpPacket.

Parámetros
packet JdwpPacket