המעקב ב-Winscope הוא חלק ממסגרת Android. בדף הזה מפורטים השלבים הנדרשים להורדה, לבנייה ולהפעלה של הכלי Winscope trace viewer באופן מקומי.
פיתוח Winscope באופן מקומי
כדי להגדיר את המחשב להרצת הכלי Winscope Tracer:
- הורדת המקור של Android
עוברים לתיקייה Winscope:
cd development/tools/winscopeמתקינים את יחסי התלות באמצעות:
npm installכדי לראות את רשימת הפקודות הזמינות, מריצים את הפקודה:
npm runכדי ליצור את כל יעדי הייצור והבדיקה, משתמשים בפקודה:
npm run build:prodמפעילים את Winscope באמצעות:
npm run start
יצירת חלקים נפרדים
אפשר ליצור חלקים בודדים של Winscope בנפרד באמצעות הפקודות הבאות:
| פקודה | תיאור |
|---|---|
build:trace_processor |
מבצע checkout ובונה מחדש את הגרסה האחרונה של Perfetto trace_processor. |
build:protos |
הקומפילציה של הגדרות ה-proto מתבצעת מחדש. |
הרצת בדיקות
Winscope מכיל בדיקות יחידה ובדיקות מקצה לקצה. כדי להריץ אותן, משתמשים ב-npm run
<command>:
| פקודה | תיאור |
|---|---|
test:unit:ci |
מריץ את בדיקות היחידות בפורמט פחות מפורט עבור CI או ווּק לפני שליחה. |
test:unit:dev |
מריץ את בדיקות היחידה בפורמט מפורט יותר עבור פיתוח מקומי. במצב הזה, המערכת עוקבת אחרי שינויים ו מריצה מחדש באופן אוטומטי את הבדיקות הנכונות. |
test:e2e |
מריצים את הבדיקות מקצה לקצה, כמו הבדיקות של פרוטוקול הכלים השונים. |
test:presubmit:quiet |
יוצר את כל בדיקות היחידות לפני השליחה, את כלי ה-lint ואת ניתוח הגרף בפורמט פחות מפורט עבור CI או וו לפני השליחה hook. |
test:presubmit |
יוצר את כל בדיקות היחידה (unit testing) לפני שליחת הקוד, את כלי ה-linter ואת ניתוח הגרף בפורמט מפורט יותר לפיתוח מקומי. |
test:all |
מריץ את כל הבדיקות (יחידה וקצה לקצה), את כלי ה-linting ואת ניתוח הגרפים בפורמט מפורט יותר לפיתוח מקומי. |
בדיקות מקצה לקצה
לפני שמריצים בדיקות מקצה לקצה, צריך להפעיל את הכלי המרוחק ולהתקין את הגרסה הנכונה של Chrome driver. בקטע הקוד הבא, הפקודה
run test:e2e מתקינה באופן אוטומטי את מנהל ההתקן של Chrome.
$ npm run start
$ npm run start:remote_tool_mock
$ npm run test:e2e
בטבלה הבאה מפורטות הפקודות הנדרשות והתיאורים שלהן. כדי להפעיל אותם, משתמשים ב-npm run command:
| פקודה | תיאור |
|---|---|
start:remote_tool_mock |
הפעלת מודל מדומה של הכלי מרחוק לצורך בדיקת פרוטוקול בין כלים. |
install:chromedriver |
הפעולה הזו מתקינה את מנהל ההתקן של Chrome שנדרש להרצת בדיקות מקצה לקצה. |
עדכון המיפוי של @IntDef
@IntDef היא הערה שמשמשת ב-Android להגבלת הערכים האפשריים של מספר שלם. Winscope משתמש במיפוי של ההערות האלה כדי להציג את שם הערך במקום המספר השלם.
אם ערכים חדשים של @IntDef מתווספים למסגרת Android אבל לא מתעדכנים ב-Winscope, הם מוצגים כערכי מספרים שלמים גולמיים במקום כמחרוזות תיאוריות. כדי לפתור את הבעיה, צריך לעדכן את קובץ המיפוי IntDef (development/tools/winscope/src/common/intDefMapping.json).
כדי לעדכן אוטומטית את המיפוי @IntDef:
מריצים את הסקריפט
update_intdef_mappings.shמהספרייהdevelopment/tools/winscope/scripts/בעץ Android המקומי. הסקריפט הזה מפעיל את תהליך ההערות שבו מתבצעת חילוץ של הערכים האחרונים@IntDefמהקוד ועדכון שלintDefMapping.json:cd development/tools/winscope ./scripts/update_intdef_mappings.shמבצעים Commit של השינויים ב-
src/common/intDefMapping.jsonבאמצעות הפקודהgit commitומעלים אותם באמצעות הפקודהrepo upload.
אם הסקריפט לא זמין, צריך לבצע את השלבים הבאים כדי לעדכן את המיפוי של @IntDef
באופן ידני מתיקיית הבסיס של Android ($ANDROID_BUILD_TOP):
מבצעים build של
framework-minus-apex-intdefsכדי להריץ את מעבד ההערות:m framework-minus-apex-intdefsמעתיקים את קובץ
intDefMapping.jsonשנוצר למאגר prebuilts:$ python3 -c 'import sys,json,collections; print(json.dumps(collections.OrderedDict(sorted(collections.ChainMap(*map(lambda x:json.load(open(x)), sys.argv[1:])).items())), indent=2))' $(find out/soong/.intermediates/frameworks/base -iname intDefMapping.json) > ./development/tools/winscope/src/common/intDefMapping.jsonמעלים את השינויים ב-Winscope באמצעות
repo upload.
פקודות אחרות
בנוסף לבנייה ולבדיקות, סקריפטים של Winscope מכילים יכולות אחרות, כמו שמוצג בטבלה. כדי להריץ אותן, משתמשים ב-npm run command:
| פקודה | תיאור |
|---|---|
format:check |
בודק אם יש בעיות בעיצוב הקוד באמצעות prettier. |
format:fix |
בודק ומתקן אוטומטית בעיות בעיצוב הקוד באמצעות prettier. |
eslint:check |
בודק אם יש בעיות בעיצוב הקוד באמצעות eslint. |
eslint:fix |
בודק בעיות בפורמט הקוד ומתקן אותן באופן אוטומטי באמצעות eslint. |
tslint:check |
בודק אם יש בעיות בעיצוב הקוד באמצעות tslint. |
tslint:fix |
בודק בעיות בפורמט הקוד ומתקן אותן באופן אוטומטי באמצעות tslint. |
deps_graph:check_cycles |
מנתח את הקוד כדי לזהות תלויות מעגליות. |
פתרון בעיות
כדאי לנסות את הטיפים הבאים לפתרון בעיות:
שגיאה
ProtocolError: missing required '<FIELD>'אוTypeError: Cannot read property '<PROP>' of nullהמצב הזה קורה כשקובץ פרטי העברה נוצר עם הגדרת פרוטו חדשה, שמכילה שדות חובה חדשים.
- חשוב לוודא שפותחים את ה-trace בגרסה הנכונה של Winscope (master, S או R).
אם יוצרים את השדה החדש ב-proto, צריך לקמפל מחדש את ה-proto ב-Winscope באמצעות
npm run build:protos.
חלק מגרסאות יחסי התלות שהותקנו שגויות (הבנייה נכשלת)
- חזרה לגרסה הקודמת של
package.jsonושלpackage-lock.json. הסרה שלnode_modules. מריצים אתnpm installשוב.
- חזרה לגרסה הקודמת של
הוספתי שדה חדש לאחד מקובצי ה-proto. איך מציגים את המידע?
- Winscope משתמש בהגדרות פרוטו מהרגע שבו הוא קומפל, ולכן שדות חדשים לא יופיעו כברירת מחדל. כדי להציג שדות חדשים, צריך לבנות מחדש את קובצי ה-proto באמצעות
npm run build:protos.
- Winscope משתמש בהגדרות פרוטו מהרגע שבו הוא קומפל, ולכן שדות חדשים לא יופיעו כברירת מחדל. כדי להציג שדות חדשים, צריך לבנות מחדש את קובצי ה-proto באמצעות