ClientImpl

public class ClientImpl
extends JdwpAgent implements Client

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


这表示单个客户端,通常是 Dalvik 虚拟机进程。

此类可用于访问基本客户端信息,以及对客户端执行操作的方法。

如需了解更详细的信息(通常会实时更新),请访问 ClientData 类。每个 Client 对象都有自己的 ClientData,可通过 getClientData() 进行访问。

摘要

公共构造函数

ClientImpl(DeviceImpl device, SocketChannel chan, int pid)

为新客户端连接创建对象。

公共方法

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

关闭客户端套接字通道。

boolean ddmSeen()

当 MonitorThread 看到 DDM 请求或回复时,会调用此方法。

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

为相应客户端启用或停用分配跟踪器。

void executeGarbageCollector()

强制客户端执行其垃圾回收器。

ClientData getClientData()

返回包含相应客户端信息的 ClientData 对象。

int getDebuggerListenPort()

返回相应客户端的调试器端口。

IDevice getDevice()

返回此客户端运行的 IDevice

DeviceImpl getDeviceImpl()

返回此客户端运行的 DeviceImpl

JdwpPacket getJdwpPacket()

返回缓冲区中第一个完整 JDWP 数据包的相关信息。

void initializeHeapUpdateStatus()
boolean isDdmAware()

如果客户端虚拟机支持 DDM,则返回 true

boolean isDebuggerAttached()

如果调试器当前已附加到客户端,则返回 true

boolean isHeapUpdateEnabled()

返回是否已启用任何堆更新。

boolean isThreadUpdateEnabled()

返回线程更新是否已启用。

boolean isValid()

返回此 ClientImpl 是否与应用虚拟机建立了有效连接。

void kill()

向虚拟机发送终止消息。

void listViewRoots(DebugViewDumpHandler replyHandler)
void notifyVmMirrorExited()

调试器虚拟机镜像可能会在 DDMLib 不知情的情况下退出,从而导致各种竞态条件或永久性丢失情况。 Client

void packetFailed(JdwpPacket reply)

之前的请求失败。

void read()

从渠道读取数据,应仅从一个线程调用。

void register(Selector sel)

向选择器注册客户端,应在创建客户端后立即调用。

void requestAllocationDetails()

向虚拟机发送请求,以发送自调用 enableAllocationTracker(boolean) 以来发生的所有分配的相关信息,其中 enable 设置为 null

void requestAllocationStatus()

向虚拟机发送请求,以发送分配跟踪的启用状态。

void requestMethodProfilingStatus()

向虚拟机发送请求,以发送方法分析的启用状态。

boolean requestNativeHeapInformation()

发送原生堆更新请求。

void requestThreadStackTrace(int threadId)

发送线程堆栈轨迹更新请求。

void requestThreadUpdate()

发送线程更新请求。

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

启用或停用堆更新。

void setThreadUpdateEnabled(boolean enabled)

启用或停用线程更新。

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

返回 ClientImpl 对象的字符串表示形式。

void toggleMethodProfiling()

此方法已弃用。 请改用 startMethodTracer()stopMethodTracer()startSamplingProfiler(int, TimeUnit)stopSamplingProfiler()

void update(int changeMask)
void updateHeapInfo()

触发单个堆更新。

受保护的方法

void send(JdwpPacket packet)

向客户端发送 DDM 数据包。

公共构造函数

ClientImpl

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

为新的客户端连接创建对象。

参数
device DeviceImpl:相应客户端所属的设备

chan SocketChannel:已连接的 ERROR(/SocketChannel)

pid int:客户端 PID。

公共方法

captureView

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

参数
viewRoot String

view String

handler DebugViewDumpHandler

关闭

public void close (boolean notify)

关闭客户端套接字通道。如果有与我们关联的调试器,也请将其关闭。

关闭通道会自动从选择器中取消注册该通道。不过,我们必须先遍历选择器循环,然后才能让它们通过并允许关闭文件描述符。调用者应管理该问题。

参数
notify boolean:是否通知监听器发生了更改。

ddmSeen

public boolean ddmSeen ()

当 MonitorThread 看到 DDM 请求或回复时,会调用此方法。如果我们之前未见过 DDM 数据包,则将状态推进到 ST_READY 并返回“false”。否则,只需返回 true 即可。

此想法是为了让 MonitorThread 知道我们何时首次看到 DDM 数据包,以便在建立客户端连接时向处理程序发送广播。此方法已同步,因此我们只会发送一次广播。

