প্রোডাক্ট সংক্রান্ত খবর

Android Vitals ওয়েক লক মেট্রিক ব্যবহার করে আপনার অ্যাপের ব্যাটারি অপ্টিমাইজ করুন

৭ মিনিট লাগবে
Alice Yuan-এর প্রোফাইল দেখুন
Alice Yuan ডেভেলপার রিলেশনস ইঞ্জিনিয়ার, Android

ব্যাটারির আয়ু ব্যবহারকারীর অভিজ্ঞতার একটি গুরুত্বপূর্ণ দিক এবং ওয়েক লক একটি প্রধান ভূমিকা পালন করে। আপনি কি এগুলি অত্যধিক ব্যবহার করছেন? এই ব্লগ পোস্টে আমরা ওয়েক লক কী, সেগুলি ব্যবহার করার কিছু পেশাদার পদ্ধতি এবং Play Console মেট্রিকের মাধ্যমে আপনার নিজের অ্যাপের আচরণ কীভাবে আরও ভালোভাবে বুঝতে পারবেন তা এক্সপ্লোর করব।

Android Vitals-এ আংশিক ওয়েক লক অত্যধিক ব্যবহার করা হয়েছে

Play Console এখন ব্যাটারি ড্রেন মনিটর করে, যার মূল অবদান সূচক হিসেবে অতিরিক্ত আংশিক ওয়েক লক ব্যবহার-এর উপর ফোকাস করা হয়।

এই ফিচারটি ব্যাটারির কার্যকারিতার গুরুত্বকে বাড়িয়ে তোলে, পাশাপাশি বিদ্যমান মূল মেট্রিক স্থিতিশীলতা সূচকগুলি: ব্যবহারকারীর-লক্ষ্য করা ক্র্যাশ এবং ANR। আমরা অতিরিক্ত ওয়েক লকের জন্য খারাপ পারফর্ম্যান্স থ্রেশহোল্ড নির্ধারণ করেছি। ১ মার্চ, ২০২৬ থেকে, আপনার টাইটেল যদি এই কোয়ালিটি থ্রেশহোল্ড পূরণ না করে, তাহলে আমরা সাজেশনের মতো বিশিষ্ট ডিসকভারি সারফেস থেকে টাইটেলটি বাদ দিতে পারি। কিছু ক্ষেত্রে, আপনার অ্যাপের কারণে ব্যাটারির চার্জ দ্রুত শেষ হয়ে যেতে পারে বলে ব্যবহারকারীদের জানাতে, আমরা আপনার স্টোরের তালিকায় একটি সতর্কতা দেখাতে পারি।

warning.png

অতিরিক্ত ওয়েক লক সংক্রান্ত সতর্কতা Android-এর জরুরি পরিসংখ্যান এক নজরে।

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

  • ২৪ ঘণ্টার মধ্যে অন্তত দুই ঘণ্টার জন্য ওয়েক লক চালু থাকে।
  • এটি আপনার অ্যাপের ৫%-এর বেশি সেশনকে প্রভাবিত করে, ২৮ দিনের গড়।

অডিও, লোকেশন এবং JobScheduler ব্যবহারকারীর শুরু করা API-এর মাধ্যমে তৈরি করা ওয়েক লক, ওয়েক লক গণনা থেকে বাদ দেওয়া হয়।

ওয়েক লক সম্পর্কে বোঝা

ওয়েক লক হল এমন একটি মেকানিজম যা ব্যবহারকারী সক্রিয়ভাবে ইন্টার‍্যাক্ট না করলেও কোনও অ্যাপকে ডিভাইসের সিপিইউ চালু রাখতে দেয়। 

স্ক্রিন বন্ধ থাকলেও আংশিক ওয়েক লক সিপিইউ চালু রাখে, সিপিইউকে কম-পাওয়ার "সাসপেন্ড" অবস্থায় যেতে দেয় না। ফুল ওয়েক লক স্ক্রিন ও সিপিইউ (CPU) দুটিকেই চালু রাখে।

