ClientImpl

public class ClientImpl
extends JdwpAgent implements Client

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


Rappresenta un singolo client, in genere un processo VM Dalvik.

Questa classe consente di accedere alle informazioni di base del client, nonché ai metodi per eseguire azioni sul client.

Informazioni più dettagliate, generalmente aggiornate in tempo reale, sono accessibili tramite la classe ClientData. Ogni oggetto Client ha il proprio ClientData a cui si accede tramite getClientData().

Riepilogo

Costruttori pubblici

ClientImpl(DeviceImpl device, SocketChannel chan, int pid)

Crea un oggetto per una nuova connessione client.

Metodi pubblici

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

Chiudi il canale del socket client.

boolean ddmSeen()

MonitorThread chiama questo metodo quando rileva una richiesta o una risposta DDM.

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

Attiva o disattiva lo strumento di monitoraggio dell'allocazione per questo cliente.

void executeGarbageCollector()

Forza il client a eseguire il garbage collector.

ClientData getClientData()

Restituisce l'oggetto ClientData contenente queste informazioni sul cliente.

int getDebuggerListenPort()

Restituisce la porta del debugger per questo client.

IDevice getDevice()

Restituisce il IDevice su cui è in esecuzione questo client.

DeviceImpl getDeviceImpl()

Restituisce il DeviceImpl su cui è in esecuzione questo client.

JdwpPacket getJdwpPacket()

Restituisce le informazioni per il primo pacchetto JDWP completo nel buffer.

void initializeHeapUpdateStatus()
boolean isDdmAware()

Restituisce true se la VM client è compatibile con DDM.

boolean isDebuggerAttached()

Restituisce true se è attualmente collegato un debugger al client.

boolean isHeapUpdateEnabled()

Restituisce un valore che indica se è abilitato un aggiornamento dell'heap.

boolean isThreadUpdateEnabled()

Indica se l'aggiornamento del thread è abilitato.

boolean isValid()

Restituisce un valore che indica se questo ClientImpl ha una connessione valida alla VM dell'applicazione.

void kill()

Invia un messaggio di interruzione alla VM.

void listViewRoots(DebugViewDumpHandler replyHandler)
void notifyVmMirrorExited()

I mirror delle VM di debug possono uscire da DDMLib, causando varie condizioni di perdita di perma-Client o di competizione.

void packetFailed(JdwpPacket reply)

Una richiesta precedente ha generato un errore.

void read()

Read data from our channel, should only be called from one thread.

void register(Selector sel)

Registra il client con un selettore. Deve essere chiamato immediatamente dopo la creazione del client.

void requestAllocationDetails()

Invia una richiesta alla VM per inviare le informazioni su tutte le allocazioni avvenute dalla chiamata a enableAllocationTracker(boolean) con enable impostato su null.

void requestAllocationStatus()

Invia una richiesta alla VM per inviare lo stato di attivazione del monitoraggio dell'allocazione.

void requestMethodProfilingStatus()

Invia una richiesta alla VM per inviare lo stato di attivazione della profilazione del metodo.

boolean requestNativeHeapInformation()

Invia una richiesta di aggiornamento dell'heap nativo.

void requestThreadStackTrace(int threadId)

Invia una richiesta di aggiornamento della traccia dello stack del thread.

void requestThreadUpdate()

Invia una richiesta di aggiornamento del thread.

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

Attiva o disattiva l'aggiornamento dell'heap.

void setThreadUpdateEnabled(boolean enabled)

Attiva o disattiva l'aggiornamento del thread.

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

Restituisce una rappresentazione stringa dell'oggetto ClientImpl.

void toggleMethodProfiling()

Questo metodo è obsoleto. Utilizza invece startMethodTracer(), stopMethodTracer(), startSamplingProfiler(int, TimeUnit) o stopSamplingProfiler().

void update(int changeMask)
void updateHeapInfo()

Attiva un singolo aggiornamento dell'heap.

Metodi protetti

void send(JdwpPacket packet)

