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 VM 程序。
這個類別可存取基本用戶端資訊,以及對用戶端執行動作的方法。
如要查看更詳細的資訊 (通常會即時更新),請使用 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()
傳回這個 Client 執行的 |
DeviceImpl
|
getDeviceImpl()
傳回這個 Client 執行的 |
JdwpPacket
|
getJdwpPacket()
Return information for the first full JDWP packet in the buffer. |
void
|
initializeHeapUpdateStatus()
|
boolean
|
isDdmAware()
如果用戶端 VM 可感知 DDM,則傳回 |
boolean
|
isDebuggerAttached()
如果偵錯工具目前已附加至用戶端,則傳回 |
boolean
|
isHeapUpdateEnabled()
傳回是否已啟用任何堆積更新。 |
boolean
|
isThreadUpdateEnabled()
傳回是否已啟用執行緒更新。 |
boolean
|
isValid()
傳回這個 |
void
|
kill()
Sends a kill message to the VM. |
void
|
listViewRoots(DebugViewDumpHandler replyHandler)
|
void
|
notifyVmMirrorExited()
偵錯工具 VM 鏡像可能會在 DDMLib 的後方退出,導致各種競爭或永久性 |
void
|
packetFailed(JdwpPacket reply)
先前的要求失敗。 |
void
|
read()
從管道讀取資料,應只從一個執行緒呼叫。 |
void
|
register(Selector sel)
向選取器註冊用戶端,應在建立用戶端後立即呼叫。 |
void
|
requestAllocationDetails()
向 VM 傳送要求,以傳送自呼叫 |
void
|
requestAllocationStatus()
將要求傳送至 VM,以傳送分配追蹤的啟用狀態。 |
void
|
requestMethodProfilingStatus()
向 VM 傳送要求,以傳送方法剖析的啟用狀態。 |
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() 會讓 VM 傳送啟用和要求之間發生的所有分配作業相關資訊。
| 參數 | |
|---|---|
enable |
boolean |
executeGarbageCollector
public void executeGarbageCollector ()
強制用戶端執行垃圾收集器。
getDebuggerListenPort
public int getDebuggerListenPort ()
傳回這個用戶端的偵錯工具連接埠。
| 傳回 | |
|---|---|
int |
|
getJdwpPacket
public JdwpPacket getJdwpPacket ()
傳回緩衝區中第一個完整 JDWP 封包的資訊。
If we don't yet have a full packet, return null.
如果我們尚未收到 JDWP 握手信號,我們會在此監看並使用該信號,但不會承認已收到。收到信號後,我們會傳送「HELO」訊息,因此這可能會擲回 IOException。
請注意,建立連線時的作業順序如下:
主機端:1) adb track-jdwp 2) 接收包含應用程式程序的 PID 更新清單。3) 開啟/轉送偵錯工具通訊埠,並連線至裝置。4) 執行交握。5) 傳送 HELO 並等待回應。
裝置/程序端:a) 分叉 Zygote 並使用 PID 更新 ADB。b) 如果偵錯工具通訊埠已連線,請傳送 APNM (「<pre-initialize>」)。c) 將程序繫結至實際應用程式和套件。d) 如果偵錯工具通訊埠已連線,請傳送更新的 APNM。
上述兩個執行順序會完全平行執行,唯一的限制是 a) 必須在 2) 之前發生。
| 傳回 | |
|---|---|
JdwpPacket |
|
initializeHeapUpdateStatus
public void initializeHeapUpdateStatus ()
isDdmAware
public boolean isDdmAware ()
如果用戶端 VM 可感知 DDM,則傳回 true。
建立連線後,才能在這裡進行呼叫。
| 傳回 | |
|---|---|
boolean |
|
isDebuggerAttached
public boolean isDebuggerAttached ()
如果偵錯工具目前已附加至用戶端,則傳回 true。
| 傳回 | |
|---|---|
boolean |
|
isHeapUpdateEnabled
public boolean isHeapUpdateEnabled ()
傳回是否已啟用任何堆積更新。
| 傳回 | |
|---|---|
boolean |
|
isThreadUpdateEnabled
public boolean isThreadUpdateEnabled ()
傳回是否已啟用執行緒更新。
| 傳回 | |
|---|---|
boolean |
|
kill
public void kill ()
將終止訊息傳送至 VM。如果 VM 處於當機狀態,這個方法不一定有效。
listViewRoots
public void listViewRoots (DebugViewDumpHandler replyHandler)
| 參數 | |
|---|---|
replyHandler |
DebugViewDumpHandler |
notifyVmMirrorExited
public void notifyVmMirrorExited ()
偵錯工具 VM 鏡像可能會在 DDMLib 的後方退出,導致各種競爭或永久性Client遺失情況。我們需要通知 DDMLib,目前附加的偵錯工具正在結束並終止其 VM 鏡像連線。
packetFailed
public void packetFailed (JdwpPacket reply)
先前的要求失敗。與非 DDM 用戶端通訊時,這是對 HELO 訊息的預期回應。
| 參數 | |
|---|---|
reply |
JdwpPacket |
讀取
public void read ()
從管道讀取資料,只能從一個執行緒呼叫。
當資料可供使用,但緩衝區中尚未有完整封包時,就會呼叫這個函式。如果緩衝區已滿,請擴充緩衝區。
註冊
public void register (Selector sel)
使用選取器註冊用戶端,應在建立用戶端後立即呼叫。
| 參數 | |
|---|---|
sel |
Selector |
requestAllocationDetails
public void requestAllocationDetails ()
向 VM 傳送要求,以傳送自呼叫 enableAllocationTracker(boolean) (enable 設為 null) 以來發生的所有分配作業相關資訊。這是非同步作業。
您可以透過 ClientData.getAllocations() 存取分配資訊。系統會透過 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) 傳送通知,告知您有新資料可用,並在 changeMask 中包含遮罩 Client.CHANGE_HEAP_ALLOCATIONS。
requestAllocationStatus
public void requestAllocationStatus ()
將要求傳送至 VM,以傳送分配追蹤的啟用狀態。這是非同步作業。
您可以透過 ClientData.getAllocationStatus() 存取分配狀態。系統會透過 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) 傳送通知,告知新狀態已可使用,並包含遮罩 Client.CHANGE_HEAP_ALLOCATION_STATUS 的 changeMask。
requestMethodProfilingStatus
public void requestMethodProfilingStatus ()
向 VM 傳送要求,以傳送方法剖析的啟用狀態。這是非同步作業。
您可以透過 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) 傳送通知,告知您有新資料可用,並在 changeMask 中包含遮罩 Client.CHANGE_NATIVE_HEAP_DATA。
| 傳回 | |
|---|---|
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) 傳送通知,告知您有新資料可用,並在 changeMask 中包含遮罩 Client.CHANGE_THREAD_DATA。
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,VM 就能傳送執行緒資訊。必須使用 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()。
切換方法剖析狀態。
更新
public void update (int changeMask)
| 參數 | |
|---|---|
changeMask |
int |
updateHeapInfo
public void updateHeapInfo ()
觸發單一堆積更新。
受保護的方法
傳送
protected void send (JdwpPacket packet)
將 DDM 封包傳送至用戶端。
理想情況下,我們可以使用單一管道寫入來完成這項作業。如果沒有,我們必須防止任何其他人寫入通道,直到這個封包完成為止,因此我們會在通道上同步處理。
另一個目標是避免不必要的緩衝區副本,因此我們會直接從 JdwpPacket 的 ByteBuffer 寫出內容。
| 參數 | |
|---|---|
packet |
JdwpPacket |