פקודות מעטפת של מכשיר

במהלך בדיקת VTS, פקודות מעטפת משמשות לביצוע בדיקה בצד היעד בינארית, כדי לקבל/להגדיר מאפיינים, משתני סביבה ונתוני מערכת, כדי להפעיל/להפסיק את ה-framework של Android. אפשר להפעיל מעטפת של מכשיר VTS פקודות באמצעות הפקודה adb shell או מנהל התקן המעטפת של VTS פועלות במכשיר (מומלץ).

שימוש במעטפת ADB

בדיקות שמחייבות כיבוי של יציאת ה-USB או הפעלה מחדש של המכשיר במהלך חייבים להשתמש במעטפת ADB, כי מנהל התקן המעטפת של VTS לא זמין ללא חיבור USB קבוע. אפשר להפעיל מעטפת ADB AndroidDevice בסקריפט הבדיקה של Python. לדוגמה:

  • אחזור אובייקט במכשיר Android:
    self.device = self.android_devices[0]
    
  • שולחים פקודת מעטפת אחת:
    result = self.device.adb.shell(‘ls')
    

שימוש במנהל המעטפת של VTS

מנהל התקן המעטפת של VTS הוא קובץ בינארי של סוכן שרץ במכשיר ומבצע פקודות מעטפת. כברירת מחדל, VTS משתמש במנהל המעטפת אם הנהג פועל במכשיר, כי לשיטה הזו יש פחות זמן אחזור בהשוואה לשימוש בפקודה adb shell.

איור 1. מנהל התקן מעטפת VTS.

מסגרת VTS תומכת בבדיקות מרובות מכשירים כאשר כל מכשיר Android מיוצגת כאובייקט AndroidDevice ב-Base Runner. כברירת מחדל, VTS תוכנת framework דוחפת את הקבצים הבינאריים של סוכן VTS ומעטפת של מעטפת VTS לכל מכשיר Android וליצור חיבורי TCP לסוכני VTS במכשירים האלה.

כדי להריץ פקודת מעטפת, סקריפט Python בצד המארח יוצר פונקציה לקריאה לאובייקט ShellMirror שבתוך אובייקט AndroidDevice. מראה הצדפה הטקסט של פקודת המעטפת מקבץ את הטקסטים protobuf ושולחת אותה (דרך ערוץ ה-TCP) לסוכן VTS ב-Android במכשיר. הנציג פועל במכשיר ולאחר מכן מעביר את פקודת המעטפת למעטפת של VTS דרך שקע Unix.

כשמנהל המעטפת של VTS מקבל פקודת מעטפת, הוא מבצע את הפקודה דרך nohup ב- מעטפת המכשיר כדי למנוע תלייה. לאחר מכן, Stdout, stderr וקוד החזרה אחזור מ-nohup ונשלח בחזרה לנציג VTS. לבסוף, הנציג משיב למארח על ידי גלישת תוצאות הפקודות הודעה אחת (protobuf).

יתרונות

היתרונות של שימוש במנהל המעטפת של VTS במקום adb shell כוללים:

  • אמינות. מנהל המעטפת של VTS משתמש nohup כדי להריץ פקודות בהגדרת ברירת המחדל. ככל שבדיקות VTS בדיקות HAL ובדיקות ליבה נמוכות יותר ברובן, nohup מבטיחה שהמעטפת הפקודות לא תלויות במהלך הביצוע.
  • ביצועים. בזמן שהפקודה adb shell שומר תוצאות מסוימות במטמון (למשל, הצגת קבצים בספרייה) שיש לו חיבור תקורה בזמן ביצוע משימות, כמו הרצת קובץ בינארי לבדיקה. מנהל התקן מעטפת VTS שומר על חיבור פעיל במהלך הבדיקה, כך שהתקורה היחידה היא USB. תקשורת בלתי מכוונת. בבדיקות שלנו, השתמשנו במנהל התקן המעטפת של VTS כדי להריץ פקודה עם 100 קריאות לבינארי gtest ריק הוא מהיר יותר ב-20 אחוז בערך משימוש adb shell; ההבדל בפועל גדול יותר מאז מעטפת VTS לתקשורת הזו יש רישום נרחב ביומן.
  • ניהול מדינה. מנהל המעטפת של VTS מחזיק בטרמינל סשן לכל שם טרמינל (שם הטרמינל המוגדר כברירת מחדל הוא ברירת מחדל). משתני סביבה שמוגדרים בסשן אחד בטרמינל הם זמין רק לפקודות הבאות באותו סשן.
  • ניתנת להרחבה. תקשורת פקודות במעטפת בין VTS framework ומנהל התקן של המכשיר עטופים ב-protobuf כדי להפעיל פוטנציאל דחיסה, העברת נתונים, הצפנה וכו' בעתיד. אפשרויות נוספות עבור אפשר גם לשפר את הביצועים, כולל ניתוח תוצאות בצד המכשיר כאשר תקורת התקשורת הופכת גדולה יותר מניתוח מחרוזות התוצאה.

חסרונות

החסרונות בשימוש במנהל המעטפת של VTS במקום adb shell הם:

  • קבצים בינאריים נוספים. יש לדחוף את קובצי סוכן VTS אל המכשיר ותנקה לאחר ביצוע הבדיקה.
  • נדרש חיבור פעיל. אם חיבור ה-TCP בין המארח והסוכן אבדו במהלך הבדיקה (עקב ניתוק USB, כיבוי יציאות, של קריסת מכשיר וכו') באופן מכוון או לא מכוון, פקודת מעטפת לא ניתן להעביר לסוכן VTS. גם עם מעבר אוטומטי אל adb shell, התוצאה והמצב של הפקודה לפני הניתוק לא יהיה ידוע.

דוגמאות

דוגמאות לשימוש בפקודות מעטפת בסקריפט בדיקה של Python בצד המארח של VTS:

  • אחזור אובייקט במכשיר Android:
    self.device = self.android_devices[0]
    
  • קבלת אובייקט מעטפת למכשיר שנבחר:
    self.shell = self.device.shell
    
  • שולחים פקודת מעטפת אחת:
    results = self.shell.Execute(‘ls')
    
  • הנפקת רשימה של פקודות מעטפת:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

אובייקט תוצאת הפקודה

האובייקט המוחזר מביצוע של פקודת מעטפת הוא מילון שמכיל את המקשים stdouts, stderrs ו-return_codes. בין אם פקודת המעטפת מסופקת כמחרוזת יחידה או כרשימה של מחרוזות הפקודה, כל ערך במילון התוצאות הוא תמיד רשימה.

כדי לאמת את קוד ההחזרה של רשימת פקודות, סקריפט הבדיקה צריך לבדוק את האינדקסים. דוגמה:

asserts.assertFalse(any(results[‘return_codes']), ‘some command failed.')

לחלופין, הסקריפט יכול לבדוק כל אינדקס פקודות בנפרד. דוגמה:

asserts.assertEqual(results[‘return_codes'][0], 0, ‘first command failed')
asserts.assertEqual(results[‘return_codes'][1], 0, ‘second command failed')