返回
boolean

dumpDisplayList

public void dumpDisplayList (String viewRoot, 
                String view)

参数
viewRoot String

view String

dumpViewHierarchy

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

参数
viewRoot String

skipChildren boolean

includeProperties boolean

useV2 boolean

handler DebugViewDumpHandler

enableAllocationTracker

public void enableAllocationTracker (boolean enable)

为相应客户端启用或停用分配跟踪器。

如果启用,虚拟机将开始跟踪分配信息。对 requestAllocationDetails() 的调用将使虚拟机发送有关启用和请求之间发生的所有分配的信息。

参数
enable boolean

executeGarbageCollector

public void executeGarbageCollector ()

强制客户端执行其垃圾回收器。

getClientData

public ClientData getClientData ()

返回包含相应客户端信息的 ClientData 对象。

返回
ClientData

getDebuggerListenPort

public int getDebuggerListenPort ()

返回相应客户端的调试器端口。

返回
int

getDevice

public IDevice getDevice ()

返回此客户端运行的 IDevice

返回
IDevice

getDeviceImpl

public DeviceImpl getDeviceImpl ()

返回此客户端运行的 DeviceImpl

返回
DeviceImpl

getJdwpPacket

public JdwpPacket getJdwpPacket ()

返回缓冲区中第一个完整 JDWP 数据包的信息。

如果我们还没有完整的数据包,则返回 null。

如果我们尚未收到 JDWP 握手,我们会在此处等待,并在收到后使用它,但不会承认已收到。收到后,我们会发送“HELO”消息,这就是此方法可能会抛出 IOException 的原因。

请注意,建立连接的操作顺序如下:

主机端:1) adb track-jdwp 2) 接收包含应用进程的更新 PID 列表。3)打开/转发调试器端口并连接到设备。4) 执行握手。5) 发送 HELO 并等待响应。

设备/进程端:a) Fork zygote 并使用 PID 更新 ADB。b) 如果调试器端口已连接,则发送 APNM ("<pre-initialize>")。c) 将进程绑定到实际的应用和软件包。d) 如果调试器端口已连接,则发送更新后的 APNM。

上述两个执行序列完全并行运行,唯一的约束是 a) 在 2) 之前发生。

返回
JdwpPacket

initializeHeapUpdateStatus

public void initializeHeapUpdateStatus ()

isDdmAware

public boolean isDdmAware ()

如果客户端虚拟机支持 DDM,则返回 true

只有在连接建立后,才能在此处进行调用。

返回
boolean

isDebuggerAttached

public boolean isDebuggerAttached ()

如果调试器当前已附加到客户端,则返回 true

返回
boolean

isHeapUpdateEnabled

public boolean isHeapUpdateEnabled ()

返回是否已启用任何堆更新。

返回
boolean

isThreadUpdateEnabled

public boolean isThreadUpdateEnabled ()

返回线程更新是否已启用。

返回
boolean

isValid

public boolean isValid ()

返回此 ClientImpl 是否与应用虚拟机建立了有效连接。

返回
boolean

终止

public void kill ()

向虚拟机发送终止消息。如果虚拟机处于崩溃状态,此方法不一定有效。

listViewRoots

public void listViewRoots (DebugViewDumpHandler replyHandler)

参数
replyHandler DebugViewDumpHandler

notifyVmMirrorExited

public void notifyVmMirrorExited ()

调试器虚拟机镜像可能会在 DDMLib 背后退出,从而导致各种竞态条件或永久性丢失情况。Client我们需要通知 DDMLib,当前附加的调试器正在退出并终止其虚拟机镜像连接。

packetFailed

public void packetFailed (JdwpPacket reply)

之前的请求失败。这是与非 DDM 客户端通信时对 HELO 消息的预期响应。

参数
reply JdwpPacket

阅读

public void read ()

从通道读取数据,应仅从一个线程调用。

当已知有数据可用,但缓冲区中尚未有完整的数据包时,会调用此方法。如果缓冲区已满,请扩大缓冲区。

注册

public void register (Selector sel)

向选择器注册客户端,应在创建客户端后立即调用。

参数
sel Selector

requestAllocationDetails

public void requestAllocationDetails ()

向虚拟机发送请求,以发送自调用 enableAllocationTracker(boolean) 以来发生的所有分配的相关信息,其中 enable 设置为 null。这是异步的。

