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()
แสดงผล |
DeviceImpl
|
getDeviceImpl()
แสดงผล |
JdwpPacket
|
getJdwpPacket()
แสดงข้อมูลสำหรับแพ็กเก็ต JDWP แรกแบบเต็มในบัฟเฟอร์ |
void
|
initializeHeapUpdateStatus()
|
boolean
|
isDdmAware()
แสดงผล |
boolean
|
isDebuggerAttached()
แสดงผล |
boolean
|
isHeapUpdateEnabled()
แสดงผลว่ามีการเปิดใช้การอัปเดตกองหรือไม่ |
boolean
|
isThreadUpdateEnabled()
แสดงว่าเปิดใช้การอัปเดตเธรดหรือไม่ |
boolean
|
isValid()
แสดงผลว่า |
void
|
kill()
ส่งข้อความสิ้นสุดไปยัง 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" ไม่เช่นนั้น ให้แสดงผลเป็นจริง
แนวคิดคือการแจ้งให้ 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)
เปิดหรือปิดใช้เครื่องมือติดตามการจัดสรรสำหรับลูกค้ารายนี้
หากเปิดใช้ VM จะเริ่มติดตามข้อมูลการจัดสรร การเรียกใช้ requestAllocationDetails() จะทำให้ VM ส่งข้อมูลเกี่ยวกับการจัดสรรทั้งหมด
ที่เกิดขึ้นระหว่างการเปิดใช้กับคำขอ
| พารามิเตอร์ | |
|---|---|
enable |
boolean |
executeGarbageCollector
public void executeGarbageCollector ()
บังคับให้ไคลเอ็นต์เรียกใช้ตัวเก็บขยะ
getClientData
public ClientData getClientData ()
แสดงผลออบเจ็กต์ ClientData ที่มีข้อมูลไคลเอ็นต์นี้
| คิกรีเทิร์น | |
|---|---|
ClientData |
|
getDebuggerListenPort
public int getDebuggerListenPort ()
แสดงผลพอร์ตดีบักเกอร์สำหรับไคลเอ็นต์นี้
| คิกรีเทิร์น | |
|---|---|
int |
|
getDeviceImpl
public DeviceImpl getDeviceImpl ()
แสดงผล DeviceImpl ที่ไคลเอ็นต์นี้ทำงานอยู่
| คิกรีเทิร์น | |
|---|---|
DeviceImpl |
|
getJdwpPacket
public JdwpPacket getJdwpPacket ()
แสดงข้อมูลสำหรับแพ็กเก็ต JDWP แรกแบบเต็มในบัฟเฟอร์
หากยังไม่มีแพ็กเก็ตที่สมบูรณ์ ให้แสดงค่าว่าง
หากเรายังไม่ได้รับการแฮนด์เชค JDWP เราจะรอรับที่นี่และใช้โดยไม่ ยอมรับว่าได้ทำเช่นนั้น เมื่อได้รับแล้ว เราจะส่งข้อความ "HELO" ซึ่งเป็นสาเหตุที่ทำให้เกิด IOException ได้
โปรดทราบว่าลำดับการดำเนินการในการสร้างการเชื่อมต่อคือ
ฝั่งโฮสต์: 1) adb track-jdwp 2) รับรายการ PID ที่อัปเดตซึ่งมีกระบวนการของแอป 3) เปิด/ส่งต่อพอร์ตดีบักเกอร์และเชื่อมต่อกับอุปกรณ์ 4) ทำการแฮนด์เชค 5) ส่ง HELO และรอ การตอบกลับ
ฝั่งอุปกรณ์/กระบวนการ: ก) แยกกระบวนการย่อยและอัปเดต ADB ด้วย PID ข) ส่ง APNM หากเชื่อมต่อพอร์ตดีบักเกอร์ ("<pre-initialize>") ค) เชื่อมโยงกระบวนการกับแอปพลิเคชันและ แพ็กเกจจริง ง) ส่ง APNM ที่อัปเดตแล้วหากเชื่อมต่อพอร์ตดีบักเกอร์
ลำดับการดำเนินการ 2 รายการข้างต้นจะทำงานแบบคู่ขนานโดยสมบูรณ์ โดยมีข้อจำกัดเพียงข้อเดียวคือ ก) เกิดขึ้นก่อน 2)
| คิกรีเทิร์น | |
|---|---|
JdwpPacket |
|
initializeHeapUpdateStatus
public void initializeHeapUpdateStatus ()
isDdmAware
public boolean isDdmAware ()
แสดงผล true หาก VM ไคลเอ็นต์รองรับ DDM
การโทรที่นี่จะทำได้หลังจากที่สร้างการเชื่อมต่อแล้วเท่านั้น
| คิกรีเทิร์น | |
|---|---|
boolean |
|
isDebuggerAttached
public boolean isDebuggerAttached ()
แสดงผล true หากดีบักเกอร์เชื่อมต่อกับไคลเอ็นต์อยู่
| คิกรีเทิร์น | |
|---|---|
boolean |
|
isHeapUpdateEnabled
public boolean isHeapUpdateEnabled ()
แสดงผลว่ามีการเปิดใช้การอัปเดตกองหรือไม่
| คิกรีเทิร์น | |
|---|---|
boolean |
|
ดูเพิ่มเติม:
isThreadUpdateEnabled
public boolean isThreadUpdateEnabled ()
แสดงว่าเปิดใช้การอัปเดตเธรดหรือไม่
| คิกรีเทิร์น | |
|---|---|
boolean |
|
isValid
public boolean isValid ()
แสดงผลว่า ClientImpl นี้มีการเชื่อมต่อที่ถูกต้องกับ VM ของแอปพลิเคชันหรือไม่
| คิกรีเทิร์น | |
|---|---|
boolean |
|
ปิด
public void kill ()
ส่งข้อความสิ้นสุดไปยัง VM วิธีนี้อาจไม่ได้ผลหาก VM อยู่ในสถานะขัดข้อง
listViewRoots
public void listViewRoots (DebugViewDumpHandler replyHandler)
| พารามิเตอร์ | |
|---|---|
replyHandler |
DebugViewDumpHandler |
notifyVmMirrorExited
public void notifyVmMirrorExited ()
VM ของดีบักเกอร์สามารถออกไปอยู่เบื้องหลัง DDMLib ได้ ซึ่งอาจทำให้เกิดการแข่งขันต่างๆ หรือเงื่อนไขการสูญเสียClientแบบถาวร เราต้องแจ้งให้ DDMLib ทราบว่าดีบักเกอร์ที่แนบอยู่กำลังจะออกและปิดการเชื่อมต่อ VM Mirror
packetFailed
public void packetFailed (JdwpPacket reply)
คำขอก่อนหน้านี้ส่งผลให้ดำเนินการไม่สำเร็จ นี่คือการตอบกลับที่คาดไว้สำหรับข้อความ HELO เมื่อพูดคุยกับไคลเอ็นต์ที่ไม่ใช่ DDM
| พารามิเตอร์ | |
|---|---|
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) พร้อม changeMask
ที่มีมาสก์ Client.CHANGE_HEAP_ALLOCATION_STATUS
requestMethodProfilingStatus
public void requestMethodProfilingStatus ()
ส่งคำขอไปยัง VM เพื่อส่งสถานะการเปิดใช้การสร้างโปรไฟล์เมธอด ซึ่งเป็นแบบ อะซิงโครนัส
ClientData.getAllocationStatus() สามารถเข้าถึงสถานะการจัดสรรได้ คุณจะได้รับการแจ้งเตือนว่าสถานะใหม่พร้อมใช้งานผ่าน AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) พร้อม changeMask
ที่มีมาสก์ Client.CHANGE_HEAP_ALLOCATION_STATUS
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) พร้อม changeMask
ที่มีมาสก์ Client.CHANGE_THREAD_STACKTRACE
| พารามิเตอร์ | |
|---|---|
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 การเก็บขยะจะทำให้ไคลเอ็นต์ส่งข้อมูลฮีป
ClientData.getVmHeapData() สามารถเข้าถึงข้อมูลฮีปได้
คุณจะได้รับการแจ้งเตือนว่ามีข้อมูลใหม่พร้อมใช้งานผ่าน AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) พร้อมด้วย changeMask
ที่มีค่า Client.CHANGE_HEAP_DATA
| พารามิเตอร์ | |
|---|---|
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 ไปยังไคลเอ็นต์
เราสามารถทำได้ด้วยการเขียนช่องเดียว หากไม่เป็นเช่นนั้น เราจะต้อง ป้องกันไม่ให้ผู้อื่นเขียนไปยังช่องจนกว่าแพ็กเก็ตนี้จะเสร็จสมบูรณ์ ดังนั้นเราจึง ซิงค์ในช่อง
อีกเป้าหมายหนึ่งคือการหลีกเลี่ยงสำเนาบัฟเฟอร์ที่ไม่จำเป็น เราจึงเขียนออกจาก ByteBuffer ของ JdwpPacket โดยตรง
| พารามิเตอร์ | |
|---|---|
packet |
JdwpPacket |