فرمان‌های پوسته دستگاه

درطول آزمایش VTS، از دستورات پوسته برای اجرای باینری آزمایش سمت هدف، برای دریافت/تنظیم ویژگی‌ها، متغیرهای محیطی، و اطلاعات سیستم، و برای شروع/توقف چارچوب 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 تأخیر کمتری دارد.

شکل ۱. درایور پوسته VTS.

چارچوب VTS از آزمایش چنددستگاهی پشتیبانی می‌کند که در آن هر دستگاه Android به‌عنوان یک شی AndroidDevice در دونده پایه نشان داده می‌شود. به‌طور پیش‌فرض، چارچوب VTS کدهای دودویی عامل VTS و درایور پوسته VTS را به هر دستگاه Android ارسال می‌کند و اتصال TCP با عامل‌های VTS در آن دستگاه‌ها برقرار می‌کند.

برای اجرای فرمان پوسته، اسکریپت Python سمت میزبان با تابع درون شی AndroidDevice به شی ShellMirror فراخوانی می‌کند. شیء ShellMirror نوشتارهای فرمان پوسته را در یک پیام protobuf بسته‌بندی می‌کند و آن را (ازطریق کانال TCP) به عامل VTS در دستگاه Android ارسال می‌کند. عامل درحال اجرا در دستگاه سپس فرمان پوسته را ازطریق سوکت Unix به درایور پوسته VTS هدایت می‌کند.

وقتی درایور پوسته VTS فرمان پوسته‌ای دریافت می‌کند، فرمان را ازطریق nohup در پوسته دستگاه اجرا می‌کند تا از معلقه جلوگیری کند. سپس stdout،‏ stderr، و کد برگشتی از nohup بازیابی و به عامل VTS برگردانده می‌شود. درنهایت، نماینده با پیچیدن نتیجه(های) فرمان در پیام protobuf به میزبان پاسخ می‌دهد.

مزایا

مزایای استفاده از درایور پوسته VTS به‌جای adb shell عبارتند از:

  • قابلیت اطمینان. گرداننده پوسته VTS از nohup برای اجرای فرمان‌ها در تنظیم پیش‌فرض استفاده می‌کند. ازآنجایی‌که آزمایش‌های VTS بیشتر آزمایش‌های HAL و هسته سطح پایین هستند، nohup تضمین می‌کند که فرمان‌های پوسته درطول اجرا متوقف نشوند.
  • عملکرد. درحالی‌که دستور adb shell برخی‌از نتایج را (مثل فهرست کردن فایل‌ها در یک دایرکتوری) در حافظه نهان ذخیره می‌کند، هنگام انجام تکالیف، مثل اجرای یک فایل باینری آزمایشی، سربار اتصال دارد. برنامه درایور پوسته VTS درطول آزمایش اتصال فعالی را حفظ می‌کند، بنابراین تنها سربار ارتباط USB است. در آزمایش‌های ما، استفاده از درایور پوسته VTS برای اجرای فرمان با ۱۰۰ فراخوانی به باینری gtest خالی حدود ۲۰ درصد سریع‌تر از استفاده از adb shell است؛ تفاوت واقعی بیشتر است زیرا ارتباط پوسته VTS دارای گزارش‌گیری گسترده است.
  • حفظ وضعیت. درایور پوسته VTS یک جلسه پایانه برای هر نام پایانه حفظ می‌کند (نام پایانه پیش‌فرض default است). متغیرهای محیطی تنظیم‌شده در یک جلسه پایانه فقط برای دستورات بعدی در همان جلسه دردسترس هستند.
  • قابل‌تمدید. ارتباطات فرمان پوسته بین چارچوب VTS و درایور دستگاه در 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')