أوامر قذيفة الجهاز

أثناء اختبار VTS، تُستخدم أوامر shell لتنفيذ اختبار ثنائي من جانب الهدف، للحصول على/تعيين الخصائص، ومتغيرات البيئة، ومعلومات النظام، ولبدء/إيقاف إطار عمل Android. يمكنك تنفيذ أوامر Shell لجهاز VTS باستخدام أمر adb shell أو برنامج تشغيل VTS shell الذي يعمل على الجهاز (مستحسن).

استخدم قذيفة ADB

يجب أن تستخدم الاختبارات التي تتطلب إيقاف تشغيل منفذ USB أو إعادة تشغيل الجهاز أثناء الاختبار غلاف ADB لأن برنامج تشغيل VTS shell غير متوفر بدون اتصال USB مستمر. يمكنك استدعاء ADB Shell من كائن AndroidDevice في البرنامج النصي لاختبار Python. أمثلة:

  • احصل على كائن جهاز Android:
    self.device = self.android_devices[0]
    
  • قم بإصدار أمر Shell واحد:
    result = self.device.adb.shell(‘ls')
    

استخدم برنامج تشغيل VTS Shell

برنامج تشغيل shell VTS هو وكيل ثنائي يعمل على الجهاز وينفذ أوامر shell. افتراضيًا، يستخدم VTS برنامج تشغيل shell إذا كان برنامج التشغيل يعمل على الجهاز لأن هذه الطريقة لها زمن استجابة أقل من استخدام أمر adb shell .

الشكل 1. سائق قذيفة VTS.

يدعم إطار عمل VTS اختبار الأجهزة المتعددة حيث يتم تمثيل كل جهاز Android ككائن AndroidDevice في المشغل الأساسي. افتراضيًا، يقوم إطار عمل VTS بدفع وكيل VTS وثنائيات برنامج تشغيل VTS Shell إلى كل جهاز يعمل بنظام Android وينشئ اتصالات TCP بوكلاء VTS على تلك الأجهزة.

لتنفيذ أمر shell، يقوم برنامج Python النصي من جانب المضيف باستدعاء دالة إلى كائن ShellMirror داخل كائن AndroidDevice. يقوم كائن ShellMirror بحزم نصوص أوامر shell في رسالة protobuf ويرسلها (عبر قناة TCP) إلى وكيل VTS على جهاز Android. يقوم الوكيل الذي يعمل على الجهاز بعد ذلك بإعادة توجيه أمر shell إلى برنامج تشغيل shell VTS عبر مقبس Unix.

عندما يتلقى برنامج تشغيل shell VTS أمر shell، فإنه ينفذ الأمر عبر nohup على غلاف الجهاز لمنع التعليق. يتم بعد ذلك استرداد رمز Stdout وstderr ورمز الإرجاع من nohup وإرساله مرة أخرى إلى وكيل VTS. أخيرًا، يرد الوكيل على المضيف عن طريق تغليف نتيجة (نتائج) الأمر في رسالة protobuf .

مزايا

تشمل مزايا استخدام برنامج تشغيل VTS shell بدلاً من adb shell ما يلي:

  • مصداقية. يستخدم برنامج تشغيل Shell VTS nohup لتنفيذ الأوامر على الإعداد الافتراضي. نظرًا لأن اختبارات VTS هي في الغالب اختبارات HAL وkernel ذات المستوى الأدنى، nohup يضمن عدم تعليق أوامر الصدفة أثناء التنفيذ.
  • أداء . بينما يقوم أمر adb shell بتخزين بعض النتائج مؤقتًا (مثل إدراج الملفات في الدليل)، فإنه يحتوي على حمل اتصال عند تنفيذ مهام مثل تنفيذ اختبار ثنائي. يحافظ برنامج تشغيل VTS shell على اتصال نشط طوال الاختبار، وبالتالي فإن الحمل الوحيد هو اتصال USB. في الاختبار الذي أجريناه، يعد استخدام برنامج تشغيل VTS Shell لتنفيذ أمر يتضمن 100 استدعاء لملف ثنائي gtest فارغ أسرع بنسبة 20 بالمائة تقريبًا من استخدام adb shell ؛ الفرق الفعلي أكبر نظرًا لأن اتصال VTS Shell يحتوي على تسجيل واسع النطاق.
  • حفظ الدولة . يحتفظ برنامج تشغيل Shell VTS بجلسة عمل طرفية لكل اسم طرفي (الاسم الطرفي الافتراضي هو default ). متغيرات البيئة التي تم تعيينها في جلسة طرفية واحدة متاحة فقط للأوامر اللاحقة في نفس الجلسة.
  • قابلة للتمديد . يتم تغليف اتصالات أوامر Shell بين إطار عمل VTS وبرنامج تشغيل الجهاز في protobuf لتمكين الضغط المحتمل والاتصال عن بعد والتشفير وما إلى ذلك في المستقبل. تتوفر أيضًا إمكانيات أخرى لتحسين الأداء، بما في ذلك تحليل النتائج من جانب الجهاز عندما يصبح حمل الاتصال أكبر من تحليل سلسلة النتائج.

سلبيات

تشمل عيوب استخدام برنامج تشغيل VTS shell بدلاً من adb shell ما يلي:

  • ثنائيات إضافية . يجب دفع ملفات وكيل VTS إلى الجهاز وتنظيفها بعد تنفيذ الاختبار.
  • يتطلب اتصال نشط . إذا تم فقدان اتصال TCP بين المضيف والوكيل أثناء الاختبار (بسبب قطع اتصال USB، أو إيقاف تشغيل المنفذ، أو تعطل الجهاز، وما إلى ذلك) سواء عن قصد أو عن غير قصد، فلا يمكن نقل أمر shell إلى وكيل VTS. حتى مع التبديل التلقائي إلى adb shell ، ستكون نتيجة الأمر وحالته قبل قطع الاتصال غير معروفة.

أمثلة

أمثلة على استخدام أوامر shell في برنامج نصي لاختبار Python من جانب مضيف VTS:

  • احصل على كائن جهاز Android:
    self.device = self.android_devices[0]
    
  • احصل على كائن Shell للجهاز المحدد:
    self.shell = self.device.shell
    
  • قم بإصدار أمر Shell واحد:
    results = self.shell.Execute(‘ls')
    
  • قم بإصدار قائمة بأوامر الصدفة:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

كائن نتيجة الأمر

كائن الإرجاع من تنفيذ أمر Shell هو قاموس يحتوي على المفاتيح 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')