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