ما یک پیادهسازی مرجع برای AIDL VHAL ارائه میدهیم. نخ سرویس اصلی در VehicleService.cpp پیادهسازی شده است. پیادهسازی رابط VHAL در DefaultVehicleHal.cpp قرار دارد.
پیادهسازی مرجع بر اساس معماری دو لایه است. در لایه بالایی، DefaultVehicleHal ، رابط VHAL AIDL را پیادهسازی میکند و منطق VHAL عمومی را برای همه دستگاههای سختافزاری ارائه میدهد. در لایه پایینی، FakeVehicleHardware ، رابط IVehicleHardware را پیادهسازی میکند. این کلاس منطق VHAL تعامل با سختافزار واقعی یا گذرگاه وسیله نقلیه را شبیهسازی میکند و مختص دستگاه است. به صورت اختیاری، فروشندگان میتوانند همین معماری را تطبیق دهند، از همان کلاس DefaultVehicleHal استفاده مجدد کنند (آن را برای بازنویسی یک متد گسترش دهند) و پیادهسازی IVehicleHardware خود را ارائه دهند.
DefaultVehicleHal شامل منطق زیر است که عمومی تلقی میشود و میتواند برای هر پیادهسازی VHAL اعمال شود.
- رابط
IVehicleرا پیادهسازی میکند. - بررسیهای اولیه ورودی، از جمله بررسی شناسههای تکراری را انجام میدهد.
- اشیاء کلاینت (مثلاً
GetValuesClient) را برای هر عملیات برای هر کلاینت binder اختصاص میدهد و هر کدام را به یک مخزن سراسری اضافه میکند. - منطق فراخوانیهای غیرهمزمان، مانند اضافه کردن یک درخواست در حال انتظار به یک مخزن درخواست در حال انتظار را مدیریت میکند. درخواستهای در حال انتظار را هنگام دریافت نتایج حل میکند یا وقتی یکی از درخواستهای در حال انتظار مهلتش تمام میشود، خطا را برمیگرداند.
-
LargeParcelableرا سریالسازی و از سریالسازی خارج میکند (بهParcelableUtils.hمراجعه کنید). - اشتراک را مدیریت میکند (به
SubscriptionManager.hمراجعه کنید). - مجوزها را بررسی میکند. (به توابع
checkReadPermissionوcheckWritePermissionمراجعه کنید). - به صورت دورهای
IVehicleHardware.checkHealthرا فراخوانی میکند و سیگنالهای ضربان قلب را ارسال میکند (به تابعcheckHealthمراجعه کنید).
IVehicleHardware یک رابط عمومی است که برای نمایش پیادهسازی خاص سختافزار VHAL استفاده میشود. پیادهسازی مرجع برای IVehicleHardware ، FakeVehicleHardware است که از یک نقشه درون حافظهای برای ذخیره مقدار ویژگی استفاده میکند و با یک گذرگاه وسیله نقلیه واقعی ارتباط برقرار نمیکند. این رابط برای اجرا روی یک شبیهساز در نظر گرفته شده است و هیچ وابستگی خاص سختافزاری ندارد. پیادهسازیهای فروشنده نباید از آن به صورت موجود استفاده کنند و باید منطق خاص گذرگاه وسیله نقلیه را اضافه کنند.
از اندروید ۱۴ به بعد، FakeVehicleHardware در زمان اجرا و هنگام مقداردهی اولیه، پیکربندی ویژگی پشتیبانیشده را از پوشه /vendor/etc/automotive/vhalconfig/ دستگاه میخواند که حاوی یک فایل پیکربندی به سبک JSON است. برای فرمت فایل پیکربندی و محتوای فایل پیکربندی، به فایل مرجع VHAL README مراجعه کنید.
FakeVehicleHardware همچنین از لغو فایل پیکربندی برای آزمایش پشتیبانی میکند. اگر ویژگی سیستم persist.vendor.vhal_init_value_override تنظیم شده باشد (این ویژگی باید در زمان ساخت یا خیلی زود در طول بوت قبل از مقداردهی اولیه VHAL تنظیم شود)، از فایل پیکربندی موجود در پوشه /vendor/etc/automotive/vhaloverride/ در دستگاه برای لغو پیکربندی موجود استفاده میکند. یک پیادهسازی فروشنده میتواند از رویکرد مشابهی استفاده کند تا پیکربندی ویژگی پشتیبانی شده توسط VHAL به صورت کدنویسی نشده باشد و بتواند به صورت پویا در زمان شروع تصمیمگیری شود. لیست پیکربندیهای ویژگی خودرو باید پس از مقداردهی اولیه VHAL ایستا باشد.
با شروع از اندروید ۱۶، GRPCVehicleHardware یک پیادهسازی مرجع دیگر از IVehicleHardware ارائه میدهد. این پیادهسازی فرض میکند که یک سرور جداگانه روی یک دستگاه یا ماشین مجازی از راه دور در حال اجرا است که شامل منطق مدیریت ویژگیها است. VHAL که روی دستگاههای AAOS اجرا میشود، به عنوان یک پروکسی عمل میکند که درخواستها را به سرور از راه دور ارسال میکند. برای جزئیات بیشتر به grpc مراجعه کنید.