टास्क स्नैपशॉट, Android 8.0 में पेश किया गया एक इन्फ़्रास्ट्रक्चर है. यह Window Manager से सेव किए गए सर्फ़ेस के साथ-साथ हाल ही के थंबनेल के लिए स्क्रीनशॉट को जोड़ता है. 'हाल ही के' थंबनेल, 'हाल ही के' व्यू में किसी टास्क की आखिरी स्थिति को दिखाते हैं.
जब कोई गतिविधि रुक जाती थी, तब Window Manager उस गतिविधि के सर्फ़ेस को तब तक डिस्ट्रॉय नहीं करता था, जब तक वह गतिविधि टास्क में सबसे ऊपर होती थी. अगर इस गतिविधि को फिर से दिखाना था, तो Window Manager ने गतिविधि के पहले फ़्रेम को ड्रॉ करने के खत्म होने का इंतज़ार किए बिना, ऐनिमेशन शुरू कर दिया. ऐसा इसलिए हुआ, क्योंकि वह इस सेव किए गए सर्फ़ेस का इस्तेमाल कर सका.
भवन निर्माण
'हाल ही के थंबनेल' और 'सेव किए गए सर्फ़ेस' के दो कॉन्सेप्ट को टास्क स्नैपशॉट के साथ जोड़ दिया गया है. जब कोई टास्क बैकग्राउंड में चला जाता है, तो Window Manager इस टास्क का स्क्रीनशॉट, GraphicBuffer में सेव कर देता है. जब तक टास्क की सबसे ऊपर वाली गतिविधि का ऐप्लिकेशन मेमोरी में रहेगा, तब तक यह GraphicBuffer मेमोरी में सेव रहेगा. अब जब उसी गतिविधि को फिर से सबसे ऊपर लाया जाता है, तो WindowManager एक शुरुआती विंडो (TaskSnapshotSurface) बनाता है. साथ ही, GraphicBuffer को शुरुआती विंडो की बफ़र कतार में किसी भी मेमोरी को कॉपी किए बिना अटैच करता है. जैसे ही गतिविधि का पहला फ़्रेम बन जाता है, टास्क स्नैपशॉट की शुरुआती विंडो, सामान्य स्प्लैश स्क्रीन की तरह धीरे-धीरे गायब हो जाएगी.
इसी GraphicBuffer को Binder के ज़रिए SystemUI को भी भेजा जाता है, ताकि इसका इस्तेमाल Recents व्यू में किसी टास्क की झलक दिखाने के लिए किया जा सके. यह सिर्फ़ बफ़र का रेफ़रंस है. इसलिए, इसे बाइंडर पर भेजने में कम रिसॉर्स खर्च होते हैं. जब GraphicBuffer, SystemUI पर पहुंचता है, तो उसे हार्डवेयर Bitmap में रैप किया जाता है. इसके बाद, उसे ग्राफ़िक्स मेमोरी में अपलोड किए बिना स्क्रीन पर दिखाया जाता है.
फ़ायदे
इस नए आर्किटेक्चर के तीन मुख्य फ़ायदे हैं:
- अगर टास्क स्नैपशॉट का इस्तेमाल शुरुआती विंडो के तौर पर किया जाता है, तो स्नैपशॉट और असली कॉन्टेंट के बीच एक अच्छा क्रॉसफ़ेड होता है.
- जब SystemUI में टास्क स्नैपशॉट बनाया जाता है, तो इसे बिना किसी कॉपी के बनाया जा सकता है. पहले, बिटमैप को Ashmem में कॉपी करना पड़ता था. इसके बाद, इसे ग्राफ़िक्स मेमोरी में कॉपी करना पड़ता था. इस तरीके में स्नैपशॉट को सीधे तौर पर ग्राफ़िक्स मेमोरी में सेव किया जाता है. इसलिए, इसे कॉपी करने की ज़रूरत नहीं होती.
- 'हाल ही के' सेक्शन में दिखने वाली स्थिति, ऐप्लिकेशन को फिर से खोलने पर दिखने वाली स्थिति से हमेशा मेल खाती है. यहां एक ही बफ़र होने से, मेमोरी भी काफ़ी बचती है. इसलिए, 'हाल ही की' फ़ोल्डर में अब इन इमेज को पूरे रिज़ॉल्यूशन में दिखाया जा सकता है. पहले, मेमोरी बचाने के लिए इसे 64% तक डाउन सैंपल किया जाता था.
लागू करना
यह सुविधा पूरी तरह से 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
को सेट करें. डिफ़ॉल्ट रूप से, इनकी वैल्यू 1.0 और 0.5 पर सेट होती है. config_lowResTaskSnapshotScale
को 0.0 पर सेट करके, कम रिज़ॉल्यूशन वाले स्नैपशॉट लेने की सुविधा बंद करें.
उदाहरण और सोर्स
इस सुविधा के लिए बाकी कोड, TaskSnapshot* फ़ाइलों में यहां देखें:
frameworks/base/+/android16-release/services/core/java/com/android/server/wm/