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 |
int
|
getDebuggerListenPort()
Restituisce la porta del debugger per questo client. |
IDevice
|
getDevice()
Restituisce il |
DeviceImpl
|
getDeviceImpl()
Restituisce il |
JdwpPacket
|
getJdwpPacket()
Restituisce le informazioni per il primo pacchetto JDWP completo nel buffer. |
void
|
initializeHeapUpdateStatus()
|
boolean
|
isDdmAware()
Restituisce |
boolean
|
isDebuggerAttached()
Restituisce |
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 |
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- |
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 |
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 |
void
|
toggleMethodProfiling()
Questo metodo è obsoleto.
Utilizza invece |
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 |
|
Vedi anche:
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 |