Invia un pacchetto DDM al client.

Costruttori pubblici

ClientImpl

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

Crea un oggetto per una nuova connessione client.

Parametri
device DeviceImpl: il dispositivo a cui appartiene questo client

chan SocketChannel: il ERROR(/SocketChannel) connesso.

pid int: il PID client.

Metodi pubblici

captureView

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

Parametri
viewRoot String

view String

handler DebugViewDumpHandler

chiudi

public void close (boolean notify)

Chiudi il canale del socket client. Se è presente un debugger associato a noi, chiudilo.

La chiusura di un canale comporta la sua rimozione automatica dal selettore. Tuttavia, dobbiamo scorrere il ciclo del selettore prima che li rilasci e consenta la chiusura dei descrittori di file. Il chiamante è tenuto a gestirlo.

Parametri
notify boolean: se inviare o meno una notifica agli ascoltatori di una modifica.

ddmSeen

public boolean ddmSeen ()

MonitorThread chiama questo metodo quando rileva una richiesta o una risposta DDM. Se non abbiamo mai visto un pacchetto DDM, avanziamo lo stato a ST_READY e restituiamo "false". In caso contrario, restituisci true.

L'idea è di comunicare a MonitorThread quando viene visualizzato per la prima volta un pacchetto DDM, in modo da poter inviare una trasmissione ai gestori quando viene stabilita una connessione client. Questo metodo è sincronizzato in modo da inviare la trasmissione una sola volta.

Ritorni
boolean

dumpDisplayList

public void dumpDisplayList (String viewRoot, 
                String view)

Parametri
viewRoot String

view String

dumpViewHierarchy

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

Parametri
viewRoot String

skipChildren boolean

includeProperties boolean

useV2 boolean

handler DebugViewDumpHandler

enableAllocationTracker

public void enableAllocationTracker (boolean enable)

Attiva o disattiva lo strumento di monitoraggio dell'allocazione per questo cliente.

Se attivata, la VM inizierà a monitorare le informazioni di allocazione. Una chiamata a requestAllocationDetails() farà in modo che la VM invii le informazioni su tutte le allocazioni avvenute tra l'attivazione e la richiesta.

Parametri
enable boolean

executeGarbageCollector

public void executeGarbageCollector ()

Forza il client a eseguire il garbage collector.

getClientData

public ClientData getClientData ()

Restituisce l'oggetto ClientData contenente queste informazioni sul cliente.

Ritorni
ClientData

getDebuggerListenPort

public int getDebuggerListenPort ()

Restituisce la porta del debugger per questo client.

Ritorni
int

getDevice

public IDevice getDevice ()

Restituisce il IDevice su cui è in esecuzione questo client.

Ritorni
IDevice

getDeviceImpl

public DeviceImpl getDeviceImpl ()

Restituisce il DeviceImpl su cui è in esecuzione questo client.

Ritorni
DeviceImpl

getJdwpPacket

public JdwpPacket getJdwpPacket ()

Restituisce le informazioni per il primo pacchetto JDWP completo nel buffer.

Se non abbiamo ancora un pacchetto completo, restituisci un valore nullo.

Se non abbiamo ancora ricevuto l'handshake JDWP, lo cerchiamo qui e lo utilizziamo senza ammettere di averlo fatto. Al ricevimento inviamo il messaggio "HELO", motivo per cui può generare un'eccezione IOException.

Tieni presente che l'ordine delle operazioni per stabilire una connessione è:

Lato host: 1) adb track-jdwp 2) Ricevi l'elenco aggiornato dei PID contenenti il processo dell'app. 3) Apri/inoltra la porta del debugger e connettiti al dispositivo. 4) Esegui l'handshake. 5) Invia HELO e attendi la risposta.

Lato dispositivo/processo: a) Biforca zygote e aggiorna ADB con il PID. b) Invia APNM se la porta del debugger è connessa ("<pre-initialize>"). c) Collega il processo all'applicazione e al pacchetto effettivi. d) Invia APNM aggiornato se la porta del debugger è connessa.

