ClientImpl

public class ClientImpl
extends JdwpAgent implements Client

java.lang.Object
   ↳ com.android.tradefed.device.server.jdwp.JdwpAgent
     ↳ com.android.tradefed.device.server.ClientImpl


Đây là một ứng dụng duy nhất, thường là một quy trình VM Dalvik.

Lớp này cho phép truy cập vào thông tin cơ bản về ứng dụng, cũng như các phương thức để thực hiện hành động trên ứng dụng.

Bạn có thể truy cập vào thông tin chi tiết hơn (thường được cập nhật theo thời gian thực) thông qua lớp ClientData. Mỗi đối tượng Client đều có ClientData riêng được truy cập thông qua getClientData().

Tóm tắt

Hàm khởi tạo công khai

ClientImpl(DeviceImpl device, SocketChannel chan, int pid)

Tạo một đối tượng cho kết nối máy khách mới.

Phương thức công khai

void captureView(String viewRoot, String view, DebugViewDumpHandler handler)
void close(boolean notify)

Đóng kênh ổ cắm máy khách.

boolean ddmSeen()

MonitorThread gọi phương thức này khi thấy yêu cầu hoặc phản hồi DDM.

void dumpDisplayList(String viewRoot, String view)
void dumpViewHierarchy(String viewRoot, boolean skipChildren, boolean includeProperties, boolean useV2, DebugViewDumpHandler handler)
void enableAllocationTracker(boolean enable)

Bật hoặc tắt Allocation tracker (Trình theo dõi việc phân bổ) cho khách hàng này.

void executeGarbageCollector()

Buộc ứng dụng khách thực thi trình thu gom rác.

ClientData getClientData()

Trả về đối tượng ClientData chứa thông tin về ứng dụng khách này.

int getDebuggerListenPort()

Trả về cổng gỡ lỗi cho ứng dụng này.

IDevice getDevice()

Trả về IDevice mà Ứng dụng này đang chạy.

DeviceImpl getDeviceImpl()

Trả về DeviceImpl mà Ứng dụng này đang chạy.

JdwpPacket getJdwpPacket()

Trả về thông tin cho gói JDWP đầy đủ đầu tiên trong vùng đệm.

void initializeHeapUpdateStatus()
boolean isDdmAware()

Trả về true nếu VM ứng dụng có nhận biết DDM.

boolean isDebuggerAttached()

Trả về true nếu một trình gỡ lỗi hiện được đính kèm vào ứng dụng.

boolean isHeapUpdateEnabled()

Trả về xem có bật bất kỳ bản cập nhật nào cho vùng nhớ heap hay không.

boolean isThreadUpdateEnabled()

Trả về xem có bật tính năng cập nhật luồng hay không.

boolean isValid()

Trả về xem ClientImpl này có kết nối hợp lệ với VM ứng dụng hay không.

void kill()

Gửi thông báo tắt đến máy ảo.

void listViewRoots(DebugViewDumpHandler replyHandler)
void notifyVmMirrorExited()

Các bản sao VM gỡ lỗi có thể thoát ra sau DDMLib, dẫn đến nhiều điều kiện mất Client vĩnh viễn hoặc điều kiện xung đột.

void packetFailed(JdwpPacket reply)

Một yêu cầu trước đó đã không thành công.

void read()

Đọc dữ liệu từ kênh của chúng tôi, chỉ nên được gọi từ một luồng.

void register(Selector sel)

Đăng ký ứng dụng với một Bộ chọn, cần được gọi ngay sau khi tạo ứng dụng.

void requestAllocationDetails()

Gửi yêu cầu đến VM để gửi thông tin về tất cả các hoạt động phân bổ đã xảy ra kể từ khi gọi đến enableAllocationTracker(boolean) với enable được đặt thành null.

void requestAllocationStatus()

Gửi yêu cầu đến VM để gửi trạng thái bật của tính năng theo dõi việc phân bổ.

