আংশিক জাগরণ লক আটকে আছে

আংশিক ওয়েক লকগুলি PowerManager API-এর একটি প্রক্রিয়া যা ডেভেলপারদের একটি ডিভাইসের ডিসপ্লে বন্ধ হয়ে যাওয়ার পরে CPU চালু রাখতে দেয় (সেটি সিস্টেম টাইমআউট বা ব্যবহারকারীর পাওয়ার বোতাম টিপানোর কারণে)। আপনার অ্যাপ PARTIAL_WAKE_LOCK পতাকা সহ acquire() কল করে একটি আংশিক ওয়েক লক অর্জন করে। একটি আংশিক ওয়েক লক আটকে যায় যদি আপনার অ্যাপটি ব্যাকগ্রাউন্ডে চলার সময় এটি দীর্ঘ সময় ধরে রাখা হয় (আপনার অ্যাপের কোনো অংশ ব্যবহারকারীর কাছে দৃশ্যমান নয়)। এই অবস্থাটি ডিভাইসের ব্যাটারি নিষ্কাশন করে কারণ এটি ডিভাইসটিকে নিম্ন শক্তির অবস্থায় প্রবেশ করতে বাধা দেয়। আংশিক ওয়েক লকগুলি শুধুমাত্র প্রয়োজন হলেই ব্যবহার করা উচিত এবং যত তাড়াতাড়ি আর প্রয়োজন নেই তত তাড়াতাড়ি ছেড়ে দেওয়া উচিত।

যদি আপনার অ্যাপে আংশিক ওয়েক লক আটকে থাকে, তাহলে আপনি সমস্যাটি নির্ণয় এবং সমাধান করতে এই পৃষ্ঠার নির্দেশিকা ব্যবহার করতে পারেন।

সমস্যাটি সনাক্ত করুন

আপনি সবসময় জানেন না যে আপনার অ্যাপের আংশিক ওয়েক লক আটকে আছে। আপনি যদি ইতিমধ্যেই আপনার অ্যাপ প্রকাশ করে থাকেন, তাহলে Android ভাইটাল আপনাকে সমস্যা সম্পর্কে সচেতন করতে সাহায্য করতে পারে।

অ্যান্ড্রয়েড গুরুত্বপূর্ণ

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

ব্যাটারি সেশনের সংজ্ঞা প্ল্যাটফর্ম সংস্করণের উপর নির্ভর করে।

  • অ্যান্ড্রয়েড 10-এ, একটি ব্যাটারি সেশন হল একটি নির্দিষ্ট 24-ঘন্টা সময়ের মধ্যে প্রাপ্ত সমস্ত ব্যাটারি রিপোর্টের সমষ্টি। একটি ব্যাটারি রিপোর্ট দুটি ব্যাটারি চার্জের মধ্যে ব্যবধানকে বোঝায় হয় 20% থেকে 80% এর উপরে বা যেকোনো চার্জ স্তর থেকে 100% পর্যন্ত।
  • অ্যান্ড্রয়েড 11-এ, একটি ব্যাটারি সেশন একটি নির্দিষ্ট 24-ঘন্টা সময়কাল।

প্রদর্শিত ব্যাটারি সেশনের সংখ্যা অ্যাপের সমস্ত পরিমাপিত ব্যবহারকারীদের জন্য একটি সমষ্টি। Google Play কীভাবে Android গুরুত্বপূর্ণ ডেটা সংগ্রহ করে সে সম্পর্কে তথ্যের জন্য, Play Console ডকুমেন্টেশন দেখুন।

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

সমস্যা চিহ্নিত করো

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

এই বিভাগে আপনার ওয়েক লকগুলি ঠিক করার জন্য টিপস রয়েছে, তবে দীর্ঘমেয়াদে, সেরা অনুশীলন বিভাগে সুপারিশগুলি অনুসরণ করতে আপনার অ্যাপ স্থানান্তর করার কথা বিবেচনা করুন৷