আংশিক ওয়েক লক ২টি পদ্ধতিতে পাওয়া যায়:

  • অ্যাপটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে PowerManager API ব্যবহার করে ম্যানুয়ালি ওয়েক লক অ্যাকোয়ার ও রিলিজ করে, প্রায়ই এটি ফোরগ্রাউন্ড সার্ভিস-এর সাথে অ্যাকোয়ার করা হয় - এটি একটি প্ল্যাটফর্ম লাইফসাইকেল API যা ব্যবহারকারীর বোধগম্য অপারেশনের জন্য তৈরি করা হয়েছে।
  • বিকল্প হিসেবে, ওয়েক লক অন্য API-এর মাধ্যমে অ্যাকোয়ার করা হয় এবং API ব্যবহারের কারণে অ্যাপে অ্যাট্রিবিউট করা হয়, পেশাদার পদ্ধতি বিভাগে এই বিষয়ে আরও তথ্য দেওয়া আছে।

ব্যবহারকারীর শুরু করা কোনও বড় ফাইলের ডাউনলোড সম্পূর্ণ করার মতো টাস্কের জন্য ওয়েক লক প্রয়োজন হলেও, সেটির অতিরিক্ত বা অনুপযুক্ত ব্যবহার করলে ব্যাটারি দ্রুত শেষ হয়ে যেতে পারে। আমরা এমন কিছু ঘটনা দেখেছি যেখানে অ্যাপগুলি ঘণ্টার পর ঘণ্টা ওয়েক লক ধরে রাখে বা সঠিকভাবে রিলিজ করতে ব্যর্থ হয়, যার ফলে ব্যবহারকারীরা অ্যাপের সাথে ইন্টার‍্যাক্ট না করলেও উল্লেখযোগ্যভাবে ব্যাটারি শেষ হয়ে যাওয়ার অভিযোগ করেন।

ওয়েক লক ব্যবহারের পেশাদার পদ্ধতি

অতিরিক্ত ওয়েক লক ব্যবহার কীভাবে ডিবাগ করবেন তা জানার আগে, ওয়েক লক সংক্রান্ত পেশাদার পদ্ধতি অনুসরণ করছেন কিনা তা নিশ্চিত করুন। 

এই চারটি গুরুত্বপূর্ণ প্রশ্ন বিবেচনা করুন।


১. আপনি কি বিকল্প ওয়েক লক বিকল্পের কথা বিবেচনা করেছেন?

ম্যানুয়াল আংশিক ওয়েক লক পাওয়ার কথা বিবেচনা করার আগে, সিদ্ধান্ত নেওয়ার এই ফ্লোচার্ট অনুসরণ করুন:

wakelock.png

কখন ম্যানুয়ালি ওয়েক লক অ্যাকোয়ার করতে হবে তা নির্ধারণ করার ফ্লোচার্ট

  1. স্ক্রিন কি চালু রাখতে হবে?
  2. অ্যাপ্লিকেশনটি কি ফোরগ্রাউন্ড পরিষেবা চালাচ্ছে?
    • না: আপনাকে ম্যানুয়ালি ওয়েক লক অ্যাকোয়ার করতে হবে না।
  3. ডিভাইস সাসপেন্ড হয়ে গেলে ব্যবহারকারীর অভিজ্ঞতা কি খারাপ হয়?
    • না: যেমন, ডিভাইস চালু হওয়ার পরে বিজ্ঞপ্তি আপডেট করার জন্য ওয়েক লকের প্রয়োজন হয় না।
    • হ্যাঁ: ডিভাইস সাসপেন্ড হওয়া আটকানো যদি খুবই গুরুত্বপূর্ণ হয়, যেমন এক্সটার্নাল ডিভাইসের সাথে যোগাযোগ চলছে, তাহলে এগিয়ে যান।
  4. আপনার হয়ে ডিভাইস চালু রাখার জন্য আগে থেকেই কি কোনও API আছে?
  5. আপনি যদি এইসব প্রশ্নের উত্তর দিয়ে থাকেন এবং কোনও বিকল্প নেই বলে নির্ধারণ করে থাকেন, তাহলে ম্যানুয়ালি ওয়েক লক পাওয়ার জন্য আপনাকে এগিয়ে যেতে হবে।

২. আপনি কি ওয়েক লকের সঠিক নাম দিচ্ছেন?