void requestMethodProfilingStatus()

Gửi yêu cầu đến VM để gửi trạng thái bật của tính năng lập hồ sơ phương thức.

boolean requestNativeHeapInformation()

Gửi yêu cầu cập nhật heap gốc.

void requestThreadStackTrace(int threadId)

Gửi yêu cầu cập nhật dấu vết ngăn xếp luồng.

void requestThreadUpdate()

Gửi yêu cầu cập nhật luồng.

void setHeapInfoUpdateEnabled(boolean enabled)
void setHeapSegmentUpdateEnabled(boolean enabled)
void setHeapUpdateEnabled(boolean enabled)

Bật hoặc tắt tính năng cập nhật heap.

void setThreadUpdateEnabled(boolean enabled)

Bật hoặc tắt tính năng cập nhật chuỗi.

void startMethodTracer()
boolean startOpenGlTracing()
void startSamplingProfiler(int samplingInterval, TimeUnit timeUnit)
void stopMethodTracer()
boolean stopOpenGlTracing()
void stopSamplingProfiler()
String toString()

Trả về một chuỗi đại diện của đối tượng ClientImpl.

void toggleMethodProfiling()

Phương thức này không được dùng nữa. Thay vào đó, hãy dùng startMethodTracer(), stopMethodTracer(), startSamplingProfiler(int, TimeUnit) hoặc stopSamplingProfiler().

void update(int changeMask)
void updateHeapInfo()

Kích hoạt một bản cập nhật heap duy nhất.

Phương thức được bảo vệ

void send(JdwpPacket packet)

Gửi một gói DDM đến máy khách.

Hàm khởi tạo công khai

ClientImpl

public ClientImpl (DeviceImpl device, 
                SocketChannel chan, 
                int pid)

Tạo một đối tượng cho kết nối máy khách mới.

Tham số
device DeviceImpl: thiết bị mà ứng dụng này thuộc về

chan SocketChannel: ERROR(/SocketChannel) được kết nối.

pid int: pid của ứng dụng.

Phương thức công khai

captureView

public void captureView (String viewRoot, 
                String view, 
                DebugViewDumpHandler handler)

Tham số
viewRoot String

view String

handler DebugViewDumpHandler

đóng

public void close (boolean notify)

Đóng kênh ổ cắm máy khách. Nếu có trình gỡ lỗi liên kết với chúng tôi, hãy đóng trình gỡ lỗi đó.

Việc đóng một kênh sẽ tự động huỷ đăng ký kênh đó khỏi bộ chọn. Tuy nhiên, chúng ta phải lặp lại vòng lặp bộ chọn trước khi vòng lặp này thực sự cho phép các bộ chọn đi và cho phép các bộ mô tả tệp đóng. Người gọi dự kiến sẽ quản lý việc đó.

Tham số
notify boolean: Có thông báo cho các trình nghe về một thay đổi hay không.

ddmSeen

public boolean ddmSeen ()

MonitorThread gọi phương thức này khi thấy yêu cầu hoặc phản hồi DDM. Nếu chưa từng thấy gói DDM nào trước đây, chúng ta sẽ chuyển trạng thái thành ST_READY và trả về "false". Nếu không, chỉ cần trả về giá trị true.

Ý tưởng là cho MonitorThread biết thời điểm chúng ta thấy gói DDM lần đầu tiên, để chúng ta có thể gửi thông báo truyền tin đến các trình xử lý khi một kết nối máy khách được thực hiện. Phương thức này được đồng bộ hoá để chúng ta chỉ gửi thông báo một lần.

Giá trị trả về
boolean

dumpDisplayList

public void dumpDisplayList (String viewRoot, 
                String view)

Tham số
viewRoot String

view String

dumpViewHierarchy

public void dumpViewHierarchy (String viewRoot, 
                boolean skipChildren, 
                boolean includeProperties, 
                boolean useV2, 
                DebugViewDumpHandler handler)

Tham số
viewRoot String