Le due sequenze di esecuzione precedenti vengono eseguite completamente in parallelo, con l'unico vincolo che a) avvenga prima di 2).

Ritorni
JdwpPacket

initializeHeapUpdateStatus

public void initializeHeapUpdateStatus ()

isDdmAware

public boolean isDdmAware ()

Restituisce true se la VM client è compatibile con DDM.

Le chiamate qui sono consentite solo dopo che la connessione è stata stabilita.

Ritorni
boolean

isDebuggerAttached

public boolean isDebuggerAttached ()

Restituisce true se è attualmente collegato un debugger al client.

Ritorni
boolean

isHeapUpdateEnabled

public boolean isHeapUpdateEnabled ()

Restituisce un valore che indica se è abilitato un aggiornamento dell'heap.

Ritorni
boolean

isThreadUpdateEnabled

public boolean isThreadUpdateEnabled ()

Indica se l'aggiornamento del thread è abilitato.

Ritorni
boolean

isValid

public boolean isValid ()

Restituisce un valore che indica se questo ClientImpl ha una connessione valida alla VM dell'applicazione.

Ritorni
boolean

uccidere

public void kill ()

Invia un messaggio di interruzione alla VM. Questa operazione non funziona necessariamente se la VM è in stato di arresto anomalo.

listViewRoots

public void listViewRoots (DebugViewDumpHandler replyHandler)

Parametri
replyHandler DebugViewDumpHandler

notifyVmMirrorExited

public void notifyVmMirrorExited ()

I mirror delle VM di debug possono uscire da DDMLib, causando varie condizioni di perdita di perma-Client o di competizione. Dobbiamo notificare a DDMLib che il debugger attualmente collegato sta uscendo e interrompendo la connessione mirror della VM.

packetFailed

public void packetFailed (JdwpPacket reply)

Una richiesta precedente ha generato un errore. Questa è la risposta prevista a un messaggio HELO quando si comunica con un client non DDM.

Parametri
reply JdwpPacket

leggere

public void read ()

Read data from our channel, should only be called from one thread.

Viene chiamato quando è noto che i dati sono disponibili e non abbiamo ancora un pacchetto completo nel buffer. Se il buffer è pieno, espandilo.

registrare

public void register (Selector sel)

Registra il client con un selettore. Deve essere chiamato immediatamente dopo la creazione del client.

Parametri
sel Selector

requestAllocationDetails

public void requestAllocationDetails ()

Invia una richiesta alla VM per inviare le informazioni su tutte le allocazioni avvenute dalla chiamata a enableAllocationTracker(boolean) con enable impostato su null. Questa operazione è asincrona.

Le informazioni sull'assegnazione sono accessibili da ClientData.getAllocations(). La notifica della disponibilità dei nuovi dati verrà ricevuta tramite AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) con un changeMask contenente la maschera Client.CHANGE_HEAP_ALLOCATIONS.

requestAllocationStatus

public void requestAllocationStatus ()

Invia una richiesta alla VM per inviare lo stato di attivazione del monitoraggio dell'allocazione. Questa operazione è asincrona.

Lo stato dell'assegnazione è accessibile da ClientData.getAllocationStatus(). La notifica che il nuovo stato è disponibile verrà ricevuta tramite AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) con un changeMask contenente la maschera Client.CHANGE_HEAP_ALLOCATION_STATUS.

requestMethodProfilingStatus

public void requestMethodProfilingStatus ()

Invia una richiesta alla VM per inviare lo stato di attivazione della profilazione del metodo. Questa operazione è asincrona.

Lo stato dell'assegnazione è accessibile da ClientData.getAllocationStatus(). La notifica che il nuovo stato è disponibile verrà ricevuta tramite AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) con un changeMask contenente la maschera Client.CHANGE_HEAP_ALLOCATION_STATUS.

requestNativeHeapInformation

public boolean requestNativeHeapInformation ()

Invia una richiesta di aggiornamento dell'heap nativo. Questa operazione è asincrona.

