ডায়নামিক উপলভ্য HAL

Android 9, Android হার্ডওয়্যার সাবসিস্টেমের ডাইনামিক শাটডাউনকে সাপোর্ট করে যখন সেগুলি ব্যবহার করা হয় না বা প্রয়োজন হয় না। যেমন, কোনও ব্যবহারকারী ওয়াই-ফাই ব্যবহার না করলে, ওয়াই-ফাই সাবসিস্টেমের মেমরি, পাওয়ার বা অন্যান্য সিস্টেম রিসোর্স ব্যবহার করা উচিত নয়। Android-এর আগের ভার্সনে, Android ফোন বুট করার পুরো সময় জুড়ে Android ডিভাইসে HAL/ড্রাইভার খোলা রাখা হত।

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

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-এর ক্ষেত্রে এগুলির কোনওটিই ব্যবহার করার প্রয়োজন হয় না।

HAL থেকে বেরিয়ে আসার বিষয়টি নির্ধারণ করা

Android 9-এ, HAL এক্সিট ম্যানুয়ালি নির্ধারণ করতে হবে। এছাড়াও, Android 10 ও তার পরবর্তী যেকোনও ভার্সনের ক্ষেত্রে, এটি অটোমেটিক লাইফসাইকেল দিয়ে নির্ধারণ করা যেতে পারে।

ডায়নামিক শাটডাউনের জন্য কখন HAL শুরু করতে হবে এবং কখন HAL বন্ধ করতে হবে তা সিদ্ধান্ত নেওয়ার জন্য একাধিক নীতি প্রয়োজন। কোনও কারণে HAL বেরিয়ে গেলে, HAL ডেফিনিশনে দেওয়া তথ্য এবং init ও hwservicemanager-এ করা পরিবর্তনের মাধ্যমে পাওয়া ইনফ্রাস্ট্রাকচার ব্যবহার করে প্রয়োজন হলে এটি অটোমেটিক রিস্টার্ট হয়ে যাবে। এর মধ্যে কয়েকটি আলাদা আলাদা কৌশল অন্তর্ভুক্ত থাকতে পারে, যেমন:

  • কেউ যদি HAL-এ ক্লোজ বা একই ধরনের API কল করে, তাহলে HAL নিজেই এক্সিট কল করতে পারে। এই আচরণটি সংশ্লিষ্ট HAL ইন্টারফেসে নির্দিষ্ট করতে হবে।
  • টাস্ক সম্পূর্ণ হয়ে গেলে HAL বন্ধ হয়ে যেতে পারে (HAL ফাইলে ডকুমেন্ট করা আছে)।

অটোমেটিক লাইফসাইকেল

Android 10 কার্নেল এবং hwservicemanager-এ আরও সহায়তা যোগ করে, যা HAL-কে অটোমেটিক বন্ধ হতে দেয় যখনই তাদের কোনও ক্লায়েন্ট থাকে না। এই ফিচার ব্যবহার করতে, HAL ডেফিনিশনে পরিবর্তন-এ উল্লেখ করা সব ধাপগুলি সম্পূর্ণ করুন, সেইসাথে:

  • মেম্বার ফাংশনের পরিবর্তে LazyServiceRegistrar C++-এ পরিষেবা রেজিস্টার করুন, registerAsService, যেমন:
    // only one instance of LazyServiceRegistrar per process
    LazyServiceRegistrar registrar;
    registrar.registerAsService(myHidlService /* , "default" */);
  • HAL ক্লায়েন্ট শুধুমাত্র ব্যবহার করা হলে (hwservicemanager-এর সাথে রেজিস্টার করা ইন্টারফেস) তবেই টপ-লেভেল HAL-এর রেফারেন্স রাখে কিনা তা যাচাই করুন। হwbinder থ্রেডে এই রেফারেন্স ড্রপ করা হলে বিলম্ব এড়াতে এবং সেটি যাতে এক্সিকিউট করা চালিয়ে যাওয়া যায়, তার জন্য ক্লায়েন্টকেও IPCThreadState::self()->flushCommands() কল করতে হবে। এর ফলে রেফারেন্স ড্রপ করার পরে সংশ্লিষ্ট রেফারেন্স কাউন্ট পরিবর্তনের বিষয়ে বাইন্ডার ড্রাইভারকে নিশ্চিত করা যাবে।