ম্যানুয়ালি ওয়েক লক অ্যাকোয়ার করার সময়, ডিবাগিংয়ের জন্য সঠিক নামকরণ করা গুরুত্বপূর্ণ:

  • নামে ইমেল আইডির মতো কোনও ব্যক্তিগতভাবে শনাক্তকরণযোগ্য তথ্য (PII) বাদ দিন। PII শনাক্ত করা হলে, ওয়েক লক _UNKNOWN হিসেবে লগ করা হয়, যা ডিবাগিংয়ে বাধা দেয়।
  • ক্লাস বা মেথডের নাম ব্যবহার করে প্রোগ্রাম্যাটিকভাবে আপনার ওয়েক লকের নাম দেবেন না, কারণ Proguard-এর মতো টুল এগুলি অস্পষ্ট করে দিতে পারে। পরিবর্তে, হার্ড-কোডেড স্ট্রিং ব্যবহার করুন।
  • ওয়েক লক ট্যাগে কাউন্টার বা অনন্য শনাক্তকারী যোগ করবেন না। ওয়েক লক রান করার সময় প্রতিবার একই ট্যাগ ব্যবহার করা উচিত যাতে সিস্টেম নাম অনুযায়ী ব্যবহার একত্রিত করতে পারে, এর ফলে অস্বাভাবিক আচরণ শনাক্ত করা সহজ হয়।

৩. অ্যাকোয়ার করা ওয়েক লক কি সবসময় রিলিজ করা হয়?

আপনি ম্যানুয়ালি ওয়েক লক অ্যাকোয়ার করলে, ওয়েক লক রিলিজ যাতে সবসময় এক্সিকিউট হয় তা নিশ্চিত করুন। ওয়েক লক রিলিজ করতে না পারলে ব্যাটারির চার্জ দ্রুত শেষ হয়ে যেতে পারে। 

যেমন, processingWork() চলাকালীন কোনও আনক্যাচড এক্সেপশন থ্রো করা হলে, release() কল কখনও নাও হতে পারে। পরিবর্তে, আপনি একটি try-finally ব্লক ব্যবহার করতে পারেন যাতে ওয়েক লক রিলিজ হওয়ার গ্যারান্টি দেওয়া যায়, এমনকি কোনও ব্যতিক্রম ঘটলেও।

এছাড়াও, ওয়েক লক যাতে অনির্দিষ্টকালের জন্য চালু না থাকে এবং নির্দিষ্ট সময় পরে রিলিজ হয়ে যায় তা নিশ্চিত করতে আপনি ওয়েক লকে টাইমআউট যোগ করতে পারেন।

fun processingWork() {
    wakeLock.apply {
        try {
            acquire(60 * 10 * 1000) // timeout after 10 minutes
            doTheWork()
        } finally {
            release()
        }
    }
}

৪. আপনি কি জেগে ওঠার ফ্রিকোয়েন্সি কমাতে পারেন?

পর্যায়ক্রমিক ডেটা অনুরোধের জন্য, আপনার অ্যাপ কত ঘন ঘন ডিভাইসকে জাগিয়ে তোলে তা কমানো হল ব্যাটারি অপ্টিমাইজেশনের মূল চাবিকাঠি। ওয়েক-আপ ফ্রিকোয়েন্সি কমানোর কিছু উদাহরণ এখানে দেওয়া হল:

  • WorkManager: PeriodicWorkRequest-এ পিরিয়ডিক ইন্টারভাল বাড়ান।
  • SensorManager: লিসেনার রেজিস্টার করার সময় maxReportLatencyMs উল্লেখ করে ব্যাচিংয়ের সুবিধা নিন।
  • ফিউজড লোকেশন প্রোভাইডার:
    • সবচেয়ে সাম্প্রতিক ক্যাশে করা লোকেশনের জন্য getLastLocation ব্যবহার করে লোকেশন রিট্রিভ করার ফ্রিকোয়েন্সি কমান।
    • কম ব্যাটারি-ইনটেনসিভ আপডেট পদ্ধতির জন্য setPriority(PRIORITY_PASSIVE) ব্যবহার করুন।
    • এছাড়াও, আপনি setMinUpdateIntervalMillis-এর মাধ্যমে ন্যূনতম আপডেট ইন্টারভাল সেট করে লোকেশন ব্যাচিং মেকানিজম ব্যবহার করতে পারবেন।