আপনার কোডে এমন জায়গাগুলি চিহ্নিত করুন এবং ঠিক করুন যা একটি ওয়েক লক অর্জন করে, যেমন newWakeLock(int, String) বা WakefulBroadcastReceiver সাবক্লাসে কল করা। এখানে কিছু টিপস আছে:

  • ওয়েকলক ট্যাগ নামের সাথে আপনার প্যাকেজ, ক্লাস বা পদ্ধতির নাম অন্তর্ভুক্ত করার জন্য আমরা সুপারিশ করি যাতে আপনি সহজেই আপনার উত্সের অবস্থানটি সনাক্ত করতে পারেন যেখানে ওয়েক লক তৈরি করা হয়েছিল। এখানে কিছু অতিরিক্ত টিপস আছে:
    • নামে কোনো ব্যক্তিগতভাবে শনাক্তকরণ তথ্য (PII) ছেড়ে দিন, যেমন একটি ইমেল ঠিকানা। অন্যথায়, ডিভাইসটি ওয়েক লক নামের পরিবর্তে _UNKNOWN লগ করে।
    • ক্লাস বা পদ্ধতির নাম প্রোগ্রাম্যাটিকভাবে পাবেন না, উদাহরণস্বরূপ getName() কল করে, কারণ এটি Proguard দ্বারা অস্পষ্ট হতে পারে। পরিবর্তে একটি হার্ড কোডেড স্ট্রিং ব্যবহার করুন.
    • লক ট্যাগ জাগানোর জন্য একটি কাউন্টার বা অনন্য শনাক্তকারী যোগ করবেন না। সিস্টেমটি একই পদ্ধতিতে তৈরি ওয়েক লকগুলিকে একত্রিত করতে সক্ষম হবে না কারণ তাদের সকলেরই অনন্য শনাক্তকারী রয়েছে৷
  • নিশ্চিত করুন যে আপনার কোড সমস্ত ওয়েক লকগুলি প্রকাশ করে যা এটি অর্জন করে। প্রতিটি কল to acquire() এর সাথে release() জন্য একটি সংশ্লিষ্ট কল আছে তা নিশ্চিত করার চেয়ে এটি আরও জটিল। এখানে একটি ওয়েক লকের একটি উদাহরণ দেওয়া হল যা একটি অজানা ব্যতিক্রমের কারণে মুক্তি পায় না:

    কোটলিন

    @Throws(MyException::class)
    fun doSomethingAndRelease() {
        wakeLock.apply {
            acquire()
            doSomethingThatThrows()
            release()  // does not run if an exception is thrown
        }
    }

    জাভা

        void doSomethingAndRelease() throws MyException {
            wakeLock.acquire();
            doSomethingThatThrows();
            wakeLock.release();  // does not run if an exception is thrown
        }

    এখানে কোডটির একটি সঠিক সংস্করণ রয়েছে:

    কোটলিন

    @Throws(MyException::class)
    fun doSomethingAndRelease() {
        wakeLock.apply {
            try {
                acquire()
                doSomethingThatThrows()
            } finally {
                release()
            }
        }
    }

    জাভা

        void doSomethingAndRelease() throws MyException {
            try {
                wakeLock.acquire();
                doSomethingThatThrows();
            } finally {
                wakeLock.release();
            }
        }
  • নিশ্চিত করুন যে ওয়েক লকগুলি আর প্রয়োজন না হওয়ার সাথে সাথেই ছেড়ে দেওয়া হয়েছে৷ উদাহরণস্বরূপ, আপনি যদি একটি পটভূমির কাজ শেষ করার অনুমতি দেওয়ার জন্য একটি ওয়েক লক ব্যবহার করেন, তবে নিশ্চিত করুন যে সেই কাজটি শেষ হয়ে গেলে রিলিজ হবে। যদি একটি ওয়েক লক রিলিজ না করে প্রত্যাশিত সময়ের চেয়ে বেশি সময় ধরে রাখা হয়, তাহলে এর অর্থ হতে পারে যে আপনার ব্যাকগ্রাউন্ড টাস্কটি প্রত্যাশার চেয়ে বেশি সময় নিচ্ছে।

কোডে সমস্যা সমাধান করার পরে, নিম্নলিখিত অ্যান্ড্রয়েড সরঞ্জামগুলি ব্যবহার করে আপনার অ্যাপটি সঠিকভাবে ওয়েক লকগুলি প্রকাশ করে কিনা তা যাচাই করুন:

  • ডাম্পসিস - একটি সরঞ্জাম যা একটি ডিভাইসে সিস্টেম পরিষেবার অবস্থা সম্পর্কে তথ্য সরবরাহ করে। পাওয়ার সার্ভিসের স্থিতি দেখতে, যার মধ্যে ওয়েক লকগুলির একটি তালিকা রয়েছে, adb shell dumpsys power চালান।

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

সেরা অনুশীলন

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

আপনি যদি আংশিক ওয়েক লক ব্যবহার করেন তবে এই সুপারিশগুলি অনুসরণ করুন:

  • নিশ্চিত করুন যে আপনার অ্যাপের কিছু অংশ অগ্রভাগে রয়ে গেছে। উদাহরণস্বরূপ, যদি আপনার একটি পরিষেবা চালানোর প্রয়োজন হয়, তবে পরিবর্তে একটি অগ্রভাগের পরিষেবা শুরু করুন । এটি দৃশ্যত ব্যবহারকারীকে নির্দেশ করে যে আপনার অ্যাপ এখনও চলছে।
  • নিশ্চিত করুন যে ওয়েক লকগুলি অর্জন এবং প্রকাশ করার যুক্তি যতটা সম্ভব সহজ। যখন আপনার ওয়েক লক লজিকটি জটিল স্টেট মেশিন, টাইমআউট, এক্সিকিউটর পুল এবং/অথবা কলব্যাক ইভেন্টের সাথে আবদ্ধ থাকে, সেই লজিকের যেকোন সূক্ষ্ম বাগ ওয়েক লকটিকে প্রত্যাশার চেয়ে বেশি সময় ধরে রাখতে পারে। এই বাগগুলি নির্ণয় এবং ডিবাগ করা কঠিন।
{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}