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 ClientData que contém essas informações do cliente.

int getDebuggerListenPort()

Retorna a porta do depurador para este cliente.

IDevice getDevice()

Retorna o IDevice em que este cliente está sendo executado.

DeviceImpl getDeviceImpl()

Retorna o DeviceImpl em que este cliente está sendo executado.

JdwpPacket getJdwpPacket()

Retorna informações do primeiro pacote JDWP completo no buffer.

void initializeHeapUpdateStatus()
boolean isDdmAware()

Retorna true se a VM cliente for compatível com DDM.

boolean isDebuggerAttached()

Retorna true se um depurador estiver anexado ao cliente.

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 ClientImpl tem uma conexão válida com a VM do aplicativo.

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 Client.

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 enableAllocationTracker(boolean) com enable definido como null.

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 ClientImpl.

void toggleMethodProfiling()

Esse método foi descontinuado. Use startMethodTracer(), stopMethodTracer(), startSamplingProfiler(int, TimeUnit) ou stopSamplingProfiler().

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

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