Android 17 प्लैटफ़ॉर्म में, ऐप्लिकेशन के काम करने के तरीके से जुड़े कुछ बदलाव किए गए हैं. इनका असर आपके ऐप्लिकेशन पर पड़ सकता है.
ऐप्लिकेशन के काम करने के तरीके से जुड़े ये बदलाव, Android 17 पर चलने वाले सभी ऐप्लिकेशन पर लागू होते हैं. भले ही, targetSdkVersion कुछ भी हो. आपको अपने ऐप्लिकेशन की जांच करनी चाहिए. इसके बाद, जहां ज़रूरी हो वहां इन बदलावों को लागू करने के लिए, उसमें बदलाव करना चाहिए.
Android 17 को टारगेट करने वाले ऐप्लिकेशन पर असर डालने वाले बदलावों की सूची भी ज़रूर देखें.
मुख्य फ़ंक्शन
Android 17 (एपीआई लेवल 37) में ये बदलाव शामिल हैं. इनसे Android सिस्टम की कई मुख्य क्षमताओं में बदलाव होता है या उन्हें बढ़ाया जाता है.
ऐप्लिकेशन के लिए मेमोरी की सीमाएं
Android 17 में, डिवाइस की कुल रैम के आधार पर ऐप्लिकेशन की मेमोरी की सीमाएं तय की गई हैं. इससे, आपके ऐप्लिकेशन और Android उपयोगकर्ताओं के लिए ज़्यादा स्थिर और भरोसेमंद एनवायरमेंट तैयार किया जा सकेगा. ये सीमाएं, मेमोरी लीक और अन्य गड़बड़ियों पर फ़ोकस करती हैं. ऐसा इसलिए, ताकि ये गड़बड़ियां पूरे सिस्टम को अस्थिर न कर दें. इससे यूज़र इंटरफ़ेस (यूआई) में स्टट्रिंग होती है, तेज़ी से बैटरी खर्च होती है, और ऐप्लिकेशन बंद हो जाते हैं. हमें उम्मीद है कि इस बदलाव का असर ज़्यादातर ऐप्लिकेशन सेशन पर नहीं पड़ेगा. हालांकि, हमारा सुझाव है कि आप मेमोरी के इस्तेमाल से जुड़े इन सबसे सही तरीकों को अपनाएं. इनमें मेमोरी के इस्तेमाल के लिए एक बेसलाइन तय करना भी शामिल है.
यह पता लगाया जा सकता है कि आपके ऐप्लिकेशन के सेशन पर असर पड़ा है या नहीं. इसके लिए, ApplicationExitInfo में getDescription को कॉल करें. अगर आपके ऐप्लिकेशन पर असर पड़ा है, तो बंद होने की वजह REASON_OTHER होगी. साथ ही, ब्यौरे में "MemoryLimiter:AnonSwap" स्ट्रिंग के साथ-साथ अन्य जानकारी भी शामिल होगी. मेमोरी की सीमा पूरी होने पर इकट्ठा किए गए हीप डंप पाने के लिए, TRIGGER_TYPE_ANOMALY के साथ ट्रिगर पर आधारित प्रोफ़ाइलिंग का भी इस्तेमाल किया जा सकता है.
अपने ऐप्लिकेशन की मेमोरी मैनेज करना दस्तावेज़ में, आपके ऐप्लिकेशन की मेमोरी से जुड़ी समस्याओं का पता लगाने और उसके संसाधन इस्तेमाल को ऑप्टिमाइज़ करने के बारे में जानकारी दी गई है.
मेमोरी की सीमाओं के तहत, अपने ऐप्लिकेशन के व्यवहार की जांच करना
Android डीबग ब्रिज (adb) का इस्तेमाल करके, मेमोरी की सीमाओं को लागू करने वाले किसी भी डिवाइस पर, मेमोरी की सीमाओं में बदलाव किया जा सकता है या उन्हें बंद किया जा सकता है. शेल कमांड am
में मेमोरी की सीमाएं अडजस्ट करने के लिए, तीन सब-कमांड होती हैं. (ये कमांड, उस डिवाइस पर लागू नहीं होती हैं जिस पर मेमोरी की सीमाएं लागू नहीं होती हैं.)
am memory-limiter ignore <uid>|none|allam memory-limiter manual <pid> <limit>|max|noneam memory-limiter status
ignoreयह विकल्प, मेमोरी लिमिटर को कुछ या सभी प्रोसेस को अनदेखा करने का निर्देश देता है. यूआईडी (Android उपयोगकर्ता आईडी) पास करने पर, मेमोरी लिमिटर को उस यूआईडी से जुड़ी सभी प्रोसेस पर मेमोरी लिमिट लागू न करने का निर्देश मिलता है. इसके अलावा,
all(सभी ऐप्लिकेशन को अनदेखा करें) याnone(किसी भी ऐप्लिकेशन को अनदेखा न करें) भी पास किया जा सकता है.noneको पास करने पर,am memory-limiter ignoreको किए गए पिछले सभी कॉल खारिज हो जाते हैं.अगर आपने मेमोरी लिमिटर को किसी यूआईडी को अनदेखा करने का निर्देश दिया है, तो भी ऐप्लिकेशन में किसी प्रोसेस के लिए मैन्युअल तरीके से मेमोरी की सीमा लागू की जा सकती है. इसके लिए,
am memory-limiter manualको कॉल करें.manualयह सिस्टम को, प्रोसेस पर मेमोरी की सीमा लागू करने का निर्देश देता है. इस प्रोसेस का PID (प्रोसेस आईडी) तय किया जाता है. मेमोरी की सीमा को पूर्णांक के तौर पर बताया जाता है. यह सीमा एमबी में होती है. उदाहरण के लिए,
30पास करने का मतलब है कि प्रोसेस के लिए मेमोरी की सीमा 30 एमबी है.maxपास करने से, उस प्रोसेस पर मेमोरी की सभी सीमाएं हट जाती हैं.noneपास करने पर, प्रोसेस के लिए मैन्युअल तरीके से सेट की गई सभी सीमाएं हट जाती हैं. साथ ही, सिस्टम की डिफ़ॉल्ट सीमा (अगर कोई है) वापस आ जाती है.statusमेमोरी लिमिटर की मौजूदा स्थिति की रिपोर्ट करता है. इस स्टेटस में, दिखने वाली और न दिखने वाली प्रोसेस पर लगाई गई मेमोरी की सीमाएं शामिल होती हैं.
निजता
Android 17 में, उपयोगकर्ता की निजता को बेहतर बनाने के लिए ये बदलाव किए गए हैं.
एसएमएस से भेजे गए ओटीपी की सुरक्षा
从 Android 17 开始,Android 将扩大对包含一次性密码 (OTP) 的短信的保护范围。
在之前的 Android 版本中,此保护主要侧重于 SMS Retriever 格式。对于大多数应用,包含 SMS Retriever 哈希的消息的递送延迟了 3 小时。不过,某些应用(例如默认短信处理程序)不受此延迟的影响,拥有哈希的应用也不受此延迟的影响。
从 Android 17 开始,此保护也适用于 WebOTP 格式的消息。如果应用有权读取短信,但不是 WebOTP 消息的预期接收者(由网域验证确定),则该应用在收到消息后 3 小时内无法访问该消息。此变更旨在提高用户安全性,确保只有与消息中提及的网域关联的应用才能以编程方式读取验证码。
在这 3 小时的延迟期间,系统会保留 SMS_RECEIVED_ACTION 广播,并过滤 短信提供商 数据库查询。延迟结束后,这些应用即可使用短信。此变更适用于
所有应用,无论其目标 API 级别如何。
某些应用(例如默认短信助理应用、关联设备配套应用等)不受此延迟的影响。所有依赖于读取短信 来提取 OTP 的应用都应过渡到使用 SMS Retriever 或 SMS User Consent API,以确保功能持续可用。
सुरक्षा
Android 17 में, डिवाइस और ऐप्लिकेशन की सुरक्षा को बेहतर बनाने के लिए ये बदलाव किए गए हैं.
usesClearTraffic के बंद होने का प्लान
आने वाले समय में, हम usesCleartextTraffic एलिमेंट को बंद करने की योजना बना रहे हैं.
जिन ऐप्लिकेशन को बिना एन्क्रिप्ट (एचटीटीपी) किए कनेक्शन बनाने होते हैं उन्हें नेटवर्क सिक्योरिटी कॉन्फ़िगरेशन फ़ाइल का इस्तेमाल करना चाहिए. इससे यह तय किया जा सकता है कि आपका ऐप्लिकेशन किन डोमेन से cleartext कनेक्शन बनाएगा.
ध्यान दें कि नेटवर्क सुरक्षा कॉन्फ़िगरेशन फ़ाइलें, सिर्फ़ एपीआई लेवल 24 और इसके बाद के वर्शन पर काम करती हैं. अगर आपके ऐप्लिकेशन का कम से कम एपीआई लेवल 24 से कम है, तो आपको ये दोनों काम करने चाहिए:
usesCleartextTrafficएट्रिब्यूट कोtrueपर सेट करें- नेटवर्क कॉन्फ़िगरेशन फ़ाइल का इस्तेमाल करना
अगर आपके ऐप्लिकेशन का कम से कम एपीआई लेवल 24 या इससे ज़्यादा है, तो नेटवर्क कॉन्फ़िगरेशन फ़ाइल का इस्तेमाल किया जा सकता है. साथ ही, आपको usesCleartextTraffic सेट करने की ज़रूरत नहीं है.
यूआरआई के लिए, इंप्लिसिट ग्रांट को प्रतिबंधित करना
फ़िलहाल, अगर कोई ऐप्लिकेशन ऐसे यूआरआई के साथ इंटेंट लॉन्च करता है जिसमें ऐक्शन
ACTION_SEND, ACTION_SEND_MULTIPLE या
ACTION_IMAGE_CAPTURE शामिल है, तो सिस्टम टारगेट ऐप्लिकेशन को यूआरआई को पढ़ने और लिखने की अनुमतियां अपने-आप दे देता है. Android 18 से, सिस्टम इन अनुमतियों को अपने-आप नहीं देगा. इस वजह से, हमारा सुझाव है कि ऐप्लिकेशन, सिस्टम पर भरोसा करने के बजाय यूआरआई की ज़रूरी अनुमतियां साफ़ तौर पर दें.
अपने ऐप्लिकेशन में इन इंटेंट के इस्तेमाल का पता लगाने के लिए, उल्लंघन ट्रिगर करने के लिए StrictMode के साथ detectImplicitUriPermissionGrant() का इस्तेमाल करें:
Kotlin
val policy = StrictMode.VmPolicy.Builder() .detectImplicitUriPermissionGrant() .penaltyLog() .build() StrictMode.setVmPolicy(policy)
Java
StrictMode.VmPolicy policy = new StrictMode.VmPolicy.Builder() .detectImplicitUriPermissionGrant() .penaltyLog() .build(); StrictMode.setVmPolicy(policy);
इसके अलावा, लॉग किए गए उन अपवादों को मॉनिटर किया जा सकता है जिनमें यह मैसेज
Please set the grant explicitly in the app शामिल हो. यह मैसेज तब दिखता है, जब सिस्टम अनुमति को
अपने-आप सेट करता है. इन लॉग की निगरानी करने के लिए, adb कमांड का इस्तेमाल करें:
adb logcat | grep "Please set the grant explicitly in the app"
ज़रूरी अनुमतियां देने के लिए, ACTION_SEND और ACTION_SEND_MULTIPLE इंटेंट में FLAG_GRANT_READ_URI_PERMISSION फ़्लैग जोड़ें:
Kotlin
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
Java
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
ACTION_IMAGE_CAPTURE इंटेंट के लिए, FLAG_GRANT_READ_URI_PERMISSION और FLAG_GRANT_WRITE_URI_PERMISSION, दोनों फ़्लैग शामिल करें:
Kotlin
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
Java
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
हर ऐप्लिकेशन के लिए कीस्टोर की सीमाएं
ऐप्लिकेशन को Android Keystore में बहुत ज़्यादा कुंजियां नहीं बनानी चाहिए, क्योंकि यह डिवाइस पर मौजूद सभी ऐप्लिकेशन के लिए शेयर किया गया संसाधन है. Android 17 से, सिस्टम यह तय करता है कि कोई ऐप्लिकेशन कितनी कुंजियों का मालिकाना हक रख सकता है. Android 17 (एपीआई लेवल 37) या उसके बाद के वर्शन को टारगेट करने वाले सिस्टम ऐप्लिकेशन के लिए, 50,000 कुंजियों की सीमा तय की गई है. वहीं, अन्य सभी ऐप्लिकेशन के लिए, 2,00,000 कुंजियों की सीमा तय की गई है. सिस्टम ऐप्लिकेशन के लिए, 2,00,000 कुंजियों की सीमा तय की गई है. इससे कोई फ़र्क़ नहीं पड़ता कि वे किस एपीआई लेवल को टारगेट करते हैं.
अगर कोई ऐप्लिकेशन तय सीमा से ज़्यादा कुंजियां बनाने की कोशिश करता है, तो KeyStoreException गड़बड़ी की वजह से कुंजियां नहीं बन पाएंगी. अपवाद के मैसेज स्ट्रिंग में, कुंजी की सीमा के बारे में जानकारी होती है. अगर ऐप्लिकेशन, अपवाद पर getNumericErrorCode() को कॉल करता है, तो रिटर्न वैल्यू इस बात पर निर्भर करती है कि ऐप्लिकेशन किस एपीआई लेवल को टारगेट करता है:
- Android 17 (एपीआई लेवल 37) या इसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए:
getNumericErrorCode()नईERROR_TOO_MANY_KEYSवैल्यू दिखाता है. - अन्य सभी ऐप्लिकेशन के लिए:
getNumericErrorCode(),ERROR_INCORRECT_USAGEदिखाता है.
क्रॉस प्रोफ़ाइल लूपबैक ट्रैफ़िक को ब्लॉक करना
Android 17 से, अलग-अलग प्रोफ़ाइल के बीच लूपबैक ट्रैफ़िक की अनुमति डिफ़ॉल्ट रूप से नहीं दी जाएगी. एक ही प्रोफ़ाइल के अंदर लूपबैक ट्रैफ़िक पर कोई असर नहीं पड़ेगा. यह बदलाव, Android 17 या उसके बाद के वर्शन पर चलने वाले सभी ऐप्लिकेशन पर लागू होता है. भले ही, ऐप्लिकेशन किस एपीआई लेवल को टारगेट कर रहा हो.
उपयोगकर्ता अनुभव और सिस्टम यूज़र इंटरफ़ेस (यूआई)
Android 17 में ये बदलाव किए गए हैं. इनका मकसद, लोगों को बेहतर और एक जैसा अनुभव देना है.
रोटेशन के बाद, IME की डिफ़ॉल्ट दृश्यता को वापस लाना
Android 17 से, डिवाइस के कॉन्फ़िगरेशन में बदलाव होने पर (उदाहरण के लिए, रोटेशन के ज़रिए) और अगर ऐप्लिकेशन इसे मैनेज नहीं करता है, तो पहले कीबोर्ड की दिखने की सेटिंग वापस नहीं लाई जाती.
अगर आपके ऐप्लिकेशन के कॉन्फ़िगरेशन में कोई ऐसा बदलाव होता है जिसे वह मैनेज नहीं करता है और बदलाव के बाद ऐप्लिकेशन को कीबोर्ड दिखाने की ज़रूरत है, तो आपको साफ़ तौर पर इसके लिए अनुरोध करना होगा. इसके लिए, इनमें से कोई एक तरीका अपनाएं:
android:windowSoftInputModeएट्रिब्यूट कोstateAlwaysVisibleपर सेट करें.- अपने ऐप्लिकेशन की
onCreate()तरीके में, प्रोग्राम के ज़रिए सॉफ़्ट कीबोर्ड का अनुरोध करें याonConfigurationChanged()तरीका जोड़ें.
लोगों से मिले इनपुट
Android 17 में ये बदलाव किए गए हैं. इनसे, ऐप्लिकेशन के कीबोर्ड और टचपैड जैसे ह्यूमन इनपुट डिवाइसों के साथ इंटरैक्ट करने के तरीके पर असर पड़ता है.
पॉइंटर कैप्चर करने के दौरान, टचपैड डिफ़ॉल्ट रूप से रिलेटिव इवेंट डिलीवर करते हैं
Android 17 से, अगर कोई ऐप्लिकेशन View.requestPointerCapture() का इस्तेमाल करके पॉइंटर कैप्चर करने का अनुरोध करता है और उपयोगकर्ता टचपैड का इस्तेमाल करता है, तो सिस्टम उपयोगकर्ता के टच से पॉइंटर की गतिविधि और स्क्रोलिंग के जेस्चर को पहचानता है. साथ ही, उन्हें ऐप्लिकेशन को उसी तरह से रिपोर्ट करता है जिस तरह से कैप्चर किए गए माउस से पॉइंटर और स्क्रोल व्हील की गतिविधियों को रिपोर्ट किया जाता है. ज़्यादातर मामलों में, इससे उन ऐप्लिकेशन की ज़रूरत खत्म हो जाती है जो कैप्चर किए गए चूहों के साथ काम करते हैं. साथ ही, टचपैड के लिए खास हैंडलिंग लॉजिक जोड़ते हैं. ज़्यादा जानकारी के लिए, View.POINTER_CAPTURE_MODE_RELATIVE का दस्तावेज़ देखें.
इससे पहले, सिस्टम टचपैड से किए गए जेस्चर को नहीं पहचानता था. इसके बजाय, यह उंगलियों की सटीक जगह की जानकारी को ऐप्लिकेशन को उसी फ़ॉर्मैट में भेजता था जिस फ़ॉर्मैट में टचस्क्रीन पर किए गए टच की जानकारी भेजी जाती है. अगर किसी ऐप्लिकेशन को अब भी इस डेटा की ज़रूरत है, तो उसे View.POINTER_CAPTURE_MODE_ABSOLUTE के साथ View.requestPointerCapture(int) तरीके को कॉल करना चाहिए.
मीडिया
Android 17 में, मीडिया के व्यवहार में ये बदलाव किए गए हैं.
बैकग्राउंड ऑडियो सुरक्षा कड़ी करना
Android 17 से, ऑडियो फ़्रेमवर्क, बैकग्राउंड में ऑडियो से जुड़े इंटरैक्शन पर पाबंदियां लगाता है. इनमें ऑडियो चलाने, ऑडियो फ़ोकस के अनुरोध, और वॉल्यूम में बदलाव करने वाले एपीआई शामिल हैं. ऐसा इसलिए किया जाता है, ताकि यह पक्का किया जा सके कि ये बदलाव, उपयोगकर्ता ने जान-बूझकर किए हों.
अगर कोई ऐप्लिकेशन, मान्य लाइफ़साइकल में न होने पर, ऑडियो एपीआई को कॉल करने की कोशिश करता है, तो ऑडियो चलाने और वॉल्यूम में बदलाव करने वाले एपीआई, बिना कोई अपवाद दिखाए या गड़बड़ी का मैसेज दिए, चुपचाप काम करना बंद कर देते हैं. ऑडियो फ़ोकस एपीआई, AUDIOFOCUS_REQUEST_FAILED के नतीजे वाले कोड के साथ काम करना बंद कर देता है.
ज़्यादा जानकारी के लिए, बैकग्राउंड में ऑडियो को सुरक्षित बनाने के बारे में पढ़ें. इसमें, सुरक्षा को बेहतर बनाने की रणनीतियां भी शामिल हैं.
कनेक्टिविटी
डिवाइस कनेक्टिविटी को बेहतर बनाने के लिए, Android 17 में ये बदलाव किए गए हैं.
ब्लूटूथ कनेक्शन के बंद होने पर, अपने-आप फिर से कनेक्ट होने की सुविधा
Android 17 में, अपने-आप फिर से पेयर होने की सुविधा जोड़ी गई है. यह सिस्टम-लेवल पर किया गया सुधार है. इसे ब्लूटूथ कनेक्शन के बंद होने की समस्या को अपने-आप ठीक करने के लिए डिज़ाइन किया गया है.
पहले, अगर कोई बॉन्ड हट जाता था, तो उपयोगकर्ताओं को सेटिंग में जाकर, पेरिफ़ेरल को अनपेयर करना पड़ता था. इसके बाद, उसे फिर से पेयर करना पड़ता था. यह सुविधा, Android 16 में सुरक्षा से जुड़े सुधारों पर आधारित है. इससे सिस्टम को बैकग्राउंड में फिर से कनेक्शन बनाने की अनुमति मिलती है. इसके लिए, उपयोगकर्ताओं को सेटिंग में जाकर, पेरिफ़ेरल को अनपेयर और फिर से पेयर करने की ज़रूरत नहीं होती.
ज़्यादातर ऐप्लिकेशन के लिए, कोड में बदलाव करने की ज़रूरत नहीं होगी. हालांकि, डेवलपर को ब्लूटूथ स्टैक में होने वाले इन बदलावों के बारे में पता होना चाहिए:
- पेयर करने का नया कॉन्टेक्स्ट:
ACTION_PAIRING_REQUESTमें अबEXTRA_PAIRING_CONTEXTएक्स्ट्रा शामिल है. इससे ऐप्लिकेशन, पेयर करने के सामान्य अनुरोध और ऑटोनॉमस सिस्टम की ओर से शुरू किए गए फिर से पेयर करने के अनुरोध के बीच अंतर कर सकते हैं. - शर्तों के साथ कुंजी अपडेट करना: मौजूदा सुरक्षा कुंजियों को सिर्फ़ तब बदला जाएगा, जब फिर से पेयर करने की प्रोसेस पूरी हो जाए और नया कनेक्शन, पिछले कनेक्शन के सुरक्षा स्तर के बराबर या उससे ज़्यादा हो.
- बदली गई इंटेंट टाइमिंग:
ACTION_KEY_MISSINGइंटेंट अब सिर्फ़ तब ब्रॉडकास्ट होता है, जब अपने-आप फिर से पेयर करने की कोशिश नाकाम हो जाती है. अगर सिस्टम बैकग्राउंड में बॉन्ड को ठीक कर लेता है, तो इससे ऐप्लिकेशन में बिना वजह की गड़बड़ियों को ठीक करने की ज़रूरत नहीं पड़ती. - उपयोगकर्ता को सूचना: सिस्टम, नए यूज़र इंटरफ़ेस (यूआई) की सूचनाओं और डायलॉग बॉक्स के ज़रिए फिर से पेयर करने की प्रोसेस को मैनेज करता है. लोगों को फिर से पेयर करने की कोशिश की पुष्टि करने के लिए कहा जाएगा. इससे यह पक्का किया जा सकेगा कि उन्हें फिर से कनेक्ट होने के बारे में पता है.
पेरिफ़रल डिवाइस बनाने वाली कंपनियों और कंपैनियन ऐप्लिकेशन के डेवलपर को यह पुष्टि करनी चाहिए कि हार्डवेयर और ऐप्लिकेशन, बॉन्ड ट्रांज़िशन को आसानी से मैनेज करते हैं. इस व्यवहार की जांच करने के लिए, इनमें से किसी एक तरीके का इस्तेमाल करके, रिमोट बॉन्ड के खत्म होने का सिम्युलेट करें:
- सहायक डिवाइस से, बॉन्ड की जानकारी को मैन्युअल तरीके से हटाएं
- डिवाइस को मैन्युअल तरीके से अनपेयर करें: सेटिंग > कनेक्ट किए गए डिवाइस