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

แสดงผล IDevice ที่ไคลเอ็นต์นี้ทำงานอยู่

DeviceImpl getDeviceImpl()

แสดงผล DeviceImpl ที่ไคลเอ็นต์นี้ทำงานอยู่

JdwpPacket getJdwpPacket()

แสดงข้อมูลสำหรับแพ็กเก็ต JDWP แรกแบบเต็มในบัฟเฟอร์

void initializeHeapUpdateStatus()
boolean isDdmAware()

แสดงผล true หาก VM ไคลเอ็นต์รองรับ DDM

boolean isDebuggerAttached()

แสดงผล true หากดีบักเกอร์เชื่อมต่อกับไคลเอ็นต์อยู่

boolean isHeapUpdateEnabled()

แสดงผลว่ามีการเปิดใช้การอัปเดตกองหรือไม่

boolean isThreadUpdateEnabled()

แสดงว่าเปิดใช้การอัปเดตเธรดหรือไม่

boolean isValid()

แสดงผลว่า ClientImpl นี้มีการเชื่อมต่อที่ถูกต้องกับ VM ของแอปพลิเคชันหรือไม่

void kill()

ส่งข้อความสิ้นสุดไปยัง 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" ไม่เช่นนั้น ให้แสดงผลเป็นจริง

แนวคิดคือการแจ้งให้ 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

getDevice

public IDevice getDevice ()

แสดงผล IDevice ที่ไคลเอ็นต์นี้ทำงานอยู่

คิกรีเทิร์น
IDevice

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

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 ไปยังไคลเอ็นต์

เราสามารถทำได้ด้วยการเขียนช่องเดียว หากไม่เป็นเช่นนั้น เราจะต้อง ป้องกันไม่ให้ผู้อื่นเขียนไปยังช่องจนกว่าแพ็กเก็ตนี้จะเสร็จสมบูรณ์ ดังนั้นเราจึง ซิงค์ในช่อง

อีกเป้าหมายหนึ่งคือการหลีกเลี่ยงสำเนาบัฟเฟอร์ที่ไม่จำเป็น เราจึงเขียนออกจาก ByteBuffer ของ JdwpPacket โดยตรง

พารามิเตอร์
packet JdwpPacket