可通过 ClientData.getAllocations() 访问分配信息。系统会通过 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) 接收到新数据可用的通知,该通知包含掩码 Client.CHANGE_HEAP_ALLOCATIONSchangeMask

requestAllocationStatus

public void requestAllocationStatus ()

向虚拟机发送请求,以发送分配跟踪的启用状态。这是异步的。

可通过 ClientData.getAllocationStatus() 访问分配状态。系统会通过 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) 接收有关新状态可用的通知,其中包含掩码 Client.CHANGE_HEAP_ALLOCATION_STATUSchangeMask

requestMethodProfilingStatus

public void requestMethodProfilingStatus ()

向虚拟机发送请求,以发送方法分析的启用状态。这是异步的。

可通过 ClientData.getAllocationStatus() 访问分配状态。系统会通过 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) 接收有关新状态可用的通知,其中包含掩码 Client.CHANGE_HEAP_ALLOCATION_STATUSchangeMask

requestNativeHeapInformation

public boolean requestNativeHeapInformation ()

发送原生堆更新请求。此请求是异步的。

可以通过 ClientData.getNativeAllocationList() 访问原生堆信息。系统会通过 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) 接收到新数据可用的通知,该通知包含掩码 Client.CHANGE_NATIVE_HEAP_DATAchangeMask

返回
boolean

requestThreadStackTrace

public void requestThreadStackTrace (int threadId)

发送线程堆栈轨迹更新请求。这是异步的。

线程信息可通过 ClientData.getThreads()ThreadInfo.getStackTrace() 进行访问。

您将通过 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) 收到新数据可用的通知,其中包含掩码 Client.CHANGE_THREAD_STACKTRACEchangeMask

参数
threadId int

requestThreadUpdate

public void requestThreadUpdate ()

发送线程更新请求。这是异步的。

可通过 ClientData.getThreads() 访问线程信息。您将通过 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) 收到新数据可用的通知,其中包含掩码 Client.CHANGE_THREAD_DATAchangeMask

setHeapInfoUpdateEnabled

public void setHeapInfoUpdateEnabled (boolean enabled)

参数
enabled boolean

setHeapSegmentUpdateEnabled

public void setHeapSegmentUpdateEnabled (boolean enabled)

参数
enabled boolean

setHeapUpdateEnabled

public void setHeapUpdateEnabled (boolean enabled)

启用或停用堆更新。

如果为 true,任何 GC 都会导致客户端发送其堆信息。

可以通过 ClientData.getVmHeapData() 访问堆信息。

系统会通过 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) 接收新数据可用的通知,其中包含值为 Client.CHANGE_HEAP_DATAchangeMask

参数
enabled boolean:启用标志

setThreadUpdateEnabled

public void setThreadUpdateEnabled (boolean enabled)

启用或停用线程更新。

如果为 true,虚拟机将能够发送线程信息。必须使用 requestThreadUpdate() 请求线程信息。

参数
enabled boolean:启用标志。

startMethodTracer

public void startMethodTracer ()

startOpenGlTracing

public boolean startOpenGlTracing ()

返回
boolean

startSamplingProfiler

public void startSamplingProfiler (int samplingInterval, 
                TimeUnit timeUnit)

参数
samplingInterval int

timeUnit TimeUnit

stopMethodTracer

public void stopMethodTracer ()

stopOpenGlTracing

public boolean stopOpenGlTracing ()

返回
boolean

stopSamplingProfiler

public void stopSamplingProfiler ()

toString

public String toString ()

返回 ClientImpl 对象的字符串表示形式。

返回
String

toggleMethodProfiling

public void toggleMethodProfiling ()

此方法已弃用。
请改用 startMethodTracer()stopMethodTracer()startSamplingProfiler(int, TimeUnit)stopSamplingProfiler()

切换方法分析状态。

update

public void update (int changeMask)

参数
changeMask int

updateHeapInfo

public void updateHeapInfo ()

触发单个堆更新。

受保护的方法

发送

protected void send (JdwpPacket packet)

向客户端发送 DDM 数据包。

理想情况下,我们可以通过一次通道写入来完成此操作。如果未发生这种情况,我们必须阻止任何其他人写入通道,直到此数据包完成为止,因此我们在通道上进行同步。

另一个目标是避免不必要的缓冲区复制,因此我们直接从 JdwpPacket 的 ByteBuffer 中写入。

参数
packet JdwpPacket