আপনি ওয়েক লক সংক্রান্ত পেশাদার পদ্ধতি ডকুমেন্টেশন থেকে আরও বিবরণ দেখতে পারবেন।

অতিরিক্ত ওয়েক লক ব্যবহার ডিবাগ করা হচ্ছে

সঠিকভাবে ব্যবহার করার চেষ্টা করলেও, ওয়েক লক অতিরিক্ত ব্যবহার হয়ে যেতে পারে। Play Console-এ আপনার অ্যাপ ফ্ল্যাগ করা হলে, কীভাবে ডিবাগ করবেন তা এখানে দেওয়া হল:

Play Console-এর মাধ্যমে প্রাথমিক শনাক্তকরণ

Android Vitals-এর অতিরিক্ত আংশিক ওয়েক লক ড্যাশবোর্ড আপনার অ্যাপের সাথে যুক্ত ছাড় না পাওয়া ওয়েক লকের নামের ব্রেকডাউন প্রদান করে, যা প্রভাবিত সেশন ও সময়কাল দেখায়। ওয়েক লকের নাম অ্যাপ-হোল্ড নাকি অন্য API-এর মাধ্যমে হোল্ড করা হয়েছে তা শনাক্ত করতে ডকুমেন্টেশন ব্যবহার করার কথা মনে করিয়ে দেওয়া।

breakdowns2.png

Android-এর জরুরি পরিসংখ্যানের অত্যধিক আংশিক ওয়েক লক ড্যাশবোর্ড স্ক্রল করে নিচে ব্রেকডাউন বিভাগে গিয়ে অত্যধিক ওয়েক লক ট্যাগ দেখুন।

ওয়ার্কার/জব দ্বারা অতিরিক্ত ওয়েক লক হোল্ড করা ডিবাগ করা

আপনি এই ওয়েক লকের নাম দিয়ে ওয়ার্কার-হেল্ড ওয়েক লক শনাক্ত করতে পারবেন:

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

ওয়ার্কার-হেল্ড ওয়েক লক নামের বিভিন্নতার সম্পূর্ণ তালিকা ডকুমেন্টেশন থেকে পাওয়া যাবে। এইসব ওয়েক লক ডিবাগ করতে, আপনি লোকালি ডিবাগ করার জন্য ব্যাকগ্রাউন্ড টাস্ক ইন্সপেক্টর ব্যবহার করতে পারেন অথবা ফিল্ডে সমস্যা ডিবাগ করতে getStopReason-এর সুবিধা নিতে পারেন। 

Android Studio ব্যাকগ্রাউন্ড টাস্ক ইন্সপেক্টর

taskinspector.png


ব্যাকগ্রাউন্ড টাস্ক ইন্সপেক্টরের স্ক্রিন ক্যাপচার, যেখানে এটি "WeatherSyncWorker" নামের একটি ওয়ার্কারকে শনাক্ত করতে পেরেছে যা বারবার চেষ্টা করেছে এবং ব্যর্থ হয়েছে।

WorkManager সমস্যার লোকাল ডিবাগিংয়ের জন্য, এমুলেটর বা কানেক্ট করা ডিভাইসে (API লেভেল ২৬+) এই টুল ব্যবহার করুন। এটি কর্মীদের তালিকা ও তাদের স্ট্যাটাস (সম্পূর্ণ, এক্সিকিউট করা হচ্ছে, সারিবদ্ধ করা হয়েছে) দেখায়, যা আপনাকে বিবরণ খতিয়ে দেখতে ও কর্মীদের চেইন বুঝতে সাহায্য করে। 

যেমন, সিস্টেমের সীমাবদ্ধতার কারণে কোনও কর্মী বারবার ব্যর্থ হচ্ছেন বা আবার চেষ্টা করছেন কিনা তা এটি প্রকাশ করতে পারে। 

আরও বিবরণের জন্য ব্যাকগ্রাউন্ড টাস্ক ইন্সপেক্টর ডকুমেন্টেশন দেখুন।