È possibile accedere alle informazioni sull'heap nativo tramite ClientData.getNativeAllocationList(). La notifica della disponibilità dei nuovi dati verrà ricevuta tramite AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) con un changeMask contenente la maschera Client.CHANGE_NATIVE_HEAP_DATA.

Ritorni
boolean

requestThreadStackTrace

public void requestThreadStackTrace (int threadId)

Invia una richiesta di aggiornamento della traccia dello stack del thread. Questa operazione è asincrona.

Le informazioni del thread sono accessibili a ClientData.getThreads() e ThreadInfo.getStackTrace().

La notifica della disponibilità dei nuovi dati verrà ricevuta tramite AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) con un changeMask contenente la maschera Client.CHANGE_THREAD_STACKTRACE.

Parametri
threadId int

requestThreadUpdate

public void requestThreadUpdate ()

Invia una richiesta di aggiornamento del thread. Questa operazione è asincrona.

Le informazioni sul thread sono accessibili a ClientData.getThreads(). La notifica che i nuovi dati sono disponibili verrà ricevuta tramite AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) con un changeMask contenente la maschera Client.CHANGE_THREAD_DATA.

setHeapInfoUpdateEnabled

public void setHeapInfoUpdateEnabled (boolean enabled)

Parametri
enabled boolean

setHeapSegmentUpdateEnabled

public void setHeapSegmentUpdateEnabled (boolean enabled)

Parametri
enabled boolean

setHeapUpdateEnabled

public void setHeapUpdateEnabled (boolean enabled)

Attiva o disattiva l'aggiornamento dell'heap.

Se true, qualsiasi GC farà sì che il client invii le informazioni sull'heap.

Le informazioni sull'heap sono accessibili a ClientData.getVmHeapData().

La notifica che indica che i nuovi dati sono disponibili verrà ricevuta tramite AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) con un changeMask contenente il valore Client.CHANGE_HEAP_DATA.

Parametri
enabled boolean: il flag di attivazione

setThreadUpdateEnabled

public void setThreadUpdateEnabled (boolean enabled)

Attiva o disattiva l'aggiornamento del thread.

Se true la VM potrà inviare informazioni sui thread. Le informazioni sui thread devono essere richieste con requestThreadUpdate().

Parametri
enabled boolean: il flag di attivazione.

startMethodTracer

public void startMethodTracer ()

startOpenGlTracing

public boolean startOpenGlTracing ()

Ritorni
boolean

startSamplingProfiler

public void startSamplingProfiler (int samplingInterval, 
                TimeUnit timeUnit)

Parametri
samplingInterval int

timeUnit TimeUnit

stopMethodTracer

public void stopMethodTracer ()

stopOpenGlTracing

public boolean stopOpenGlTracing ()

Ritorni
boolean

stopSamplingProfiler

public void stopSamplingProfiler ()

toString

public String toString ()

Restituisce una rappresentazione stringa dell'oggetto ClientImpl.

Ritorni
String

toggleMethodProfiling

public void toggleMethodProfiling ()

Questo metodo è obsoleto.
Utilizza invece startMethodTracer(), stopMethodTracer(), startSamplingProfiler(int, TimeUnit) o stopSamplingProfiler().

Attiva/disattiva lo stato di profilazione del metodo.

update

public void update (int changeMask)

Parametri
changeMask int

updateHeapInfo

public void updateHeapInfo ()

Attiva un singolo aggiornamento dell'heap.

Metodi protetti

invia

protected void send (JdwpPacket packet)

Invia un pacchetto DDM al client.

Idealmente, possiamo farlo con una singola scrittura del canale. Se ciò non accade, dobbiamo impedire a chiunque altro di scrivere sul canale finché questo pacchetto non viene completato, in modo da sincronizzarci sul canale.

Un altro obiettivo è evitare copie del buffer non necessarie, quindi scriviamo direttamente da ByteBuffer di JdwpPacket.

Parametri
packet JdwpPacket