আমরা AIDL VHAL-এর জন্য একটি রেফারেন্স ইমপ্লিমেন্টেশন প্রদান করি। প্রধান সার্ভিস থ্রেডটি VehicleService.cpp তে ইমপ্লিমেন্ট করা হয়েছে। VHAL ইন্টারফেস ইমপ্লিমেন্টেশনটি DefaultVehicleHal.cpp তে অবস্থিত।
রেফারেন্স ইমপ্লিমেন্টেশনটি একটি দ্বি-স্তরীয় আর্কিটেকচারের উপর ভিত্তি করে তৈরি। উপরের স্তরে, DefaultVehicleHal ক্লাসটি VHAL AIDL ইন্টারফেস ইমপ্লিমেন্ট করে এবং সকল হার্ডওয়্যার ডিভাইসের জন্য জেনেরিক VHAL লজিক প্রদান করে। নিচের স্তরে, FakeVehicleHardware ক্লাসটি IVehicleHardware ইন্টারফেস ইমপ্লিমেন্ট করে। এই ক্লাসটি প্রকৃত হার্ডওয়্যার বা ভেহিকল বাসের সাথে ইন্টারঅ্যাক্ট করার VHAL লজিককে সিমুলেট করে এবং এটি ডিভাইস-নির্দিষ্ট। ঐচ্ছিকভাবে, ভেন্ডররা এই একই আর্কিটেকচারকে অভিযোজিত করতে পারে, একই DefaultVehicleHal ক্লাসটি পুনরায় ব্যবহার করতে পারে (একটি মেথড ওভাররাইট করার জন্য এটিকে এক্সটেন্ড করে), এবং তাদের নিজস্ব IVehicleHardware ইমপ্লিমেন্টেশন প্রদান করতে পারে।
DefaultVehicleHal নিম্নলিখিত লজিকটি রয়েছে, যা জেনেরিক হিসেবে বিবেচিত এবং যেকোনো VHAL ইমপ্লিমেন্টেশনে প্রযোজ্য হতে পারে।
-
IVehicleইন্টারফেসটি বাস্তবায়ন করে। - প্রাথমিক ইনপুট যাচাই করে, যার মধ্যে ডুপ্লিকেট আইডি যাচাইও অন্তর্ভুক্ত।
- প্রতিটি বাইন্ডার ক্লায়েন্টের প্রতিটি অপারেশনের জন্য ক্লায়েন্ট অবজেক্ট (যেমন,
GetValuesClient) বরাদ্দ করে এবং সেগুলোকে একটি গ্লোবাল পুলে যুক্ত করে। - অ্যাসিঙ্ক কলব্যাক লজিক পরিচালনা করে, যেমন একটি অপেক্ষাধীন অনুরোধকে পেন্ডিং রিকোয়েস্ট পুলে যুক্ত করা। ফলাফল পেলে অপেক্ষাধীন অনুরোধগুলো সমাধান করে অথবা কোনো একটি অনুরোধের সময়সীমা শেষ হয়ে গেলে ত্রুটি ফেরত দেয়।
-
LargeParcelableসিরিয়ালাইজ এবং ডিসিরিয়ালাইজ করে (ParcelableUtils.hদেখুন)। - সাবস্ক্রিপশন পরিচালনা করে (
SubscriptionManager.hদেখুন)। - অনুমতি যাচাই করে। (
checkReadPermissionএবংcheckWritePermissionফাংশনগুলো দেখুন)। - নির্দিষ্ট সময় পর পর
IVehicleHardware.checkHealthকল করে এবং হার্টবিটের সংকেত পাঠায় (checkHealthফাংশনটি দেখুন)।
IVehicleHardware হলো একটি জেনেরিক ইন্টারফেস যা একটি VHAL-এর হার্ডওয়্যার-নির্দিষ্ট ইমপ্লিমেন্টেশনকে উপস্থাপন করতে ব্যবহৃত হয়। IVehicleHardware এর রেফারেন্স ইমপ্লিমেন্টেশন হলো FakeVehicleHardware , যা প্রপার্টি ভ্যালু সংরক্ষণের জন্য একটি ইন-মেমরি ম্যাপ ব্যবহার করে এবং কোনো প্রকৃত ভেহিকেল বাসের সাথে যোগাযোগ করে না। এটি একটি এমুলেটরে চালানোর জন্য তৈরি এবং এর কোনো হার্ডওয়্যার-নির্দিষ্ট নির্ভরতা নেই। ভেন্ডর ইমপ্লিমেন্টেশনগুলো এটিকে সরাসরি ব্যবহার করতে পারবে না এবং অবশ্যই ভেহিকেল বাস-নির্দিষ্ট লজিক যোগ করতে হবে।
অ্যান্ড্রয়েড ১৪ থেকে শুরু করে, FakeVehicleHardware রান-টাইমে ইনিশিয়ালাইজেশনের সময় ডিভাইসের /vendor/etc/automotive/vhalconfig/ ফোল্ডার থেকে সমর্থিত প্রপার্টি 'config' পড়ে নেয়, যেটিতে একটি JSON-স্টাইলের কনফিগারেশন ফাইল থাকে। কনফিগারেশন ফাইলের ফরম্যাট এবং বিষয়বস্তু জানতে রেফারেন্স VHAL README ফাইলটি দেখুন।
FakeVehicleHardware পরীক্ষার জন্য কনফিগারেশন ফাইল ওভাররাইডও সমর্থন করে। যদি সিস্টেম প্রপার্টি persist.vendor.vhal_init_value_override সেট করা থাকে (এই প্রপার্টিটি অবশ্যই বিল্ড টাইমে অথবা VHAL ইনিশিয়ালাইজেশনের আগে বুটের একেবারে শুরুতে সেট করতে হবে), তবে এটি বিদ্যমান কনফিগারেশনকে ওভাররাইড করার জন্য ডিভাইসের /vendor/etc/automotive/vhaloverride/ ফোল্ডার থেকে কনফিগারেশন ফাইলটি ব্যবহার করে। কোনো ভেন্ডর ইমপ্লিমেন্টেশন একই ধরনের পদ্ধতি ব্যবহার করতে পারে, যাতে VHAL-সমর্থিত প্রপার্টি কনফিগারেশন হার্ড-কোডেড না হয়ে স্টার্ট টাইমে ডাইনামিকভাবে নির্ধারিত হতে পারে। VHAL ইনিশিয়ালাইজ হওয়ার পর ভেহিকল প্রপার্টি কনফিগারেশনের তালিকা অবশ্যই স্ট্যাটিক হতে হবে।
অ্যান্ড্রয়েড ১৬ থেকে, GRPCVehicleHardware আরেকটি রেফারেন্স IVehicleHardware ইমপ্লিমেন্টেশন প্রদান করে। এই ইমপ্লিমেন্টেশনটি ধরে নেয় যে, একটি রিমোট মেশিন বা ভিএম-এ একটি পৃথক সার্ভার চলছে, যেখানে প্রপার্টি হ্যান্ডলিং লজিকটি থাকে। AAOS ডিভাইসগুলিতে চলমান VHAL একটি প্রক্সি হিসাবে কাজ করে যা অনুরোধগুলিকে রিমোট সার্ভারে ফরোয়ার্ড করে। আরও বিস্তারিত জানতে grpc দেখুন।