WorkManager getStopReason

অতিরিক্ত ওয়েক লক সহ ওয়ার্কারের ইন-ফিল্ড ডিবাগিংয়ের জন্য, WorkManager 2.9.0+-এ WorkInfo.getStopReason() অথবা JobScheduler-এর জন্য, SDK 31+-এ উপলভ্য JobParameters.getStopReason() ব্যবহার করুন। 

এই API কোনও কর্মী কেন কাজ বন্ধ করে দিয়েছেন (যেমন, STOP_REASON_TIMEOUT, STOP_REASON_QUOTA) তার কারণ লগ করতে সাহায্য করে, রানটাইম শেষ হয়ে যাওয়ার কারণে ঘন ঘন টাইমআউটের মতো সমস্যা চিহ্নিত করে।

backgroundScope.launch {
    WorkManager.getInstance(context)
        .getWorkInfoByIdFlow(workRequest.id)
        .collect { workInfo ->
            logStopReason(workRequest.id, workInfo?.stopReason)
        }
}

আরও জানতে টাস্ক শিডিউলিং API-এর জন্য ব্যাটারির ব্যবহার অপ্টিমাইজ করুন দেখুন।

অন্যান্য ধরনের অতিরিক্ত ওয়েক লক ডিবাগ করা

ম্যানুয়ালি হোল্ড করা ওয়েক লক বা API-এর মাধ্যমে হোল্ড করা ওয়েক লকের মতো আরও জটিল পরিস্থিতির ক্ষেত্রে, আমরা আপনাকে ডিবাগ করার জন্য সিস্টেম ট্রেস কালেকশন ব্যবহার করতে সাজেস্ট করি।

সিস্টেম ট্রেস কালেকশন

সিস্টেম ট্রেস হল একটি শক্তিশালী ডিবাগিং টুল যা একটি নির্দিষ্ট সময়কালে সিস্টেম অ্যাক্টিভিটির বিস্তারিত রেকর্ড ক্যাপচার করে, CPU-এর অবস্থা, থ্রেড অ্যাক্টিভিটি, নেটওয়ার্ক অ্যাক্টিভিটি এবং ব্যাটারি-সম্পর্কিত মেট্রিক যেমন কাজের সময়কাল এবং ওয়েক লক ব্যবহার সম্পর্কে ইনসাইট প্রদান করে।

আপনি বিভিন্ন পদ্ধতি ব্যবহার করে সিস্টেম ট্রেস ক্যাপচার করতে পারবেন: 

powermgmt.png

Android অ্যাপ ও svcs ট্যাবের অধীনে Perfetto UI-তে "power:PowerManagement" Atrace বিভাগ চালু করুন। 

আপনি যে পদ্ধতিই বেছে নিন না কেন, ডিভাইসের স্টেট ট্র্যাক দেখার সুবিধা চালু করতে "power:PowerManagement" Atrace ক্যাটেগরি সংগ্রহ করছেন কিনা তা নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ। 

Perfetto UI পরিদর্শন ও SQL বিশ্লেষণ

Perfetto UI-তে সিস্টেম ট্রেস খোলা ও পরীক্ষা করা যাবে। ট্রেস খুললে, আপনি টাইমলাইনে বিভিন্ন প্রসেসের ভিজ্যুয়ালাইজেশন দেখতে পাবেন। এই গাইডে আমরা "ডিভাইসের স্ট্যাটাস" ট্র্যাকের উপর ফোকাস করব।

perfetto.png


"সেরা অ্যাপ", "স্ক্রিনের অবস্থা", "লং ওয়েক লক" এবং "জব" ট্র্যাকের মতো "ডিভাইসের অবস্থা" বিভাগের অধীনে ট্র্যাক পিন করুন যাতে দীর্ঘ সময় ধরে চলা ওয়েক লক স্লাইসগুলি দৃশ্যত শনাক্ত করা যায়।

প্রতিটি ব্লকে ইভেন্টের নাম, ইভেন্ট কখন শুরু হয়েছিল এবং কখন শেষ হয়েছিল তা তালিকাভুক্ত করা থাকে। Perfetto-তে এটিকে স্লাইস বলা হয়।

