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().
סיכום
Constructors ציבוריים | |
|---|---|
ClientImpl(DeviceImpl device, SocketChannel chan, int pid)
יוצרים אובייקט לחיבור לקוח חדש. |
|
methods ציבוריים | |
|---|---|
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()
מחזירה את יציאת ה-Debugger של הלקוח הזה. |
IDevice
|
getDevice()
מחזירה את |
DeviceImpl
|
getDeviceImpl()
מחזירה את |
JdwpPacket
|
getJdwpPacket()
הפונקציה מחזירה מידע על חבילת ה-JDWP המלאה הראשונה במאגר. |
void
|
initializeHeapUpdateStatus()
|
boolean
|
isDdmAware()
הפונקציה מחזירה את הערך |
boolean
|
isDebuggerAttached()
הפונקציה מחזירה |
boolean
|
isHeapUpdateEnabled()
הפונקציה מחזירה תשובה אם מופעל עדכון של הערימה. |
boolean
|
isThreadUpdateEnabled()
הפונקציה מחזירה תשובה אם העדכון של השרשור מופעל. |
boolean
|
isValid()
הפונקציה מחזירה את הערך שקובע אם ל- |
void
|
kill()
שולח הודעת השבתה למכונה הווירטואלית. |
void
|
listViewRoots(DebugViewDumpHandler replyHandler)
|
void
|
notifyVmMirrorExited()
מכונות וירטואליות של Debugger יכולות לצאת בלי ידיעת DDMLib, מה שמוביל למצבים שונים של תחרות או אובדן קבוע. |
void
|
packetFailed(JdwpPacket reply)
בקשה קודמת הסתיימה בכשל. |
void
|
read()
קריאת נתונים מהערוץ שלנו, צריך להפעיל את הפונקציה הזו רק משרשור אחד. |
void
|
register(Selector sel)
רושם את הלקוח באמצעות Selector. צריך לקרוא לפונקציה הזו מיד אחרי יצירת הלקוח. |
void
|
requestAllocationDetails()
שולח בקשה למכונה הווירטואלית לשלוח את המידע על כל ההקצאות שבוצעו מאז הקריאה אל |
void
|
requestAllocationStatus()
שולחת בקשה למכונה הווירטואלית לשליחת סטטוס ההפעלה של מעקב ההקצאה. |
void
|
requestMethodProfilingStatus()
שולחת בקשה למכונה הווירטואלית כדי לשלוח את סטטוס ההפעלה של פרופיל השיטה. |
boolean
|
requestNativeHeapInformation()
שולח בקשה לעדכון של ה-heap המקורי. |
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 ללקוח. |
Constructors ציבוריים
ClientImpl
public ClientImpl (DeviceImpl device, SocketChannel chan, int pid)
יוצרים אובייקט לחיבור לקוח חדש.
| פרמטרים | |
|---|---|
device |
DeviceImpl: המכשיר שאליו שייך הלקוח |
chan |
SocketChannel: ERROR(/SocketChannel) המחובר. |
pid |
int: מזהה התהליך של הלקוח. |
methods ציבוריים
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, כדי שנוכל לשלוח שידור ל-handlers כשנוצר חיבור לקוח. השיטה הזו מסונכרנת כדי לשלוח את השידור רק פעם אחת.
| החזרות | |
|---|---|
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() תגרום למכונה הווירטואלית לשלוח את המידע על כל ההקצאות שהתרחשו בין ההפעלה לבין הבקשה.
| פרמטרים | |
|---|---|
enable |
boolean |
executeGarbageCollector
public void executeGarbageCollector ()
הפקודה מאלצת את הלקוח להפעיל את איסוף האשפה שלו.
getClientData
public ClientData getClientData ()
מחזירה את אובייקט ClientData שמכיל את פרטי הלקוח.
| החזרות | |
|---|---|
ClientData |
|
getDebuggerListenPort
public int getDebuggerListenPort ()
מחזירה את יציאת ה-Debugger של הלקוח הזה.
| החזרות | |
|---|---|
int |
|
getDeviceImpl
public DeviceImpl getDeviceImpl ()
מחזירה את DeviceImpl שבו הלקוח הזה פועל.
| החזרות | |
|---|---|
DeviceImpl |
|
getJdwpPacket
public JdwpPacket getJdwpPacket ()
הפונקציה מחזירה מידע על חבילת ה-JDWP המלאה הראשונה במאגר.
אם עדיין אין לנו חבילה מלאה, מחזירים null.
אם עדיין לא קיבלנו את לחיצת היד של JDWP, אנחנו מחכים לה כאן ומשתמשים בה בלי להודות שעשינו את זה. אחרי שנקבל אותה, נשלח את ההודעה 'HELO', ולכן יכול להיות שנקבל כאן IOException.
שימו לב: סדר הפעולות ליצירת חיבור הוא:
בצד המארח: 1) adb track-jdwp 2) קבלת רשימה מעודכנת של מזהי תהליכים (PID) שמכילים את תהליך האפליקציה. 3) פותחים/מעבירים את יציאת מאתר הבאגים ומתחברים למכשיר. 4) מבצעים לחיצת יד. 5) שולחים HELO ומחכים לתגובה.
בצד המכשיר/התהליך: א) יצירת עותק של zygote ועדכון ADB עם ה-PID. ב) שליחת APNM אם יציאת מאתר הבאגים מחוברת ("<pre-initialize>"). ג) קישור התהליך לאפליקציה ולחבילה בפועל. ד) שליחת APNM מעודכן אם יציאת מאתר הבאגים מחוברת.
שתי רצפי ההרצה שלמעלה פועלים במקביל לחלוטין, והאילוץ היחיד הוא א) קורה לפני 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 במצב קריסה.
listViewRoots
public void listViewRoots (DebugViewDumpHandler replyHandler)
| פרמטרים | |
|---|---|
replyHandler |
DebugViewDumpHandler |
notifyVmMirrorExited
public void notifyVmMirrorExited ()
מכונות וירטואליות של Debugger יכולות לצאת בלי ידיעת DDMLib, מה שמוביל למצבים שונים של תחרות או אובדן קבוע.Client אנחנו צריכים להודיע ל-DDMLib שהבאג שכרגע מצורף יוצא ומפסיק את חיבור המראה של המכונה הווירטואלית.
packetFailed
public void packetFailed (JdwpPacket reply)
בקשה קודמת הסתיימה בכשל. זו התגובה הצפויה להודעת HELO כשמתקשרים עם לקוח שאינו DDM.
| פרמטרים | |
|---|---|
reply |
JdwpPacket |
קריאה
public void read ()
קריאת נתונים מהערוץ שלנו, צריך להפעיל את הפונקציה הזו רק משרשור אחד.
הפונקציה הזו מופעלת כשהנתונים זמינים, אבל עדיין אין לנו חבילה מלאה במאגר. אם המאגר מלא, צריך להרחיב אותו.
להירשם
public void register (Selector sel)
רושם את הלקוח באמצעות Selector. צריך לקרוא לפונקציה הזו מיד אחרי יצירת הלקוח.
| פרמטרים | |
|---|---|
sel |
Selector |
requestAllocationDetails
public void requestAllocationDetails ()
שולח בקשה למכונה הווירטואלית לשלוח את המידע על כל ההקצאות שבוצעו מאז הקריאה אל enableAllocationTracker(boolean) עם הערך enable שמוגדר כ-null. הפעולה הזו היא אסינכרונית.
המידע על ההקצאה נגיש לClientData.getAllocations(). ההתראה על כך שהנתונים החדשים זמינים תתקבל דרך AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) עם changeMask
שמכיל את המסכה Client.CHANGE_HEAP_ALLOCATIONS.
requestAllocationStatus
public void requestAllocationStatus ()
שולחת בקשה למכונה הווירטואלית לשליחת סטטוס ההפעלה של מעקב ההקצאה. הפעולה הזו היא אסינכרונית.
אפשר לגשת לסטטוס ההקצאה דרך ClientData.getAllocationStatus(). ההתראה על הזמינות של הסטטוס החדש תתקבל דרך AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) עם changeMask שמכיל את המסכה Client.CHANGE_HEAP_ALLOCATION_STATUS.
requestMethodProfilingStatus
public void requestMethodProfilingStatus ()
שולחת בקשה למכונה הווירטואלית כדי לשלוח את סטטוס ההפעלה של פרופיל השיטה. הפעולה הזו היא אסינכרונית.
אפשר לגשת לסטטוס ההקצאה דרך ClientData.getAllocationStatus(). ההתראה על הזמינות של הסטטוס החדש תתקבל דרך AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) עם changeMask שמכיל את המסכה Client.CHANGE_HEAP_ALLOCATION_STATUS.
requestNativeHeapInformation
public boolean requestNativeHeapInformation ()
שולחת בקשה לעדכון של ה-heap המקורי. הפעולה הזו היא אסינכרונית.
אפשר לגשת למידע על ה-heap המקורי באמצעות 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, כל GC יגרום ללקוח לשלוח את פרטי ה-heap שלו.
אפשר לגשת למידע על הערימה באמצעות 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 המכונה הווירטואלית תוכל לשלוח מידע על השרשור. צריך לשלוח בקשה לקבלת פרטי השרשור אל 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 |