টাস্ক স্ন্যাপশট

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

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

স্থাপত্যশিল্প

সাম্প্রতিক থাম্বনেল এবং সেভ করা সারফেসের দুটি ধারণা টাস্ক স্ন্যাপশটের সাথে একত্রিত করা হয়েছে। কোনও টাস্ক ব্যাকগ্রাউন্ডে চলে গেলে, উইন্ডো ম্যানেজার এই টাস্কের একটি স্ক্রিনশট GraphicBuffer-এ রাখে। টাস্কের সবচেয়ে বেশি অ্যাক্টিভিটি থাকা অ্যাপ যতক্ষণ মেমরিতে থাকে, ততক্ষণ এই GraphicBuffer মেমরিতে থেকে যাবে। এখন, একই অ্যাক্টিভিটি আবার সামনে আনা হলে, Window Manager একটি শুরুর উইন্ডো (TaskSnapshotSurface) তৈরি করবে এবং শুরুর উইন্ডোর বাফার সারিতে কোনও মেমরি কপি না করেই GraphicBuffer অ্যাটাচ করবে। অ্যাক্টিভিটি প্রথম ফ্রেম আঁকার সাথে সাথেই, টাস্ক স্ন্যাপশট শুরু করার উইন্ডোটি সাধারণ স্প্ল্যাশ স্ক্রিনের মতো মসৃণভাবে ফেড-আউট হয়ে যাবে।

একই GraphicBuffer Binder-এর মাধ্যমে SystemUI-তে পাঠানো হয়, যাতে Recents ভিউতে কোনও টাস্কের প্রিভিউ স্টেট ড্র করার জন্য সেটি ব্যবহার করা যায়। যেহেতু এটি শুধু একটি বাফার এর রেফারেন্স, তাই এটি বাইন্ডারের মাধ্যমে পাঠালে কিছু রিসোর্স খরচ হয়। যখন GraphicBuffer, SystemUI-তে আসে, তখন এটি হার্ডওয়্যার বিটম্যাপে র‍্যাপ করা হয় এবং তারপরে গ্রাফিক্স মেমরিতে কোনও মেমরি আপলোড না করেই স্ক্রিনে আঁকা হয়।

সুবিধা

এই নতুন আর্কিটেকচারের তিনটি প্রধান সুবিধা রয়েছে:

  • টাস্ক স্ন্যাপশটকে যদি শুরুর উইন্ডো হিসেবে ব্যবহার করা হয়, তাহলে স্ন্যাপশট ও আসল কন্টেন্টের মধ্যে একটি সুন্দর ক্রসফেড থাকে।
  • SystemUI-তে টাস্ক স্ন্যাপশট আঁকা হলে, কোনও কপি না করেই এটি করা যেতে পারে। আগে বিটম্যাপকে Ashmem-এ কপি করতে হত, তারপর গ্রাফিক্স মেমোরিতে। এই পদ্ধতিতে স্ন্যাপশট সরাসরি গ্রাফিক্স মেমরিতে সেভ করা হয় বলে, কোনও কপি করার প্রয়োজন হয় না।
  • 'সাম্প্রতিক' বিভাগে আপনি যে স্টেট দেখতে পান, অ্যাপ আবার খোলার সময় প্রথমবার যে স্টেট দেখতে পাবেন, সেটি সবসময় একই হয়। এখানে একই বাফার থাকলে অনেক মেমরিও সেভ করা যায়। সেই কারণে, 'সাম্প্রতিক' এখন সম্পূর্ণ রেজোলিউশনে এইসব ছবি দেখাতে পারে। আগে, মেমরি সেভ করার জন্য এটি ৬৪% ডাউন স্যাম্পেল করা হয়েছিল।

প্রয়োগ

এই ফিচারটি সম্পূর্ণভাবে Android প্ল্যাটফর্মে রয়েছে। কোনও ইন্টিগ্রেশন প্রয়োজন নেই এবং কাস্টমাইজেশন কাজ করে না। তবে, ডিভাইস প্রস্তুতকারক সংস্থা টাস্ক স্ন্যাপশট ফিচারটি সম্পূর্ণ বন্ধ করে দিতে পারে।

এই ফিচার বন্ধ করতে, এই ফাংশনটি পরিবর্তন করুন:

frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215

মনে রাখবেন, ফিচারটি বন্ধ করা থাকলে, 'সাম্প্রতিক' ভিউতে কোনও থাম্বনেল দেখানো হবে না।

হাই-রেজোলিউশন ও লো-রেজোলিউশন স্ন্যাপশট

দুটি স্কেলে ডিস্কে টাস্ক স্ন্যাপশট লেখা হয়। ডিস্ক থেকে কোনও টাস্ক স্ন্যাপশট রিস্টোর করার সময়, প্রথমে কম রেজোলিউশনের স্ন্যাপশট পড়া হয় এবং তারপরে সেগুলিকে বেশি রেজোলিউশনের স্ন্যাপশট দিয়ে পাল্টে দেওয়া হয়। এই অপ্টিমাইজেশন ইমেজ লোড হওয়ার সময় উন্নত করে। অন্যথায়, ডিস্ক থেকে স্ন্যাপশট ফাইল রিড করার সময় কিছুটা দেরি হতে পারে এবং ছবি উপলভ্য না হওয়া পর্যন্ত ব্যবহারকারী টাস্ক কার্ড ফাঁকা দেখতে পাবেন। আপনি ডিভাইস ওভারলে কনফিগারেশন ফাইলে overlay/frameworks/base/core/res/res/values/config.xml config_highResTaskSnapshotScale এবং config_lowResTaskSnapshotScale সেট করে স্কেল কনফিগার করতে পারবেন। ডিফল্ট হিসেবে, এগুলি যথাক্রমে ১.০ এবং ০.৫ হিসেবে সেট করা থাকে। config_lowResTaskSnapshotScale-কে 0.0-এ সেট করে কম-রেজোলিউশনের স্ন্যাপশট বন্ধ করুন।

উদাহরণ ও সোর্স

এই ফিচারের বাকি কোডটি TaskSnapshot* ফাইলের মধ্যে এখানে খুঁজে পাবেন:

frameworks/base/+/android17-release/services/core/java/com/android/server/wm/