ডায়নামিক শাটডাউন বাস্তবায়নের সাথে ডাটা ফ্লো আপ ওয়্যারিং করা এবং ডায়নামিক প্রসেস এক্সিকিউট করা অন্তর্ভুক্ত যা নিম্নলিখিত বিভাগে বিশদ বর্ণনা করা হয়েছে।
HAL সংজ্ঞা পরিবর্তন
ডায়নামিক শাটডাউনের জন্য কোন প্রক্রিয়াগুলি HAL ইন্টারফেসগুলিকে কী পরিবেশন করে (এই তথ্যটি পরবর্তীতে অন্যান্য প্রসঙ্গেও উপযোগী হতে পারে) সেইসাথে বুট করার সময় প্রসেস শুরু না করা এবং প্রস্থান করার সময় সেগুলিকে পুনরায় চালু না করা (আবার অনুরোধ করা পর্যন্ত) তথ্যের প্রয়োজন হয়।
# some init.rc script associated with the HAL service vendor.some-service-name /vendor/bin/hw/some-binary-service # init language extension, provides information of what service is served # if multiple interfaces are served, they can be specified one on each line interface android.hardware.light@2.0::ILight default # restarted if hwservicemanager dies # would also cause the hal to start early during boot if disabled wasn't set class hal # will not be restarted if it exits until it is requested to be restarted oneshot # will only be started when requested disabled # ... other properties
init এবং hwservicemanager-এ পরিবর্তন
ডাইনামিক শাটডাউনের জন্য hwservicemanager
init
বলতে অনুরোধ করা পরিষেবাগুলি শুরু করতে হবে। Android 9-এ, init
তিনটি অতিরিক্ত নিয়ন্ত্রণ বার্তা রয়েছে (যেমন ctl.start
): ctl.interface_start
, ctl.interface_stop
, এবং ctl.interface_restart
। এই বার্তাগুলি নির্দিষ্ট হার্ডওয়্যার ইন্টারফেসগুলিকে উপরে এবং নিচে আনতে init
সংকেত দিতে ব্যবহার করা যেতে পারে। যখন একটি পরিষেবার অনুরোধ করা হয় এবং নিবন্ধিত না হয়, hwservicemanager
অনুরোধ করে যে পরিষেবাটি শুরু করা হোক৷ যাইহোক, গতিশীল এইচএএল-এর জন্য এগুলোর কোনোটি ব্যবহার করার প্রয়োজন নেই।
HAL প্রস্থান নির্ধারণ করুন
Android 9-এ, HAL প্রস্থান ম্যানুয়ালি নির্ধারণ করতে হবে। অ্যান্ড্রয়েড 10 এবং উচ্চতর জন্য, এটি স্বয়ংক্রিয় জীবনচক্রের মাধ্যমেও নির্ধারণ করা যেতে পারে।
কখন HAL শুরু করতে হবে এবং কখন HAL বন্ধ করতে হবে তা নির্ধারণের জন্য ডায়নামিক শাটডাউনের জন্য একাধিক নীতির প্রয়োজন৷ যদি কোনো HAL কোনো কারণে প্রস্থান করার সিদ্ধান্ত নেয়, তাহলে HAL সংজ্ঞায় প্রদত্ত তথ্য এবং init
এবং hwservicemanager
এ পরিবর্তনের মাধ্যমে প্রদত্ত পরিকাঠামো ব্যবহার করে এটি স্বয়ংক্রিয়ভাবে পুনরায় চালু হবে। এর মধ্যে কয়েকটি ভিন্ন কৌশল অন্তর্ভুক্ত থাকতে পারে, যার মধ্যে রয়েছে:
- যদি কেউ এটিতে একটি বন্ধ বা অনুরূপ API কল করে তবে একটি HAL নিজেই প্রস্থান করার জন্য কল করতে পারে৷ এই আচরণটি সংশ্লিষ্ট HAL ইন্টারফেসে উল্লেখ করা আবশ্যক।
- HALগুলি তাদের কাজ শেষ হলে বন্ধ করতে পারে (HAL ফাইলে নথিভুক্ত)।
স্বয়ংক্রিয় জীবনচক্র
অ্যান্ড্রয়েড 10 কার্নেল এবং hwservicemanager
এ আরও সমর্থন যোগ করে, যা HAL-কে স্বয়ংক্রিয়ভাবে বন্ধ করার অনুমতি দেয় যখনই তাদের কোনো ক্লায়েন্ট থাকে না। এই বৈশিষ্ট্যটি ব্যবহার করতে, HAL সংজ্ঞায় পরিবর্তনের পাশাপাশি সমস্ত পদক্ষেপগুলি করুন:
- সদস্য ফাংশন,
registerAsService
এর পরিবর্তেLazyServiceRegistrar
এর সাথে C++ এ পরিষেবাটি নিবন্ধন করুন, উদাহরণস্বরূপ:// only one instance of LazyServiceRegistrar per process LazyServiceRegistrar registrar; registrar.registerAsService(myHidlService /* , "default" */);
- যাচাই করুন যে HAL ক্লায়েন্ট উচ্চ-স্তরের HAL (
hwservicemanager
এর সাথে নিবন্ধিত ইন্টারফেস) শুধুমাত্র যখন এটি ব্যবহার করা হয় তখন একটি রেফারেন্স রাখে। বিলম্ব এড়াতে যদি এই রেফারেন্সটি একটি hwbinder থ্রেডে ড্রপ করা হয় যা কার্যকর করা অব্যাহত থাকে, তাহলে ক্লায়েন্টকে অবশ্যইIPCThreadState::self()->flushCommands()
রেফারেন্সটি ড্রপ করার পরে কল করা উচিত যাতে বাইন্ডার ড্রাইভারকে সংশ্লিষ্ট রেফারেন্স গণনা সম্পর্কে অবহিত করা হয়। পরিবর্তন