Android 17 प्लैटफ़ॉर्म में, ऐसे बदलाव शामिल हैं जिनसे आपके ऐप्लिकेशन पर असर पड़ सकता है.
Android 17 पर चलने वाले सभी ऐप्लिकेशन पर, यहां बताए गए बदलाव लागू होते हैं,
भले ही, उनका targetSdkVersion कुछ भी हो. आपको अपने ऐप्लिकेशन की जांच करनी चाहिए. इसके बाद, ज़रूरत के हिसाब से उसमें बदलाव करना चाहिए, ताकि वह इन बदलावों के साथ काम कर सके.
मुख्य फ़ंक्शन
Android 17 (एपीआई लेवल 37) में, ये बदलाव शामिल हैं. इनसे Android सिस्टम की कई मुख्य क्षमताओं में बदलाव होता है या उन्हें बढ़ाया जाता है.
ऐप्लिकेशन के लिए मेमोरी की सीमाएं
Android 17 introduces app memory limits based on the device's total RAM to create a more stable and deterministic environment for your apps and Android users. In Android 17, limits are set conservatively to establish system baselines, targeting extreme memory leaks and other outliers before they trigger system-wide instability resulting in UI stuttering, higher battery drain, and apps being killed. While we anticipate minimal impact on the vast majority of app sessions, we recommend the following memory best practices, including establishing a baseline for memory.
You can determine if your app session was impacted by calling
getDescription in ApplicationExitInfo; if your app was
affected, the exit reason will be REASON_OTHER and
the description will contain the string "MemoryLimiter:AnonSwap" along with
other information. You can also use trigger-based profiling with
TRIGGER_TYPE_ANOMALY to get heap dumps that are collected when the
memory limit is hit.
The Manage your app's memory documentation gives information to help you diagnose your app's memory issues and optimize its resource consumption.
Test your app's behavior under the memory constraints
You can use Android Debug Bridge (adb) to adjust or disable the
memory limits on any device that imposes them. The shell command am
provides three subcommands to adjust the memory limits. (These commands have
no effect on a device which does not impose memory limits.)
am memory-limiter ignore <uid>|none|allam memory-limiter manual <pid> <limit>|max|noneam memory-limiter status
ignoreInstructs the memory limiter to ignore some or all processes. Passing a UID (Android User ID) instructs the memory limiter to ignore enforcement on all processes associated with that UID. You can also pass
all(ignore all apps) ornone(do not ignore any apps). Passingnoneoverrides any previous calls toam memory-limiter ignore.If you instruct the memory limiter to ignore a UID, you can still apply a manual memory limit to a process within the app by calling
am memory-limiter manual.manualInstructs the system to impose a memory constraint on the process with the specified PID (Process ID). The memory constraint is specified as an integer number of MB; for example, passing
30specifies that the process is limited to 30 MB of memory. Passingmaxremoves all memory limits on that process. Passingnoneremoves any manual limits set on the process, restoring the system's default limit (if any).statusReports the current status of the memory limiter. The status includes the memory limits imposed on visible and non-visible processes.
निजता
Android 17 में, लोगों की निजता को बेहतर बनाने के लिए ये बदलाव किए गए हैं.
एसएमएस के ज़रिए भेजे गए ओटीपी की सुरक्षा
Android 17 से, Android, एक बार इस्तेमाल होने वाले पासवर्ड (ओटीपी) वाले एसएमएस मैसेज को ज़्यादा सुरक्षित बना रहा है.
Android के पिछले वर्शन में, यह सुरक्षा मुख्य रूप से एसएमएस रिट्रीवर फ़ॉर्मैट पर फ़ोकस करती थी. एसएमएस रिट्रीवर हैश वाले मैसेज की डिलीवरी में, ज़्यादातर ऐप्लिकेशन के लिए तीन घंटे की देरी होती थी. हालांकि, कुछ ऐप्लिकेशन (जैसे कि डिफ़ॉल्ट एसएमएस हैंडलर) को इस देरी से छूट दी गई थी. साथ ही, हैश के मालिक वाले ऐप्लिकेशन को भी छूट दी गई थी.
Android 17 से, यह सुरक्षा WebOTP फ़ॉर्मैट वाले मैसेज पर भी लागू होती है. अगर किसी ऐप्लिकेशन के पास एसएमएस मैसेज पढ़ने की अनुमति है, लेकिन वह डोमेन की पुष्टि के आधार पर WebOTP मैसेज पाने वाला ऐप्लिकेशन नहीं है, तो मैसेज मिलने के तीन घंटे बाद तक ऐप्लिकेशन को मैसेज का ऐक्सेस नहीं मिलेगा. इस बदलाव का मकसद, उपयोगकर्ता की सुरक्षा को बेहतर बनाना है. इसके लिए, यह पक्का किया जाता है कि मैसेज में बताए गए डोमेन से जुड़े ऐप्लिकेशन ही प्रोग्राम के हिसाब से, पुष्टि करने के लिए कोड को पढ़ सकें.
तीन घंटे की इस देरी के दौरान, SMS_RECEIVED_ACTION ब्रॉडकास्ट को रोक दिया जाता है और एसएमएस सेवा देने वाली कंपनी के डेटाबेस की क्वेरी को फ़िल्टर किया जाता है. एसएमएस मैसेज, कुछ समय बाद इन ऐप्लिकेशन के लिए उपलब्ध होता है. यह बदलाव सभी ऐप्लिकेशन पर लागू होता है. भले ही, उनका टारगेट एपीआई लेवल कुछ भी हो.
डिफ़ॉल्ट एसएमएस असिस्टेंट ऐप्लिकेशन, कनेक्ट किए गए डिवाइस के कंपैनियन ऐप्लिकेशन वगैरह जैसे कुछ ऐप्लिकेशन को इस देरी से छूट मिली है. ओटीपी निकालने के लिए एसएमएस मैसेज पढ़ने की सुविधा पर निर्भर रहने वाले सभी ऐप्लिकेशन को SMS Retriever या SMS User Consent एपीआई का इस्तेमाल करना चाहिए, ताकि यह सुविधा काम करती रहे.
सुरक्षा
Android 17 में, डिवाइस और ऐप्लिकेशन की सुरक्षा को बेहतर बनाने के लिए ये बदलाव किए गए हैं.
usesClearTraffic को बंद करने की योजना
我们计划在未来的版本中弃用 usesCleartextTraffic 元素。需要建立未加密 (HTTP) 连接的应用应迁移为使用网络安全配置文件,该文件可让您指定应用需要与哪些网域建立明文连接。
请注意,网络安全配置文件仅在 API 级别 24 及更高版本中受支持。如果您的应用的最低 API 级别低于 24,您应执行以下两项操作:
- 将
usesCleartextTraffic属性设置为true - 使用网络配置文件
如果应用的最低 API 级别为 24 或更高,您可以使用网络配置文件,而无需设置 usesCleartextTraffic。
यूआरआई के लिए, बिना अनुमति के ग्रांट को सीमित करना
目前,如果应用启动的 intent 具有 URI,且该 URI 具有操作
ACTION_SEND、ACTION_SEND_MULTIPLE或
ACTION_IMAGE_CAPTURE,则系统会自动向目标应用授予读取和
写入 URI 权限。从 Android 18 开始,系统将
不再自动授予这些权限。因此,我们建议应用明确授予相关 URI 权限,而不是依赖系统授予这些权限。
如需检测应用中这些 intent 的使用情况,请将 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"
如需明确授予必要的权限,请将
FLAG_GRANT_READ_URI_PERMISSION标志添加到ACTION_SEND和
ACTION_SEND_MULTIPLEintent:
Kotlin
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
Java
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
对于
ACTION_IMAGE_CAPTURE intent,请同时添加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 密钥库中创建过多的密钥,因为它是设备上所有应用的共享资源。从 Android 17 开始,系统会强制限制应用可拥有的密钥数量。对于以 Android 17(API 级别 37)或更高版本为目标平台的非系统应用,密钥数量上限为 50,000 个;对于所有其他应用,密钥数量上限为 200,000 个。无论系统应用以哪个 API 级别为目标,其密钥数量上限均为 20 万。
如果应用尝试创建超出限制的密钥,则创建会失败并显示 KeyStoreException。异常的消息字符串包含有关密钥限制的信息。如果应用针对异常调用 getNumericErrorCode(),则返回值取决于应用的目标 API 级别:
- 如果应用以 Android 17(API 级别 37)或更高版本为目标平台,
getNumericErrorCode()会返回新的ERROR_TOO_MANY_KEYS值。 - 所有其他应用:
getNumericErrorCode()返回ERROR_INCORRECT_USAGE。
क्रॉस प्रोफ़ाइल लूपबैक ट्रैफ़िक को ब्लॉक करना
Android 17 से, अलग-अलग प्रोफ़ाइल के बीच लूपबैक ट्रैफ़िक की अनुमति डिफ़ॉल्ट रूप से नहीं दी जाएगी. एक ही प्रोफ़ाइल के अंदर लूपबैक ट्रैफ़िक पर कोई असर नहीं पड़ेगा. यह बदलाव, Android 17 या उसके बाद के वर्शन पर चलने वाले सभी ऐप्लिकेशन पर लागू होता है. भले ही, ऐप्लिकेशन किस एपीआई लेवल को टारगेट कर रहा हो.
लोगों का अनुभव और सिस्टम यूज़र इंटरफ़ेस (यूआई)
Android 17 में, ये बदलाव किए गए हैं. इनका मकसद, लोगों को बेहतर और आसान अनुभव देना है.
रोटेशन के बाद, डिफ़ॉल्ट आईएमई की विज़िबिलिटी को वापस लाना
从 Android 17 开始,当设备的配置发生变化(例如,通过旋转)且应用本身未处理此变化时,系统不会恢复之前的 IME 可见性。
如果应用经历了它无法处理的配置更改,并且应用需要在更改后显示键盘,您必须明确请求此行为。您可以通过以下方式之一提出此要求:
- 将
android:windowSoftInputMode属性设置为stateAlwaysVisible。 - 在 activity 的
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इंटेंट अब सिर्फ़ तब ब्रॉडकास्ट होता है, जब अपने-आप फिर से पेयर करने की कोशिश नाकाम हो जाती है. अगर सिस्टम बैकग्राउंड में बॉन्ड को ठीक कर लेता है, तो इससे ऐप्लिकेशन में बिना वजह की गड़बड़ियों को ठीक करने की ज़रूरत नहीं पड़ती. - उपयोगकर्ता को सूचना: सिस्टम, नए यूज़र इंटरफ़ेस (यूआई) की सूचनाओं और डायलॉग बॉक्स के ज़रिए फिर से पेयर करने की प्रोसेस को मैनेज करता है. लोगों को फिर से पेयर करने की कोशिश की पुष्टि करने के लिए कहा जाएगा. इससे यह पक्का किया जा सकेगा कि उन्हें फिर से कनेक्ट होने के बारे में पता है.
पेरिफ़रल डिवाइस बनाने वाली कंपनियों और कंपैनियन ऐप्लिकेशन के डेवलपर को यह पुष्टि करनी चाहिए कि हार्डवेयर और ऐप्लिकेशन, बॉन्ड ट्रांज़िशन को आसानी से मैनेज करते हैं. इस व्यवहार की जांच करने के लिए, इनमें से किसी एक तरीके का इस्तेमाल करके, रिमोट बॉन्ड के खत्म होने का सिम्युलेट करें:
- सहायक डिवाइस से, बॉन्ड की जानकारी को मैन्युअल तरीके से हटाएं
- डिवाइस को मैन्युअल तरीके से अनपेयर करें: सेटिंग > कनेक्ट किए गए डिवाइस