skipChildren boolean

includeProperties boolean

useV2 boolean

handler DebugViewDumpHandler

enableAllocationTracker

public void enableAllocationTracker (boolean enable)

Bật hoặc tắt Allocation tracker (Trình theo dõi việc phân bổ) cho khách hàng này.

Nếu được bật, VM sẽ bắt đầu theo dõi thông tin phân bổ. Lệnh gọi đến requestAllocationDetails() sẽ khiến VM gửi thông tin về tất cả các hoạt động phân bổ xảy ra giữa thời điểm bật và thời điểm yêu cầu.

Tham số
enable boolean

executeGarbageCollector

public void executeGarbageCollector ()

Buộc ứng dụng khách thực thi trình thu gom rác.

getClientData

public ClientData getClientData ()

Trả về đối tượng ClientData chứa thông tin về ứng dụng khách này.

Giá trị trả về
ClientData

getDebuggerListenPort

public int getDebuggerListenPort ()

Trả về cổng gỡ lỗi cho ứng dụng này.

Giá trị trả về
int

getDevice

public IDevice getDevice ()

Trả về IDevice mà Ứng dụng này đang chạy.

Giá trị trả về
IDevice

getDeviceImpl

public DeviceImpl getDeviceImpl ()

Trả về DeviceImpl mà Ứng dụng này đang chạy.

Giá trị trả về
DeviceImpl

getJdwpPacket

public JdwpPacket getJdwpPacket ()

Trả về thông tin cho gói JDWP đầy đủ đầu tiên trong vùng đệm.

Nếu chúng ta chưa có một gói đầy đủ, hãy trả về giá trị null.

Nếu chúng tôi chưa nhận được cái bắt tay JDWP, chúng tôi sẽ theo dõi nó ở đây và sử dụng nó mà không thừa nhận đã làm như vậy. Khi nhận được, chúng tôi sẽ gửi thông báo "HELO", đó là lý do tại sao điều này có thể gây ra một IOException.

Xin lưu ý rằng thứ tự các thao tác khi thiết lập một kết nối là:

Phía máy chủ lưu trữ: 1) adb track-jdwp 2) Nhận danh sách PID mới nhất chứa quy trình ứng dụng. 3) Mở/chuyển tiếp cổng gỡ lỗi và kết nối với thiết bị. 4) Thực hiện quy trình bắt tay. 5) Gửi HELO và chờ phản hồi.

Phía thiết bị/quy trình: a) Phân nhánh zygote và cập nhật ADB bằng PID. b) Gửi APNM nếu cổng gỡ lỗi được kết nối ("<pre-initialize>"). c) Liên kết quy trình với ứng dụng và gói thực tế. d) Gửi APNM đã cập nhật nếu cổng gỡ lỗi được kết nối.

Hai trình tự thực thi ở trên chạy hoàn toàn song song, với ràng buộc duy nhất là a) xảy ra trước 2).

Giá trị trả về
JdwpPacket

initializeHeapUpdateStatus

public void initializeHeapUpdateStatus ()

isDdmAware

public boolean isDdmAware ()

Trả về true nếu VM ứng dụng có nhận biết DDM.

Bạn chỉ có thể gọi ở đây sau khi thiết lập kết nối.

Giá trị trả về
boolean

isDebuggerAttached

public boolean isDebuggerAttached ()

Trả về true nếu một trình gỡ lỗi hiện được đính kèm vào ứng dụng.

Giá trị trả về
boolean

isHeapUpdateEnabled

public boolean isHeapUpdateEnabled ()

Trả về xem có bật bất kỳ bản cập nhật nào cho vùng nhớ heap hay không.

Giá trị trả về
boolean

isThreadUpdateEnabled

public boolean isThreadUpdateEnabled ()

Trả về xem có bật tính năng cập nhật luồng hay không.

Giá trị trả về
boolean

isValid

public boolean isValid ()