একাধিক ট্রেসের স্কেলেবল বিশ্লেষণের জন্য, আপনি Perfetto-এর SQL বিশ্লেষণ ব্যবহার করতে পারেন। একটি SQL কোয়েরি সময়কাল অনুযায়ী সাজানো সব ওয়েক লক খুঁজে পেতে পারে, যা অত্যধিক ব্যবহারের প্রধান কারণগুলি শনাক্ত করতে সাহায্য করে।

এখানে একটি উদাহরণ কোয়েরি দেওয়া হল যা সিস্টেম ট্রেসে ঘটা সমস্ত ওয়েক লক ট্যাগকে যোগ করে, মোট সময়কাল অনুযায়ী সাজানো:

SELECT slice.name as name, track.name as track_name,SUM(dur / 100000) as total_dur_ms
FROM slice
JOIN track ON slice.track_id = track.id
WHERE track.name = 'WakeLocks'GROUP BY slice.name, track.name
ORDER BY total_dur_ms DESC

ইন-ফিল্ড ট্রেস কালেকশনের জন্য ProfilingManager ব্যবহার করুন

সহজে সমাধান করা যায় না এমন সমস্যার জন্য, ProfilingManager (SDK 35-এ যোগ করা হয়েছে) হল একটি প্রোগ্রাম্যাটিক API যা ডেভেলপারদের শুরু ও শেষ ট্রিগারের মাধ্যমে ফিল্ডে সিস্টেম ট্রেস সংগ্রহ করার অনুমতি দেয়। এটি প্রোফাইল সংগ্রহের জন্য শুরু এবং শেষ ট্রিগার পয়েন্টগুলির উপর আরও নিয়ন্ত্রণ অফার করে এবং ডিভাইসের পারফর্ম্যান্সের উপর প্রভাব প্রতিরোধ করার জন্য সিস্টেম-লেভেল রেট সীমিতকরণ প্রয়োগ করে। 

ফিল্ড সিস্টেম ট্রেস কালেকশনে কীভাবে প্রয়োগ করতে হয় সেই ব্যাপারে আরও ধাপের জন্য ProfilingManager ডকুমেন্টেশন চেক করুন, যার মধ্যে কীভাবে প্রোগ্রাম্যাটিক্যালি ট্রেস ক্যাপচার করবেন, প্রোফাইলিং ডেটা বিশ্লেষণ করবেন এবং লোকাল ডিবাগ কমান্ড ব্যবহার করবেন তা অন্তর্ভুক্ত।

ProfilingManager ব্যবহার করে সংগ্রহ করা সিস্টেম ট্রেস ম্যানুয়ালি সংগ্রহ করা ট্রেসের মতোই দেখতে হবে, তবে সিস্টেম প্রসেস ও অন্যান্য অ্যাপ প্রসেস ট্রেস থেকে এডিট করা হয়।

সিদ্ধান্ত

Android Vitals-এ অত্যধিক আংশিক ওয়েক লক মেট্রিক হল ব্যাটারির চার্জ দ্রুত শেষ হয়ে যাওয়া কমানো এবং অ্যাপের কোয়ালিটি উন্নত করার ক্ষেত্রে ডেভেলপারদের সাহায্য করার জন্য আমাদের চলমান প্রতিশ্রুতির একটি ছোট অংশ মাত্র। 

ওয়েক লক সম্পর্কে বুঝে এবং সঠিকভাবে তা প্রয়োগ করে, আপনি অ্যাপের ব্যাটারি পারফর্ম্যান্স উল্লেখযোগ্যভাবে অপ্টিমাইজ করতে পারবেন। বিকল্প API ব্যবহার করা, ওয়েক লক সংক্রান্ত পেশাদার পদ্ধতি মেনে চলা এবং ব্যাকগ্রাউন্ড টাস্ক ইন্সপেক্টর, সিস্টেম ট্রেস ও ProfilingManager-এর মতো শক্তিশালী ডিবাগিং টুল ব্যবহার করা হল Google Play-তে আপনার অ্যাপের সাফল্য নিশ্চিত করার মূল চাবিকাঠি।

লিখেছেন:
পড়া চালিয়ে যান