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()

傳回包含這項用戶端資訊的 ClientData 物件。

int getDebuggerListenPort()

傳回這個用戶端的偵錯工具連接埠。

IDevice getDevice()

傳回這個 Client 執行的 IDevice

DeviceImpl getDeviceImpl()

傳回這個 Client 執行的 DeviceImpl

JdwpPacket getJdwpPacket()

Return information for the first full JDWP packet in the buffer.

void initializeHeapUpdateStatus()
boolean isDdmAware()

如果用戶端 VM 可感知 DDM,則傳回 true

boolean isDebuggerAttached()

如果偵錯工具目前已附加至用戶端,則傳回 true

boolean isHeapUpdateEnabled()

傳回是否已啟用任何堆積更新。

boolean isThreadUpdateEnabled()

傳回是否已啟用執行緒更新。

boolean isValid()

傳回這個 ClientImpl 是否與應用程式 VM 建立有效連線。

void kill()

Sends a kill message to the VM.

void listViewRoots(DebugViewDumpHandler replyHandler)
void notifyVmMirrorExited()

偵錯工具 VM 鏡像可能會在 DDMLib 的後方退出,導致各種競爭或永久性Client遺失情況。

void packetFailed(JdwpPacket reply)

先前的要求失敗。

void read()

從管道讀取資料,應只從一個執行緒呼叫。

void register(Selector sel)

向選取器註冊用戶端,應在建立用戶端後立即呼叫。

void requestAllocationDetails()

向 VM 傳送要求,以傳送自呼叫 enableAllocationTracker(boolean)enable 設為 null 以來的所有分配資訊。

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()

傳回 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() 會讓 VM 傳送啟用和要求之間發生的所有分配作業相關資訊。

參數
enable boolean

executeGarbageCollector

public void executeGarbageCollector ()

強制用戶端執行垃圾收集器。

getClientData

public ClientData getClientData ()

傳回包含這項用戶端資訊的 ClientData 物件。

傳回
ClientData

getDebuggerListenPort

public int getDebuggerListenPort ()

傳回這個用戶端的偵錯工具連接埠。

傳回
int

getDevice

public IDevice getDevice ()

傳回這個 Client 執行的 IDevice

傳回
IDevice

getDeviceImpl

public DeviceImpl getDeviceImpl ()

傳回這個 Client 執行的 DeviceImpl

傳回
DeviceImpl

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

isValid

public boolean isValid ()

傳回這個 ClientImpl 是否與應用程式 VM 建立有效連線。

傳回
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_STATUSchangeMask

requestMethodProfilingStatus

public void requestMethodProfilingStatus ()

向 VM 傳送要求,以傳送方法剖析的啟用狀態。這是非同步作業。

您可以透過 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) 傳送通知,告知您有新資料可用,並在 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_STACKTRACEchangeMask

參數
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_DATAchangeMask

參數
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 ()

toString

public String toString ()

傳回 ClientImpl 物件的字串表示法。

傳回
String

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