Trả về xem ClientImpl này có kết nối hợp lệ với VM ứng dụng hay không.

Giá trị trả về
boolean

kill

public void kill ()

Gửi thông báo tắt đến máy ảo. Cách này không nhất thiết hiệu quả nếu VM đang ở trạng thái gặp sự cố.

listViewRoots

public void listViewRoots (DebugViewDumpHandler replyHandler)

Tham số
replyHandler DebugViewDumpHandler

notifyVmMirrorExited

public void notifyVmMirrorExited ()

Các bản sao VM gỡ lỗi có thể thoát ra sau DDMLib, dẫn đến nhiều điều kiện mất Client vĩnh viễn hoặc điều kiện xung đột. Chúng ta cần thông báo cho DDMLib rằng trình gỡ lỗi hiện đang được đính kèm sẽ thoát và huỷ kết nối phản chiếu VM.

packetFailed

public void packetFailed (JdwpPacket reply)

Một yêu cầu trước đó đã không thành công. Đây là phản hồi dự kiến cho thông báo HELO khi trao đổi với một ứng dụng không phải DDM.

Tham số
reply JdwpPacket

đọc

public void read ()

Đọc dữ liệu từ kênh của chúng tôi, chỉ nên được gọi từ một luồng.

Hàm này được gọi khi dữ liệu được biết là có sẵn và chúng ta chưa có một gói đầy đủ trong vùng đệm. Nếu bộ nhớ đệm đã đầy, hãy mở rộng bộ nhớ đệm.

đăng ký

public void register (Selector sel)

Đăng ký ứng dụng với một Bộ chọn, cần được gọi ngay sau khi tạo ứng dụng.

Tham số
sel Selector

requestAllocationDetails

public void requestAllocationDetails ()

Gửi yêu cầu đến VM để gửi thông tin về tất cả các hoạt động phân bổ đã xảy ra kể từ khi gọi đến enableAllocationTracker(boolean) với enable được đặt thành null. Đây là thao tác không đồng bộ.

Bạn có thể truy cập thông tin phân bổ bằng ClientData.getAllocations(). Thông báo cho biết dữ liệu mới đã có sẽ được nhận thông qua AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) với changeMask chứa mặt nạ Client.CHANGE_HEAP_ALLOCATIONS.

requestAllocationStatus

public void requestAllocationStatus ()

Gửi yêu cầu đến VM để gửi trạng thái bật của tính năng theo dõi việc phân bổ. Đây là thao tác không đồng bộ.

Bạn có thể truy cập vào trạng thái phân bổ bằng ClientData.getAllocationStatus(). Thông báo cho biết trạng thái mới đã có sẽ được nhận qua AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) với changeMask chứa mặt nạ Client.CHANGE_HEAP_ALLOCATION_STATUS.

requestMethodProfilingStatus

public void requestMethodProfilingStatus ()

Gửi yêu cầu đến VM để gửi trạng thái bật của tính năng lập hồ sơ phương thức. Đây là thao tác không đồng bộ.

Bạn có thể truy cập vào trạng thái phân bổ bằng ClientData.getAllocationStatus(). Thông báo cho biết trạng thái mới đã có sẽ được nhận qua AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) với changeMask chứa mặt nạ Client.CHANGE_HEAP_ALLOCATION_STATUS.

requestNativeHeapInformation

public boolean requestNativeHeapInformation ()

Gửi yêu cầu cập nhật vùng nhớ heap gốc. Đây là yêu cầu không đồng bộ.

Bạn có thể truy cập vào thông tin về vùng nhớ heap gốc bằng ClientData.getNativeAllocationList(). Thông báo cho biết dữ liệu mới đã có sẽ được nhận thông qua AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) với changeMask chứa mặt nạ Client.CHANGE_NATIVE_HEAP_DATA.

Giá trị trả về
boolean

requestThreadStackTrace

public void requestThreadStackTrace (int threadId)

