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

מחזירה את אובייקט ClientData שמכיל את פרטי הלקוח.

int getDebuggerListenPort()

מחזירה את יציאת ה-Debugger של הלקוח הזה.

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

שולח הודעת השבתה למכונה הווירטואלית.

void listViewRoots(DebugViewDumpHandler replyHandler)
void notifyVmMirrorExited()

מכונות וירטואליות של Debugger יכולות לצאת בלי ידיעת DDMLib, מה שמוביל למצבים שונים של תחרות או אובדן קבוע.Client

void packetFailed(JdwpPacket reply)

בקשה קודמת הסתיימה בכשל.

void read()

קריאת נתונים מהערוץ שלנו, צריך להפעיל את הפונקציה הזו רק משרשור אחד.

void register(Selector sel)

רושם את הלקוח באמצעות Selector. צריך לקרוא לפונקציה הזו מיד אחרי יצירת הלקוח.

void requestAllocationDetails()

שולח בקשה למכונה הווירטואלית לשלוח את המידע על כל ההקצאות שבוצעו מאז הקריאה אל enableAllocationTracker(boolean) עם הערך enable שמוגדר כ-null.

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

הפונקציה מחזירה ייצוג מחרוזת של אובייקט ClientImpl.

void toggleMethodProfiling()

השיטה הזו הוצאה משימוש. במקומה יש להשתמש ב-startMethodTracer(), ‏ stopMethodTracer(), ‏ startSamplingProfiler(int, TimeUnit) או ב-stopSamplingProfiler().

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

getDevice

public IDevice getDevice ()

מחזירה את IDevice שבו הלקוח הזה פועל.

החזרות
IDevice

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