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 |
int
|
getDebuggerListenPort()
Devuelve el puerto del depurador para este cliente. |
IDevice
|
getDevice()
Devuelve el |
DeviceImpl
|
getDeviceImpl()
Devuelve el |
JdwpPacket
|
getJdwpPacket()
Es la información de devolución del primer paquete JDWP completo en el búfer. |
void
|
initializeHeapUpdateStatus()
|
boolean
|
isDdmAware()
Devuelve |
boolean
|
isDebuggerAttached()
Devuelve |
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 |
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 |
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 |
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 |
void
|
toggleMethodProfiling()
Este método dejó de estar disponible.
En su lugar, usa |
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 |
|
También:
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 |