গতিশীলভাবে উপলব্ধ HALs

অ্যান্ড্রয়েড 9 অ্যান্ড্রয়েড হার্ডওয়্যার সাবসিস্টেমগুলির গতিশীল শাটডাউন সমর্থন করে যখন সেগুলি ব্যবহার করা হয় না বা প্রয়োজন হয় না৷ উদাহরণস্বরূপ, যখন একজন ব্যবহারকারী Wi-Fi ব্যবহার করছেন না, তখন Wi-Fi সাবসিস্টেমের মেমরি, পাওয়ার বা অন্যান্য সিস্টেম রিসোর্স গ্রহণ করা উচিত নয়। অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলিতে, একটি অ্যান্ড্রয়েড ফোন বুট করার পুরো সময়কালের জন্য অ্যান্ড্রয়েড ডিভাইসে HALs/ড্রাইভারগুলি খোলা রাখা হয়েছিল।

ডায়নামিক শাটডাউন বাস্তবায়নের সাথে ডাটা ফ্লো আপ ওয়্যারিং করা এবং ডায়নামিক প্রসেস এক্সিকিউট করা অন্তর্ভুক্ত যা নিম্নলিখিত বিভাগে বিশদ বর্ণনা করা হয়েছে।

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() রেফারেন্সটি ড্রপ করার পরে কল করা উচিত যাতে বাইন্ডার ড্রাইভারকে সংশ্লিষ্ট রেফারেন্স গণনা সম্পর্কে অবহিত করা হয়। পরিবর্তন