ডিভাইস সাবসিস্টেম পাওয়ার প্রায়ই ল্যাব পরিবেশে পরিমাপ ও রেকর্ড করা হয় বিভিন্ন স্টেডি-স্টেট কন্ডিশনের জন্য, যেমন স্ক্রিন চালু থাকলে অথবা ডিভাইস অলস পাওয়ার স্টেটে থাকলে। এটি এমন সাবসিস্টেমের জন্য কাজ করে যা ক্রমাগত পাওয়ার ব্যবহার করে অথবা এমন পরিস্থিতিতে যা ল্যাব এনভায়রনমেন্টে সহজেই পরিমাপ করা যায়, তবে নির্দিষ্ট কিছু ব্যবহারের ক্ষেত্রে এটি কাজ করে না, যেমন স্ক্রিনে ভিডিও দেখানোর সময়।
IPower.hal 1.0
পাওয়ার হিন্ট পাস করা এবং সাবসিস্টেমের স্লিপ-স্টেট মেট্রিক্সের উপর ক্রমবর্ধমান ডেটা রিপোর্ট করার জন্য একটি ইন্টারফেস প্রদান করে।
Android 10 এবং তার পরবর্তী ভার্সনে, ক্রমবর্ধমান পরিসংখ্যান-রিপোর্টিং ফাংশন
IPowerStats.hal পাওয়ার-স্ট্যাট কালেকশন API-তে থাকে এবং
অন-ডিভাইস ব্যাটারি-ব্যবহারের ডেটা ফিরিয়ে আনার উপায় প্রদান করে। এটি IPower.hal ইন্টারফেসের
ক্রমবর্ধমান পরিসংখ্যান-সংগ্রহের অংশটি প্রতিস্থাপন করে,
যাতে কার্যকারিতা আরও স্পষ্টভাবে আলাদা করা যায়।
IPowerStats পরিষেবার রিডিং নির্দিষ্ট সময় অন্তর অন্তর নেওয়া হয় না। ১% ব্যাটারি কমে যাওয়ার মতো
গুরুত্বপূর্ণ মুহূর্তে এগুলি ঘটে। ব্যাটারি কম খরচ হলে রিডিং কম ঘন ঘন
এবং বেশি খরচ হলে বেশি ঘন ঘন নেওয়া হয়। ডেটা
সার্ভারে ফেরত পাঠানো হতে পারে এবং বিশ্লেষণ ও অগ্রাধিকার নির্ধারণের জন্য বাগ রিপোর্টে ব্যবহার করা হতে পারে।
এটি বিদ্যুৎ খরচ কমানো এবং ব্যাটারির আয়ু বাড়ানোর
চলমান প্রচেষ্টাকে সমর্থন করে।
IPower.hal এবং IPowerStats.hal
IPower.hal ও
IPowerStats.hal ইন্টারফেস, দুটিই Android 10-এ উপলভ্য, কিন্তু
IPower.hal স্ট্যাটিসটিক্স সংগ্রহ করার ফাংশনালিটি শুধুমাত্র
IPowerStats.hal ইন্টারফেস থেকে উপলভ্য। IPowerStats.hal
ফাংশনে API অন্তর্ভুক্ত থাকে যা কাজ করে এমন ডিভাইসের জন্য অন-ডিভাইস পাওয়ার পরিমাপ থেকে
সংগৃহীত ডেটা পেতে ও ব্যবহার করতে সাহায্য করে:
- কম ফ্রিকোয়েন্সি
(
getRailInfo) ও বেশি ফ্রিকোয়েন্সি (streamEnergyData) ক্লায়েন্ট, দু'জনের জন্যই রেল-লেভেল এনার্জি পরিমাপ করে এবং বুট করার পর থেকে জমা হওয়া এনার্জি রিপোর্ট করে। - ডেটা উপলভ্য আছে এমন প্রতিটি কাজ করে এমন
PowerEntityসম্পর্কিত তথ্য রিপোর্ট করে।PowerEntityহল একটি প্ল্যাটফর্ম সাবসিস্টেম, পেরিফেরাল বা পাওয়ার ডোমেন যা ডিভাইসের মোট পাওয়ার খরচকে প্রভাবিত করে। - পাওয়ার এন্টিটি স্টেটের (
getPowerEntityStateInfo) সেট রিপোর্ট করে যার জন্য নির্দিষ্ট এন্টিটি রেসিডেন্সি ডেটা প্রদান করে, তারপর প্রতিটি নির্দিষ্টPowerEntity-এর জন্য সঞ্চিত ডেটা রিপোর্ট করে।
IPowerStats.hal API নিম্নলিখিত ক্লায়েন্ট ব্যবহার করে:
Statsd, প্রতি রেলের পাওয়ার কনজাম্পশন মেট্রিক সংগ্রহ করতে।Perfetto, সিপিইউ অ্যাক্টিভিটির সাথে বিদ্যুৎ খরচ কোরিলেট করতে।Batterystats,power_profile.xml.-এ আগে থেকে নির্ধারিত ধ্রুবক থেকে ব্যাটারি খরচ অনুমান করার পরিবর্তে পরিমাপ করা ডেটা ব্যবহার করে ব্যাটারি অ্যাট্রিবিউশন উন্নত করতে
Android 10 এবং তার পরবর্তী যেকোনও ভার্সনের ক্ষেত্রে, ডিভাইস প্রস্তুতকারক
IPower.hal এবং IPowerStats.hal ফাংশনের মধ্যে বেছে নিতে পারেন, তবে
IPowerStats.hal প্রয়োগ করা না হলে সব ক্লায়েন্টকে
IPower.hal-এ ফিরে যেতে হবে।
IPowerStats.hal ইমপ্লিমেন্টেশন বিকল্প
Android 7 থেকে Android 9 পর্যন্ত শুধুমাত্র IPower.hal ফাংশন উপলভ্য। Android 10-এ আপগ্রেড করা ডিভাইসগুলিতে অবশ্যই
হার্ডওয়্যার পাওয়ার-মনিটরিং সাবসিস্টেম থাকতে হবে অথবা পাওয়ার সংক্রান্ত পরিসংখ্যান মনিটর
ও রেকর্ড করার জন্য অন্য কোনও উপায় থাকতে হবে। কিছু SoC আপনার জন্য
বিদ্যুৎ ব্যবহার সংক্রান্ত পরিসংখ্যান সংগ্রহ করে অথবা আপনি সফ্টওয়্যারের মাধ্যমে বিদ্যুৎ-এনটিটি স্টেট রেসিডেন্সি
সংক্রান্ত তথ্য পেতে পারেন। পাওয়ার-মনিটরিং হার্ডওয়্যার শুধুমাত্র
getRailInfo(), getEnergyData() ও
streamEnergyData()-এ কাজ করে।
আপনি IPowerStats.hal পাওয়ার মনিটর করার
হার্ডওয়্যার getRailInfo(), getEnergyData() প্রয়োগ করলে এবং
streamEnergyData() NOT_SUPPORTED রিটার্ন করুন। একইভাবে,
getPowerEntityInfo(), getPowerEntityStateInfo() এবং
getPowerEntityStateResidencyData()ব্যবহার করার উদ্দেশ্য না থাকলে, NOT_SUPPORTED ফেরত দিতে পারে।
রেল-মনিটরিং API-এর মাধ্যমে পাওয়া ডেটার উদাহরণের মধ্যে এগুলি অন্তর্ভুক্ত:
- ডিসপ্লের পাওয়ার রেল X µW খরচ করেছে।
- মোডেমের পাওয়ার রেল Y µW বিদ্যুৎ খরচ করে।
সাবসিস্টেম স্লিপ-স্টেট API-এর মাধ্যমে ফেরত পাঠানো ডেটার উদাহরণের মধ্যে এগুলি অন্তর্ভুক্ত:
- X মিলি সেকেন্ডের জন্য মডেম স্লিপ মোডে ছিল।
- SoC, Y মিলি সেকেন্ডের জন্য পাওয়ার-কলাপ্স অবস্থায় ছিল।
- GPU-টি Z মিলি সেকেন্ডের জন্য সাসপেন্ড অবস্থায় ছিল।
হার্ডওয়্যার পাওয়ার-মনিটরিং সাবসিস্টেম ব্যবহার করা
আপনার ডিভাইসের ডিজাইনে হার্ডওয়্যার পাওয়ার-মনিটরিং সাবসিস্টেম থাকলে, IPowerStats.hal
ইমপ্লিমেন্ট করুন। এটি করার জন্য, একটি sysfs নোড তৈরি করুন
যেখান থেকে PowerStats.hal ডেটা পার্স করতে পারে অথবা
ioctl-টাইপ সিস্টেম কলের একটি সংগ্রহ তৈরি করুন।
আপনাকে অবশ্যই এমনভাবে কার্নেল ড্রাইভার প্রয়োগ করতে হবে যাতে অ্যাকুমুলেটর ওভারফ্লো না হয়। ব্যবহৃত অ্যালগরিদম আপনার অনন্য হার্ডওয়্যার পাওয়ার-মনিটরিং সাবসিস্টেম ডিজাইনের উপর নির্ভর করে, যা অবশ্যই তাৎক্ষণিক ও গড় বাস ভোল্টেজ এবং বর্তমান পরিমাপ প্রদান করবে। কার্নেল ড্রাইভারকে অবশ্যই এমনভাবে এই ডেটা ক্যাপচার করতে হবে যাতে এনার্জি অ্যাকুমুলেটর মুছে না যায় এবং বুট করার পর থেকে প্রতিটি সাবরেলের জন্য সঞ্চিত এনার্জি ডেটা অবশ্যই ৬৪-বিট ভেরিয়েবল হিসেবে বজায় রাখতে হবে যা প্রতিটি অ্যাকুমুলেটর কোয়েরি থেকে এনার্জি রিডিংয়ের সাথে বৃদ্ধি পায়।
কোনও নির্দিষ্ট কম্পোনেন্টের (বা ঐচ্ছিকভাবে, একাধিক কম্পোনেন্টের) পরিসংখ্যান অবশ্যই একটি নোডে থাকতে হবে। যদিও এটি sysfs-এর প্রচলিত ব্যবহার নয় (যা সাধারণত প্রতিটি নোডকে একটি একক মানে সীমাবদ্ধ করে), এটি নিশ্চিত করে যে সমস্ত ডেটা সামঞ্জস্যপূর্ণ।
ডিজাইন সংক্রান্ত নির্দেশিকা
- sysfs নোড থেকে রিড করার সময় বা সিস্টেম কল করার সময় লেটেন্সি কম (সর্বাধিক ১ মিলি সেকেন্ড) রাখুন।
- ভালোভাবে দেখে নিন যে, সহায়ক পরিসংখ্যান সংক্রান্ত ফাংশনালিটি ব্যবহার করলে ব্যাটারি দ্রুত কমে যায় না:
- স্লিপ মোডে কাটানো সময়ের মতো প্যারামিটার ট্র্যাক করার জন্য অ্যাক্সেস পয়েন্ট (AP) এবং/অথবা সাবসিস্টেম ওয়েকআপের সংখ্যা বাড়াবেন না।
- সম্ভব হলে অন্যান্য ট্রাফিকের সাথে অ্যাপ প্রসেসর ও ফার্মওয়্যারের মধ্যে সুযোগমতো পরিসংখ্যান ট্রান্সফার করে।
- প্রয়োজন হলে, সাবসিস্টেম নিম্নলিখিত ড্রাইভার ফাংশন ব্যবহার করতে পারে:
- দেরি/ওয়েকআপ এড়াতে ইন্টার্নালি ডেটা ক্যাশ করা হচ্ছে, তবে এর ফলে ডেটা কিছুটা পুরনো হতে পারে।
- সাবসিস্টেম ঘুমিয়ে থাকলে এক্সট্রাপোলেশন পারফর্ম করা, যাতে সাবসিস্টেমকে না জাগিয়েই আপডেট করা স্লিপ-টাইম প্রদান করা যায়।
কম্পোনেন্ট, সাবসিস্টেম ও পরিসংখ্যান বেছে নিন
কোন কম্পোনেন্ট বা সাবসিস্টেম থেকে ডেটা সংগ্রহ করবেন তা বেছে নেওয়ার সময়,
IPowerStats.hal ডিভাইসে এমন কিছু বেছে নিন যা উল্লেখযোগ্য কারেন্ট (৫ mA বা তার বেশি) খরচ করে
অথবা একাধিক পাওয়ার-কনজাম্পশন মোড কাজ করে, যেমন:
- ব্যক্তিগত SoC সাবসিস্টেম।
- SoC-এর বাইরে আংশিক বা সম্পূর্ণভাবে থাকা সাবসিস্টেম, যেমন ওয়াই-ফাই, ইমেজ প্রসেসর বা নিরাপত্তা প্রসেসর।
- হাই-পাওয়ার LED ও ক্যামেরার মতো পেরিফেরাল।
- বিভিন্ন মোড ব্যবহার করে এমন পাওয়ার ডোমেন (যেমন, সামগ্রিকভাবে SoC-এর জন্য পাওয়ার ডোমেন)।
কাস্টমাইজেশন
এই ঐচ্ছিক ফিচার কাস্টমাইজ করা যায়। ব্যবহারের ক্ষেত্র ডিজাইন করুন এবং আপনার ব্যবহার কাস্টমাইজ করুন:
- কোন কোন রেল পরিমাপ করবেন এবং কত ঘনঘন পরিমাপ করবেন তা ঠিক করুন।
- কখন ডেটা পড়তে হবে এবং কীভাবে তা ব্যাখ্যা করতে হবে সেই বিষয়ে সিদ্ধান্ত নিন।
- আপনার ডেটার উপর ভিত্তি করে কী ব্যবস্থা নেবেন এবং কখন নেবেন তা ঠিক করুন।
যাচাইকরণ
VTS টেস্টের মাধ্যমে Android-এর প্রয়োজনীয়তা পূরণ করা হয়েছে কিনা তা নিশ্চিত করা হয়। IPowerStats.hal-এ থাকা কমেন্টগুলি
একটি ডিভাইস সম্মতি মেনে চলছে কিনা তা যাচাই করার জন্য ব্যবহার করা হয়।
যেমন, আপনি getRailInfo() কল করলে এবং এটি কিছু রিটার্ন না করলে,
VTS টেস্ট ব্যর্থ হয়, কারণ আপনি মনিটর করা রেল সম্পর্কে তথ্য পাননি
অথবা SUCCESS-এর রিটার্ন করা স্ট্যাটাস পাননি। একইভাবে, আপনি যদি
রেল সংক্রান্ত তথ্য পান, কিন্তু তার সাথে NON_SUPPORTED বা
FILE_SYSTEM_ERROR উত্তর থাকে, তাহলে সেটিও ব্যর্থতা। VTS
IPower.hal এবং IPowerStats.hal কমেন্টে উল্লেখ করা প্রয়োজনীয়তা ব্যবহার করে,
HAL ফাইলে ডিভাইস প্রস্তুতকারকের স্পেসিফিকেশন মেনে চলা হয়েছে কিনা তা যাচাই করে। VTS টেস্টিংয়ে ব্যবহৃত কমেন্টের একটি উদাহরণ নিচে দেখানো হল:
/** * Rail information: * Reports information related to the rails being monitored. * * @return rails Information about monitored rails. * @return status SUCCESS on success or NOT_SUPPORTED if * feature is not enabled or FILESYSTEM_ERROR on filesystem nodes * access error. */ getRailInfo() generates(vec<e;RailInfo>e; rails, Status status);