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()
返回包含相应客户端信息的 |
int
|
getDebuggerListenPort()
返回相应客户端的调试器端口。 |
IDevice
|
getDevice()
返回此客户端运行的 |
DeviceImpl
|
getDeviceImpl()
返回此客户端运行的 |
JdwpPacket
|
getJdwpPacket()
返回缓冲区中第一个完整 JDWP 数据包的相关信息。 |
void
|
initializeHeapUpdateStatus()
|
boolean
|
isDdmAware()
如果客户端虚拟机支持 DDM,则返回 |
boolean
|
isDebuggerAttached()
如果调试器当前已附加到客户端,则返回 |
boolean
|
isHeapUpdateEnabled()
返回是否已启用任何堆更新。 |
boolean
|
isThreadUpdateEnabled()
返回线程更新是否已启用。 |
boolean
|
isValid()
返回此 |
void
|
kill()
向虚拟机发送终止消息。 |
void
|
listViewRoots(DebugViewDumpHandler replyHandler)
|
void
|
notifyVmMirrorExited()
调试器虚拟机镜像可能会在 DDMLib 不知情的情况下退出,从而导致各种竞态条件或永久性丢失情况。
|
void
|
packetFailed(JdwpPacket reply)
之前的请求失败。 |
void
|
read()
从渠道读取数据,应仅从一个线程调用。 |
void
|
register(Selector sel)
向选择器注册客户端,应在创建客户端后立即调用。 |
void
|
requestAllocationDetails()
向虚拟机发送请求,以发送自调用 |
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()
返回 |
void
|
toggleMethodProfiling()
此方法已弃用。
请改用 |
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 ()
强制客户端执行其垃圾回收器。
getDebuggerListenPort
public int getDebuggerListenPort ()
返回相应客户端的调试器端口。
| 返回 | |
|---|---|
int |
|
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 |
|
终止
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_ALLOCATIONS 的 changeMask。
requestAllocationStatus
public void requestAllocationStatus ()
向虚拟机发送请求,以发送分配跟踪的启用状态。这是异步的。
可通过 ClientData.getAllocationStatus() 访问分配状态。系统会通过 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) 接收有关新状态可用的通知,其中包含掩码 Client.CHANGE_HEAP_ALLOCATION_STATUS 的 changeMask。
requestMethodProfilingStatus
public void requestMethodProfilingStatus ()
向虚拟机发送请求,以发送方法分析的启用状态。这是异步的。
可通过 ClientData.getAllocationStatus() 访问分配状态。系统会通过 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) 接收有关新状态可用的通知,其中包含掩码 Client.CHANGE_HEAP_ALLOCATION_STATUS 的 changeMask。
requestNativeHeapInformation
public boolean requestNativeHeapInformation ()
发送原生堆更新请求。此请求是异步的。
可以通过 ClientData.getNativeAllocationList() 访问原生堆信息。系统会通过 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) 接收到新数据可用的通知,该通知包含掩码 Client.CHANGE_NATIVE_HEAP_DATA 的 changeMask。
| 返回 | |
|---|---|
boolean |
|
requestThreadStackTrace
public void requestThreadStackTrace (int threadId)
发送线程堆栈轨迹更新请求。这是异步的。
线程信息可通过 ClientData.getThreads() 和 ThreadInfo.getStackTrace() 进行访问。
您将通过 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) 收到新数据可用的通知,其中包含掩码 Client.CHANGE_THREAD_STACKTRACE 的 changeMask。
| 参数 | |
|---|---|
threadId |
int |
requestThreadUpdate
public void requestThreadUpdate ()
发送线程更新请求。这是异步的。
可通过 ClientData.getThreads() 访问线程信息。您将通过 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) 收到新数据可用的通知,其中包含掩码 Client.CHANGE_THREAD_DATA 的 changeMask。
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_DATA 的 changeMask。
| 参数 | |
|---|---|
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 ()
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 |