ClientImpl
public
class
ClientImpl
extends JdwpAgent
implements
Client
| java.lang.Object | ||
| ↳ | com.android.tradefed.device.server.jdwp.JdwpAgent | |
| ↳ | com.android.tradefed.device.server.ClientImpl | |
Isso representa um único cliente, geralmente um processo de VM Dalvik.
Essa classe dá acesso a informações básicas do cliente, bem como métodos para realizar ações no cliente.
Informações mais detalhadas, geralmente atualizadas em tempo real, podem ser acessadas pela classe ClientData. Cada objeto Client tem seu próprio ClientData acessado por getClientData().
Resumo
Construtores públicos | |
|---|---|
ClientImpl(DeviceImpl device, SocketChannel chan, int pid)
Crie um objeto para uma nova conexão de cliente. |
|
Métodos públicos | |
|---|---|
void
|
captureView(String viewRoot, String view, DebugViewDumpHandler handler)
|
void
|
close(boolean notify)
Feche o canal de soquete do cliente. |
boolean
|
ddmSeen()
O MonitorThread chama isso quando vê uma solicitação ou resposta do DDM. |
void
|
dumpDisplayList(String viewRoot, String view)
|
void
|
dumpViewHierarchy(String viewRoot, boolean skipChildren, boolean includeProperties, boolean useV2, DebugViewDumpHandler handler)
|
void
|
enableAllocationTracker(boolean enable)
Ativa ou desativa o rastreador de alocações para este cliente. |
void
|
executeGarbageCollector()
Força o cliente a executar o coletor de lixo. |
ClientData
|
getClientData()
Retorna o objeto |
int
|
getDebuggerListenPort()
Retorna a porta do depurador para este cliente. |
IDevice
|
getDevice()
Retorna o |
DeviceImpl
|
getDeviceImpl()
Retorna o |
JdwpPacket
|
getJdwpPacket()
Retorna informações do primeiro pacote JDWP completo no buffer. |
void
|
initializeHeapUpdateStatus()
|
boolean
|
isDdmAware()
Retorna |
boolean
|
isDebuggerAttached()
Retorna |
boolean
|
isHeapUpdateEnabled()
Retorna se alguma atualização de heap está ativada. |
boolean
|
isThreadUpdateEnabled()
Retorna se a atualização de linhas de execução está ativada. |
boolean
|
isValid()
Retorna se este |
void
|
kill()
Envia uma mensagem de encerramento para a VM. |
void
|
listViewRoots(DebugViewDumpHandler replyHandler)
|
void
|
notifyVmMirrorExited()
As VMs de depuração podem sair por trás da DDMLib, resultando em várias condições de perda de corrida ou permanente de |
void
|
packetFailed(JdwpPacket reply)
Uma solicitação anterior resultou em uma falha. |
void
|
read()
Lê dados do nosso canal. Só pode ser chamado de uma única linha de execução. |
void
|
register(Selector sel)
Registra o cliente com um seletor. Deve ser chamado imediatamente após a criação do cliente. |
void
|
requestAllocationDetails()
Envia uma solicitação à VM para enviar as informações sobre todas as alocações que ocorreram desde a chamada para |
void
|
requestAllocationStatus()
Envia uma solicitação para a VM enviar o status de ativação do rastreamento de alocações. |
void
|
requestMethodProfilingStatus()
Envia uma solicitação à VM para enviar o status de ativação da criação de perfil de método. |
boolean
|
requestNativeHeapInformation()
Envia uma solicitação de atualização de heap nativo. |
void
|
requestThreadStackTrace(int threadId)
Envia uma solicitação de atualização de rastreamento de pilha de encadeamento. |
void
|
requestThreadUpdate()
Envia uma solicitação de atualização de thread. |
void
|
setHeapInfoUpdateEnabled(boolean enabled)
|
void
|
setHeapSegmentUpdateEnabled(boolean enabled)
|
void
|
setHeapUpdateEnabled(boolean enabled)
Ativa ou desativa a atualização de heap. |
void
|
setThreadUpdateEnabled(boolean enabled)
Ativa ou desativa a atualização da linha de execução. |
void
|
startMethodTracer()
|
boolean
|
startOpenGlTracing()
|
void
|
startSamplingProfiler(int samplingInterval, TimeUnit timeUnit)
|
void
|
stopMethodTracer()
|
boolean
|
stopOpenGlTracing()
|
void
|
stopSamplingProfiler()
|
String
|
toString()
Retorna uma representação de string do objeto |
void
|
toggleMethodProfiling()
Esse método foi descontinuado.
Use |
void
|
update(int changeMask)
|
void
|
updateHeapInfo()
Aciona uma única atualização de heap. |
Métodos protegidos | |
|---|---|
void
|
send(JdwpPacket packet)
Envie um pacote de DDM ao cliente. |
Construtores públicos
ClientImpl
public ClientImpl (DeviceImpl device, SocketChannel chan, int pid)
Crie um objeto para uma nova conexão de cliente.
| Parâmetros | |
|---|---|
device |
DeviceImpl: o dispositivo a que este cliente pertence |
chan |
SocketChannel: o ERROR(/SocketChannel) conectado. |
pid |
int: o PID do cliente. |
Métodos públicos
captureView
public void captureView (String viewRoot,
String view,
DebugViewDumpHandler handler)| Parâmetros | |
|---|---|
viewRoot |
String |
view |
String |
handler |
DebugViewDumpHandler |
fechar
public void close (boolean notify)
Feche o canal de soquete do cliente. Se houver um depurador associado a nós, feche-o também.
Fechar um canal cancela automaticamente o registro dele no seletor. No entanto, precisamos iterar pelo loop do seletor antes que ele permita que eles saiam e que os descritores de arquivo sejam fechados. O autor da chamada precisa gerenciar isso.
| Parâmetros | |
|---|---|
notify |
boolean: se é necessário ou não notificar os listeners de uma mudança. |
ddmSeen
public boolean ddmSeen ()
O MonitorThread chama isso quando vê uma solicitação ou resposta do DDM. Se nunca tivermos visto um pacote DDM antes, vamos avançar o estado para ST_READY e retornar "false". Caso contrário, retorne "true".
A ideia é informar a MonitorThread quando vemos um pacote DDM pela primeira vez para que possamos enviar uma transmissão aos manipuladores quando uma conexão de cliente for feita. Esse método é sincronizado para que a transmissão seja enviada apenas uma vez.
| Retorna | |
|---|---|
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)
Ativa ou desativa o rastreador de alocações para este cliente.
Se ativada, a VM vai começar a rastrear informações de alocação. Uma chamada para requestAllocationDetails() faz com que a VM envie as informações sobre todas as alocações
que ocorreram entre a ativação e a solicitação.
| Parâmetros | |
|---|---|
enable |
boolean |
executeGarbageCollector
public void executeGarbageCollector ()
Força o cliente a executar o coletor de lixo.
getClientData
public ClientData getClientData ()
Retorna o objeto ClientData que contém essas informações do cliente.
| Retorna | |
|---|---|
ClientData |
|
getDebuggerListenPort
public int getDebuggerListenPort ()
Retorna a porta do depurador para este cliente.
| Retorna | |
|---|---|
int |
|
getDevice
public IDevice getDevice ()
Retorna o IDevice em que este cliente está sendo executado.
| Retorna | |
|---|---|
IDevice |
|
getDeviceImpl
public DeviceImpl getDeviceImpl ()
Retorna o DeviceImpl em que este cliente está sendo executado.
| Retorna | |
|---|---|
DeviceImpl |
|
getJdwpPacket
public JdwpPacket getJdwpPacket ()
Retorna informações do primeiro pacote JDWP completo no buffer.
Se ainda não tivermos um pacote completo, retorne nulo.
Se ainda não tivermos recebido o handshake JDWP, vamos aguardar e consumir sem admitir que fizemos isso. Ao receber, enviamos a mensagem "HELO", e é por isso que isso pode gerar uma IOException.
A ordem das operações para estabelecer uma conexão é:
Lado do host: 1) adb track-jdwp 2) Receber lista atualizada de PIDs que contêm o processo do app. 3) Abra/encaminhe a porta do depurador e conecte-se ao dispositivo. 4) Execute o handshake. 5) Envie HELO e aguarde a resposta.
Lado do dispositivo/processo: a) Bifurque o zygote e atualize o ADB com o PID. b) Envie o APNM se a porta do depurador estiver conectada ("<pre-initialize>"). c) Vincule o processo ao aplicativo e pacote reais. d) Envie o APNM atualizado se a porta do depurador estiver conectada.
As duas sequências de execução acima são executadas completamente em paralelo, com a única restrição de que a) acontece antes de 2).
| Retorna | |
|---|---|
JdwpPacket |
|
initializeHeapUpdateStatus
public void initializeHeapUpdateStatus ()
isDdmAware
public boolean isDdmAware ()
Retorna true se a VM cliente for compatível com DDM.
A chamada aqui só é permitida depois que a conexão é estabelecida.
| Retorna | |
|---|---|
boolean |
|
isDebuggerAttached
public boolean isDebuggerAttached ()
Retorna true se um depurador estiver anexado ao cliente.
| Retorna | |
|---|---|
boolean |
|
isHeapUpdateEnabled
public boolean isHeapUpdateEnabled ()
Retorna se alguma atualização de heap está ativada.
| Retorna | |
|---|---|
boolean |
|
Confira também:
isThreadUpdateEnabled
public boolean isThreadUpdateEnabled ()
Retorna se a atualização de linhas de execução está ativada.
| Retorna | |
|---|---|
boolean |
|
isValid
public boolean isValid ()
Retorna se este ClientImpl tem uma conexão válida com a VM do aplicativo.
| Retorna | |
|---|---|
boolean |
|
matar
public void kill ()
Envia uma mensagem de encerramento para a VM. Isso não funciona necessariamente se a VM estiver em um estado de falha.
listViewRoots
public void listViewRoots (DebugViewDumpHandler replyHandler)
| Parâmetros | |
|---|---|
replyHandler |
DebugViewDumpHandler |
notifyVmMirrorExited
public void notifyVmMirrorExited ()
As VMs de depuração podem sair por trás da DDMLib, resultando em várias condições de perda de corrida ou permanente de Client. Precisamos notificar a DDMLib de que o depurador anexado está
saindo e encerrando a conexão de espelhamento da VM.
packetFailed
public void packetFailed (JdwpPacket reply)
Uma solicitação anterior resultou em uma falha. Esta é a resposta esperada para uma mensagem HELO ao falar com um cliente que não é do DDM.
| Parâmetros | |
|---|---|
reply |
JdwpPacket |
ler
public void read ()
Lê dados do nosso canal. Só pode ser chamado de uma única linha de execução.
Isso é chamado quando os dados estão disponíveis, mas ainda não temos um pacote completo no buffer. Se o buffer estiver na capacidade máxima, expanda-o.
registrar
public void register (Selector sel)
Registra o cliente com um seletor. Deve ser chamado imediatamente após a criação do cliente.
| Parâmetros | |
|---|---|
sel |
Selector |
requestAllocationDetails
public void requestAllocationDetails ()
Envia uma solicitação à VM para enviar as informações sobre todas as alocações que ocorreram desde a chamada para enableAllocationTracker(boolean) com enable definido como null. Isso é assíncrono.
As informações de alocação podem ser acessadas por ClientData.getAllocations(). A notificação de que os novos dados estão disponíveis será recebida por AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) com um changeMask que contém a máscara Client.CHANGE_HEAP_ALLOCATIONS.
requestAllocationStatus
public void requestAllocationStatus ()
Envia uma solicitação para a VM enviar o status de ativação do rastreamento de alocações. Isso é assíncrono.
O status da alocação pode ser acessado por ClientData.getAllocationStatus(). A
notificação de que o novo status está disponível será recebida por AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) com um changeMask
que contém a máscara Client.CHANGE_HEAP_ALLOCATION_STATUS.
requestMethodProfilingStatus
public void requestMethodProfilingStatus ()
Envia uma solicitação à VM para enviar o status de ativação da criação de perfil de método. Isso é assíncrono.
O status da alocação pode ser acessado por ClientData.getAllocationStatus(). A
notificação de que o novo status está disponível será recebida por AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) com um changeMask
que contém a máscara Client.CHANGE_HEAP_ALLOCATION_STATUS.
requestNativeHeapInformation
public boolean requestNativeHeapInformation ()
Envia uma solicitação de atualização de heap nativo. Isso é assíncrono.
As informações do heap nativo podem ser acessadas por ClientData.getNativeAllocationList(). A notificação de que os novos dados estão disponíveis será recebida por AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) com um changeMask que contém a máscara Client.CHANGE_NATIVE_HEAP_DATA.
| Retorna | |
|---|---|
boolean |
|
requestThreadStackTrace
public void requestThreadStackTrace (int threadId)
Envia uma solicitação de atualização de rastreamento de pilha de encadeamento. Isso é assíncrono.
As informações da conversa podem ser acessadas por ClientData.getThreads() e ThreadInfo.getStackTrace().
A notificação de que os novos dados estão disponíveis será recebida por AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) com um changeMask
que contém a máscara Client.CHANGE_THREAD_STACKTRACE.
| Parâmetros | |
|---|---|
threadId |
int |
requestThreadUpdate
public void requestThreadUpdate ()
Envia uma solicitação de atualização de thread. Isso é assíncrono.
As informações da linha de execução podem ser acessadas por ClientData.getThreads(). A notificação de que os novos dados estão disponíveis será recebida por AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) com um changeMask que contém a 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)
Ativa ou desativa a atualização de heap.
Se true, qualquer GC fará com que o cliente envie as informações de heap.
As informações de heap podem ser acessadas por ClientData.getVmHeapData().
A notificação de que os novos dados estão disponíveis será recebida por AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) com um changeMask
que contém o valor Client.CHANGE_HEAP_DATA.
| Parâmetros | |
|---|---|
enabled |
boolean: a flag de ativação |
setThreadUpdateEnabled
public void setThreadUpdateEnabled (boolean enabled)
Ativa ou desativa a atualização da linha de execução.
Se true, a VM poderá enviar informações de encadeamento. As informações de encadeamento
precisam ser solicitadas com requestThreadUpdate().
| Parâmetros | |
|---|---|
enabled |
boolean: a flag de ativação. |
startMethodTracer
public void startMethodTracer ()
startOpenGlTracing
public boolean startOpenGlTracing ()
| Retorna | |
|---|---|
boolean |
|
startSamplingProfiler
public void startSamplingProfiler (int samplingInterval,
TimeUnit timeUnit)| Parâmetros | |
|---|---|
samplingInterval |
int |
timeUnit |
TimeUnit |
stopMethodTracer
public void stopMethodTracer ()
stopOpenGlTracing
public boolean stopOpenGlTracing ()
| Retorna | |
|---|---|
boolean |
|
stopSamplingProfiler
public void stopSamplingProfiler ()
toString
public String toString ()
Retorna uma representação de string do objeto ClientImpl.
| Retorna | |
|---|---|
String |
|
toggleMethodProfiling
public void toggleMethodProfiling ()
Esse método foi descontinuado.
Use startMethodTracer(), stopMethodTracer(), startSamplingProfiler(int, TimeUnit) ou stopSamplingProfiler().
Alterna o estado da criação de perfil do método.
update
public void update (int changeMask)
| Parâmetros | |
|---|---|
changeMask |
int |
updateHeapInfo
public void updateHeapInfo ()
Aciona uma única atualização de heap.
Métodos protegidos
enviar
protected void send (JdwpPacket packet)
Envie um pacote de DDM ao cliente.
O ideal é fazer isso com uma única gravação de canal. Se isso não acontecer, vamos precisar impedir que qualquer outra pessoa escreva no canal até que o pacote seja concluído. Por isso, sincronizamos no canal.
Outro objetivo é evitar cópias desnecessárias do buffer. Por isso, gravamos diretamente do ByteBuffer do JdwpPacket.
| Parâmetros | |
|---|---|
packet |
JdwpPacket |