اندروید ۹ شامل پشتیبانی برای دریافت نام سرویس یک نمونه HAL مشخص بر اساس دستگاهی است که تستهای Vendor Test Suite (VTS) روی آن اجرا میشوند. اجرای تستهای VTS HAL که از نام سرویس آگاه هستند، توسعهدهندگان را قادر میسازد تا تست افزونههای فروشنده، چندین HAL و چندین نمونه HAL را در هر دو تست VTS سمت هدف و میزبان، خودکارسازی کنند.
درباره نام سرویسها
هر نمونه از سرویس HAL در حال اجرا، خود را با یک نام سرویس ثبت میکند.
در نسخههای قبلی اندروید، توسعهدهندگانی که تستهای VTS HAL را اجرا میکردند، موظف بودند نام سرویس صحیح را برای کلاینت تست در getService() تنظیم کنند یا نام را خالی بگذارند و از نام سرویس پیشفرض استفاده کنند. معایب این رویکرد شامل موارد زیر بود:
- اتکا به دانش توسعهدهندهی آزمون برای تنظیم نام صحیح سرویس.
- به طور پیشفرض محدود به آزمایش روی یک نمونه سرویس واحد است.
- نگهداری دستی نام سرویسها (یعنی چون نامها به صورت کدنویسی شده هستند، در صورت تغییر نام سرویس، باید به صورت دستی بهروزرسانی شوند.)
در اندروید ۹، توسعهدهندگان میتوانند بهطور خودکار نام سرویس را برای یک نمونه HAL مشخص بر اساس دستگاه تحت آزمایش دریافت کنند. مزایای این رویکرد شامل پشتیبانی از آزمایش است:
- افزونههای HAL فروشنده . به عنوان مثال، وقتی یک فروشنده پیادهسازی camera.provider HAL را دارد که روی دستگاههای فروشنده با نام سرویس سفارشی اجرا میشود، VTS میتواند نمونه فروشنده را شناسایی کرده و تست را روی آن اجرا کند.
- چندین نمونه HAL . به عنوان مثال، وقتی HAL مربوط به
graphics.composerدو نمونه دارد (یکی با نام سرویس "default" و دیگری با نام سرویس "vr")، VTS میتواند هر دو نمونه را شناسایی کرده و تست را روی هر یک از آنها اجرا کند. - تست چند HAL . هنگام تست چندین HAL با چندین نمونه استفاده میشود. به عنوان مثال، هنگام اجرای تست VTS که نحوه همکاری HAL های KeyMint (قبلاً Keymaster) و Gatekeeper را تأیید میکند، VTS میتواند تمام ترکیبات نمونههای سرویس را برای آن HAL ها آزمایش کند.
آزمایشهای سمت هدف
برای فعال کردن آگاهی از نام سرویس برای آزمایش سمت هدف، اندروید ۹ شامل یک محیط تست قابل تنظیم ( VtsHalHidlTargetTestEnvBase ) است که رابطهایی را برای موارد زیر فراهم میکند:
- هدف قرار دادن HAL(ها) را در آزمون ثبت کنید.
- تمام HAL(های) ثبت شده را فهرست کنید.
- نام(های) سرویس را برای HAL(های) ثبت شده ارائه شده توسط چارچوب VTS دریافت کنید.
علاوه بر این، چارچوب VTS پشتیبانی زمان اجرا را برای موارد زیر فراهم میکند:
- پیشپردازش فایل دودویی آزمایشی برای دریافت تمام HAL(های) آزمایشی ثبتشده.
- شناسایی تمام نمونههای سرویس در حال اجرا و دریافت نام سرویس برای هر نمونه (بر اساس
vendor/manifest.xmlبازیابی میشود). - محاسبه تمام ترکیبات نمونه (برای پشتیبانی از آزمایش چندگانه HAL).
- تولید یک تست جدید برای هر نمونه سرویس (ترکیب).
مثال:

تستهای سمت هدف آگاه از نام سرویس را تنظیم کنید
برای تنظیم محیط تست خود برای تست آگاهانه نام سرویس سمت هدف:
- یک
testEnvironmentبر اساسVtsHalHidlTargetTestEnvBaseتعریف کنید و HAL های تست را ثبت کنید:#include <VtsHalHidlTargetTestEnvBase.h> class testEnvironment : public::testing::VtsHalHidlTargetTestEnvBase { virtual void registerTestServices() override { registerTestService<IFoo>(); } };
- از
getServiceName()که توسط محیط تست ارائه میشود برای ارسال نام سرویس استفاده کنید:::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default")); // "default" is the default service name you want to use.
- محیط تست را در
main()وinitTestثبت کنید:int main(int argc, char** argv) { testEnv = new testEnvironment(); ::testing::AddGlobalTestEnvironment(testEnv); ::testing::InitGoogleTest(&argc, argv); testEnv->init(argc, argv); return RUN_ALL_TESTS(); }
برای مثالهای بیشتر، به VtsHalCameraProviderV2_4TargetTest.cpp مراجعه کنید.
تستهای سمت میزبان VTS
تستهای سمت میزبان VTS به جای اجرای فایلهای باینری تست روی دستگاه هدف، اسکریپتهای تست را در سمت میزبان اجرا میکنند. برای فعال کردن آگاهی از نام سرویس برای این تستها، میتوانید از قالبهای سمت میزبان برای اجرای چندین بارهی یک اسکریپت تست در برابر پارامترهای مختلف استفاده کنید (مشابه تست پارامتری gtest).

- اسکریپت تست hal ، سرویس(های) هدف HAL را در تست مشخص میکند.
-
hal_hidl_host_test(زیرکلاسparam_test) HAL(های) آزمایشی ثبتشده را از اسکریپت آزمایشی میگیرد، نام(های) سرویس مربوطه را برای HAL آزمایشی شناسایی میکند، سپس ترکیبات نام سرویس (برای آزمایش چند HAL) را به عنوان پارامترهای آزمایشی تولید میکند. همچنین متدی به نامgetHalServiceName()ارائه میدهد که نام سرویس مربوطه را مطابق با پارامتر ارسالی به مورد آزمایشی فعلی برمیگرداند. - الگوی param_test از منطق پذیرش لیستی از پارامترها و اجرای تمام موارد آزمایشی داده شده در برابر هر پارامتر پشتیبانی میکند. یعنی برای هر مورد آزمایشی، N مورد آزمایشی پارامتری جدید (N = اندازه پارامترها) تولید میکند که هر کدام دارای یک پارامتر داده شده هستند.
تستهای سمت میزبان آگاه از نام سرویس را تنظیم کنید
برای تنظیم محیط تست خود برای تست آگاهانه نام سرویس سمت میزبان:
- سرویس HAL هدف را در اسکریپت تست مشخص کنید:
TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
- تابع
getHalServiceName()را فراخوانی کنید و نام را به init hal ارسال کنید:self.dut.hal.InitHidlHal( target_type='foo', target_basepaths=self.dut.libPaths, target_version=1.0, target_package='android.hardware.foo', target_component_name='IFoo', hw_binder_service_name =self.getHalServiceName("android.hardware.foo@1.0::IFoo"), bits=int(self.abi_bitness))
برای مثالهای بیشتر، به VtsHalMediaOmxStoreV1_0HostTest.py مراجعه کنید.
ثبت نام آزمون HALs
در نسخههای قبلی اندروید، VTS با استفاده از گزینه <precondition-lshal> که در AndroidTest.xml پیکربندی شده بود، HAL در حال آزمایش را شناسایی میکرد. این رویکرد به سختی قابل نگهداری بود (زیرا به توسعهدهندگان متکی بود تا آزمایش را به درستی پیکربندی کنند و پیکربندی را بر اساس آن بهروزرسانی کنند) و نادرست بود (زیرا فقط شامل اطلاعات بسته و نسخه بود و اطلاعات رابط را شامل نمیشد).
در اندروید ۹، VTS با استفاده از آگاهی از نام سرویس، HAL تست را شناسایی میکند. HALهای تست ثبتشده همچنین برای موارد زیر مفید هستند:
- بررسیهای پیششرط . قبل از اجرای تست HAL، VTS میتواند تأیید کند که HAL تست در دستگاه هدف موجود است و در صورت عدم وجود، تستها را رد کند (به بررسی قابلیت تست VTS مراجعه کنید).
- اندازهگیری پوشش . VTS از اندازهگیری پوشش کد بین فرآیندی از طریق دانش مربوط به سرویسهای HAL آزمایشی که میخواهد اندازهگیری کند (یعنی برای پاکسازی پوشش برای فرآیند سرویس hal) پشتیبانی میکند.