প্রোডাক্ট সম্পর্কিত খবর

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

৭ মিনিট রিড
অ্যালিস ইউয়ানের প্রোফাইল দেখুন
Alice Yuan Developer Relations Engineer, 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+ বা JobScheduler-এ WorkInfo.getStopReason() ব্যবহার করুন, JobParameters.getStopReason() SDK 31+-এ উপলভ্য। 

এই 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-তে আপনার অ্যাপের সাফল্য নিশ্চিত করার মূল চাবিকাঠি।

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