Gửi yêu cầu cập nhật dấu vết ngăn xếp luồng. Đây là thao tác không đồng bộ.

ClientData.getThreads()ThreadInfo.getStackTrace() có thể truy cập vào thông tin về luồng.

Thông báo cho biết dữ liệu mới đã có sẽ được nhận thông qua AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) với một changeMask chứa mặt nạ Client.CHANGE_THREAD_STACKTRACE.

Tham số
threadId int

requestThreadUpdate

public void requestThreadUpdate ()

Gửi yêu cầu cập nhật luồng. Đây là thao tác không đồng bộ.

ClientData.getThreads() có thể truy cập vào thông tin về luồng. Thông báo cho biết dữ liệu mới có sẵn sẽ được nhận thông qua AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) với changeMask chứa mặt nạ Client.CHANGE_THREAD_DATA.

setHeapInfoUpdateEnabled

public void setHeapInfoUpdateEnabled (boolean enabled)

Tham số
enabled boolean

setHeapSegmentUpdateEnabled

public void setHeapSegmentUpdateEnabled (boolean enabled)

Tham số
enabled boolean

setHeapUpdateEnabled

public void setHeapUpdateEnabled (boolean enabled)

Bật hoặc tắt tính năng cập nhật heap.

Nếu giá trị là true, mọi GC sẽ khiến ứng dụng gửi thông tin về vùng nhớ của ứng dụng.

Bạn có thể truy cập thông tin về vùng nhớ đống bằng ClientData.getVmHeapData().

Thông báo cho biết dữ liệu mới có sẵn sẽ được nhận thông qua AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) với changeMask chứa giá trị Client.CHANGE_HEAP_DATA.

Tham số
enabled boolean: cờ bật

setThreadUpdateEnabled

public void setThreadUpdateEnabled (boolean enabled)

Bật hoặc tắt tính năng cập nhật chuỗi.

Nếu true, VM sẽ có thể gửi thông tin về luồng. Bạn phải yêu cầu thông tin về luồng bằng requestThreadUpdate().

Tham số
enabled boolean: cờ bật.

startMethodTracer

public void startMethodTracer ()

startOpenGlTracing

public boolean startOpenGlTracing ()

Giá trị trả về
boolean

startSamplingProfiler

public void startSamplingProfiler (int samplingInterval, 
                TimeUnit timeUnit)

Tham số
samplingInterval int

timeUnit TimeUnit

stopMethodTracer

public void stopMethodTracer ()

stopOpenGlTracing

public boolean stopOpenGlTracing ()

Giá trị trả về
boolean

stopSamplingProfiler

public void stopSamplingProfiler ()

toString

public String toString ()

Trả về một chuỗi đại diện của đối tượng ClientImpl.

Giá trị trả về
String

toggleMethodProfiling

public void toggleMethodProfiling ()

Phương thức này không được dùng nữa.
Thay vào đó, hãy sử dụng startMethodTracer(), stopMethodTracer(), startSamplingProfiler(int, TimeUnit) hoặc stopSamplingProfiler().

Chuyển đổi trạng thái lập hồ sơ phương thức.

cập nhật

public void update (int changeMask)

Tham số
changeMask int

updateHeapInfo

public void updateHeapInfo ()

Kích hoạt một bản cập nhật heap duy nhất.

Phương thức được bảo vệ

gửi

protected void send (JdwpPacket packet)

Gửi một gói DDM đến máy khách.

Lý tưởng nhất là chúng ta có thể thực hiện việc này bằng một thao tác ghi trên kênh duy nhất. Nếu điều đó không xảy ra, chúng ta phải ngăn mọi người khác ghi vào kênh cho đến khi gói này hoàn tất, vì vậy, chúng ta sẽ đồng bộ hoá trên kênh.

Một mục tiêu khác là tránh các bản sao đệm không cần thiết, vì vậy, chúng ta sẽ ghi trực tiếp từ ByteBuffer của JdwpPacket.

Tham số
packet JdwpPacket