पिछले वर्शन की तरह ही, Android 15 में भी काम करने के तरीके में बदलाव किए गए हैं. इनसे आपके ऐप्लिकेशन पर असर पड़ सकता है. काम करने के तरीके में ये बदलाव, सिर्फ़ उन ऐप्लिकेशन पर लागू होते हैं जो Android 15 या इसके बाद के वर्शन को टारगेट करते हैं. अगर आपका ऐप्लिकेशन Android 15 या उसके बाद के वर्शन को टारगेट कर रहा है, तो आपको अपने ऐप्लिकेशन में बदलाव करना चाहिए, ताकि जहां भी लागू हो वहां इन बदलावों का सही तरीके से इस्तेमाल किया जा सके.
Android 15 पर काम करने वाले सभी ऐप्लिकेशन पर असर डालने वाले बदलावों की सूची भी देखना न भूलें. भले ही, आपके ऐप्लिकेशन का targetSdkVersion
कुछ भी हो.
मुख्य फ़ंक्शन
Android 15, Android सिस्टम की कई मुख्य सुविधाओं में बदलाव करता है या उन्हें बेहतर बनाता है.
फ़ोरग्राउंड सेवाओं में बदलाव
我们将对 Android 15 中的前台服务进行以下更改。
数据同步前台服务超时行为
Android 15 में, dataSync
के लिए टाइम आउट का नया तरीका जोड़ा गया है. यह तरीका, Android 15 (एपीआई लेवल 35) या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए है. यह व्यवहार,
mediaProcessing
फ़ोरग्राउंड सेवा के नए टाइप पर भी लागू होता है.
सिस्टम, किसी ऐप्लिकेशन की dataSync
सेवाओं को 24 घंटे में कुल छह घंटे तक चलने की अनुमति देता है. इसके बाद, सिस्टम चल रही सेवा के Service.onTimeout(int, int)
तरीके को कॉल करता है. इसे Android 15 में लॉन्च किया गया था. इस दौरान, सेवा के पास Service.stopSelf()
को कॉल करने के लिए कुछ सेकंड होते हैं. Service.onTimeout()
को कॉल करने के बाद, सेवा को फ़ोरग्राउंड सेवा नहीं माना जाता. अगर सेवा Service.stopSelf()
को कॉल नहीं करती है, तो सिस्टम में कोई इंटरनल अपवाद दिखता है. अपवाद को Logcat में इस मैसेज के साथ लॉग किया जाता है:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type dataSync did not stop within its timeout: [component name]"
इस बदलाव की वजह से होने वाली समस्याओं से बचने के लिए, इनमें से एक या एक से ज़्यादा काम किए जा सकते हैं:
- अपनी सेवा में
Service.onTimeout(int, int)
का नया तरीका लागू करें. जब आपके ऐप्लिकेशन को कॉलबैक मिल जाए, तोstopSelf()
को कुछ सेकंड के अंदर कॉल करना न भूलें. (अगर ऐप्लिकेशन को तुरंत बंद नहीं किया जाता है, तो सिस्टम गड़बड़ी का मैसेज जनरेट करता है.) - पक्का करें कि आपके ऐप्लिकेशन की
dataSync
सेवाएं, 24 घंटे में कुल छह घंटे से ज़्यादा न चलें. ऐसा तब तक नहीं होगा, जब तक उपयोगकर्ता ऐप्लिकेशन के साथ इंटरैक्ट करके, टाइमर को रीसेट नहीं करता. - सीधे उपयोगकर्ता के साथ इंटरैक्शन होने पर ही,
dataSync
फ़ोरग्राउंड सेवाएं शुरू करें. सेवा शुरू होने के समय, आपका ऐप्लिकेशन फ़ोरग्राउंड में होता है. इसलिए, ऐप्लिकेशन के बैकग्राउंड में चलने के बाद, आपकी सेवा को पूरे छह घंटे तक चालू रखा जाता है. dataSync
फ़ोरग्राउंड सेवा का इस्तेमाल करने के बजाय, किसी अन्य एपीआई का इस्तेमाल करें.
अगर आपके ऐप्लिकेशन की dataSync
फ़ोरग्राउंड सेवाएं पिछले 24 में छह घंटे तक चली हैं, तो आपके पास dataSync
की दूसरी फ़ोरग्राउंड सेवा शुरू करने का विकल्प नहीं है. जब तक उपयोगकर्ता आपके ऐप्लिकेशन को फ़ोरग्राउंड में न ले जाए (इससे टाइमर रीसेट हो जाता है). अगर कोई दूसरी dataSync
फ़ोरग्राउंड सेवा शुरू करने की कोशिश की जाती है, तो सिस्टम ForegroundServiceStartNotAllowedException
को गड़बड़ी का मैसेज दिखाता है. जैसे, "dataSync टाइप की फ़ोरग्राउंड सेवा के लिए, समयसीमा पहले ही खत्म हो चुकी है".
टेस्ट करना
अपने ऐप्लिकेशन के व्यवहार की जांच करने के लिए, डेटा सिंक टाइम आउट की सुविधा चालू की जा सकती है. भले ही, आपका ऐप्लिकेशन Android 15 को टारगेट न करता हो. हालांकि, यह ज़रूरी है कि ऐप्लिकेशन Android 15 वाले डिवाइस पर चल रहा हो. टाइम आउट की सुविधा चालू करने के लिए, यह adb
कमांड चलाएं:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
टाइम आउट की अवधि में बदलाव भी किया जा सकता है. इससे यह जांचना आसान हो जाता है कि
तय सीमा पूरी होने पर, आपका ऐप्लिकेशन कैसे काम करता है. टाइम आउट की नई अवधि सेट करने के लिए, यह adb
कमांड चलाएं:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
新的媒体处理前台服务类型
Android 15 में, फ़ोरग्राउंड सेवा का एक नया टाइप mediaProcessing
जोड़ा गया है. यह सेवा टाइप, मीडिया फ़ाइलों को ट्रांसकोड करने जैसे कामों के लिए सही है. उदाहरण के लिए, कोई मीडिया ऐप्लिकेशन किसी ऑडियो फ़ाइल को डाउनलोड कर सकता है और उसे चलाने से पहले, किसी दूसरे फ़ॉर्मैट में बदल सकता है. mediaProcessing
फ़ोरग्राउंड सेवा का इस्तेमाल करके, यह पक्का किया जा सकता है कि ऐप्लिकेशन बैकग्राउंड में होने पर भी कन्वर्ज़न जारी रहे.
सिस्टम किसी ऐप्लिकेशन की mediaProcessing
सेवाओं को 24 घंटों में कुल छह घंटे चलाने की अनुमति देता है. इसके बाद, सिस्टम, मौजूदा सेवा के Service.onTimeout(int, int)
तरीके को कॉल करता है (Android 15 में शुरू किया गया). फ़िलहाल, Service.stopSelf()
को कॉल करने के लिए सेवा को कुछ सेकंड मिलेंगे. अगर सेवा Service.stopSelf()
को कॉल नहीं करती है, तो सिस्टम में कोई इंटरनल अपवाद दिखता है. अपवाद को Logcat में लॉग इन किया जाता है जिसमें यह मैसेज शामिल है:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type mediaProcessing did not stop within its timeout: [component name]"
अपवाद से बचने के लिए, इनमें से कोई एक काम किया जा सकता है:
- अपनी सेवा में
Service.onTimeout(int, int)
का नया तरीका लागू करें. जब आपके ऐप्लिकेशन को कॉलबैक मिलता है, तो कुछ सेकंड के अंदरstopSelf()
को कॉल करना न भूलें. (अगर ऐप्लिकेशन को तुरंत नहीं रोका जाता, तो सिस्टम गड़बड़ी जनरेट करता है.) - पक्का करें कि आपके ऐप्लिकेशन की
mediaProcessing
सेवाएं, 24 घंटे में कुल छह घंटे से ज़्यादा न चलें. ऐसा तब तक नहीं होगा, जब तक उपयोगकर्ता ऐप्लिकेशन के साथ इंटरैक्ट करके, टाइमर को रीसेट नहीं करता. - सीधे उपयोगकर्ता के साथ इंटरैक्शन होने पर ही,
mediaProcessing
फ़ोरग्राउंड सेवाएं शुरू करें. सेवा शुरू होने के समय, आपका ऐप्लिकेशन फ़ोरग्राउंड में होता है. इसलिए, ऐप्लिकेशन के बैकग्राउंड में चलने के बाद, आपकी सेवा को पूरे छह घंटे तक चालू रखा जाता है. mediaProcessing
फ़ोरग्राउंड सेवा का इस्तेमाल करने के बजाय, WorkManager जैसे अन्य एपीआई का इस्तेमाल करें.
अगर आपके ऐप्लिकेशन की mediaProcessing
फ़ोरग्राउंड सेवाएं पिछले 24 में छह घंटों तक चली हैं, तो mediaProcessing
फ़ोरग्राउंड सेवा को तब तक शुरू नहीं किया जा सकता, जब तक
उपयोगकर्ता आपके ऐप्लिकेशन को फ़ोरग्राउंड में न ले जाए (इससे टाइमर रीसेट हो जाता है). अगर कोई दूसरी mediaProcessing
फ़ोरग्राउंड सेवा शुरू करने की कोशिश की जाती है, तो सिस्टम ForegroundServiceStartNotAllowedException
को गड़बड़ी का मैसेज दिखाता है. जैसे, "mediaProcessing टाइप की फ़ोरग्राउंड सेवा के लिए, समयसीमा पहले ही खत्म हो चुकी है".
mediaProcessing
सेवा टाइप के बारे में ज़्यादा जानकारी के लिए, Android 15 के लिए फ़ोरग्राउंड सेवा टाइप में हुए बदलाव: मीडिया प्रोसेसिंग देखें.
टेस्ट करना
अपने ऐप्लिकेशन के काम करने के तरीके की जांच करने के लिए, मीडिया प्रोसेसिंग के टाइम आउट को चालू किया जा सकता है. भले ही, आपका ऐप्लिकेशन Android 15 को टारगेट न करता हो (जब तक कि ऐप्लिकेशन, Android 15 डिवाइस पर चल रहा हो). टाइम आउट की सुविधा चालू करने के लिए, यह adb
कमांड चलाएं:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
टाइम आउट की अवधि में बदलाव भी किया जा सकता है. इससे यह जांचना आसान हो जाता है कि
तय सीमा पूरी होने पर, आपका ऐप्लिकेशन कैसे काम करता है. टाइम आउट की नई अवधि सेट करने के लिए, यह adb
कमांड चलाएं:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds
对启动前台服务的 BOOT_COMPLETED
广播接收器的限制
在启动 BOOT_COMPLETED
广播接收器方面存在新限制
前台服务。BOOT_COMPLETED
接收器不能启动
以下类型的前台服务:
dataSync
camera
mediaPlayback
phoneCall
mediaProjection
microphone
(自 Android 14 起,microphone
就受到此限制)
如果 BOOT_COMPLETED
接收器尝试启动任何上述类型的前台
服务,系统会抛出 ForegroundServiceStartNotAllowedException
。
测试
如需测试应用的行为,您可以启用这些新限制,即使您的应用并未以 Android 15 为目标平台(只要应用在 Android 15 设备上运行)也是如此。运行以下 adb
命令:
adb shell am compat enable FGS_BOOT_COMPLETED_RESTRICTIONS your-package-name
如需在不重启设备的情况下发送 BOOT_COMPLETED
广播,请运行以下 adb
命令:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED your-package-name
在应用拥有 SYSTEM_ALERT_WINDOW
权限时启动前台服务的限制
पहले, अगर किसी ऐप्लिकेशन के पास SYSTEM_ALERT_WINDOW
अनुमति होती थी, तो वह फ़ोरग्राउंड सेवा को लॉन्च कर सकता था. भले ही, वह ऐप्लिकेशन फ़िलहाल बैकग्राउंड में हो. इस बारे में बैकग्राउंड में शुरू करने से जुड़ी पाबंदियों से छूट में बताया गया है.
अगर कोई ऐप्लिकेशन Android 15 को टारगेट करता है, तो अब यह छूट कम हो गई है. ऐप्लिकेशन को अब SYSTEM_ALERT_WINDOW
की अनुमति की ज़रूरत होगी. साथ ही, उसमें भी एक दिखने वाला ओवरले विंडो भी होनी चाहिए. इसका मतलब है कि ऐप्लिकेशन को सबसे पहले TYPE_APPLICATION_OVERLAY
विंडो लॉन्च करनी होगी और फ़ोरग्राउंड सेवा शुरू करने से पहले, विंडो दिखनी चाहिए.
अगर आपका ऐप्लिकेशन इन नई ज़रूरी शर्तों को पूरा किए बिना, बैकग्राउंड से फ़ोरग्राउंड सेवा शुरू करने की कोशिश करता है और उसे कोई छूट नहीं मिली है, तो सिस्टम ForegroundServiceStartNotAllowedException
दिखाता है.
अगर आपका ऐप्लिकेशन SYSTEM_ALERT_WINDOW
अनुमति का एलान करता है और बैकग्राउंड से फ़ोरग्राउंड सेवाएं लॉन्च करता है, तो इस बदलाव का उस पर असर पड़ सकता है. अगर आपके ऐप्लिकेशन को ForegroundServiceStartNotAllowedException
मिलता है, तो अपने ऐप्लिकेशन के काम करने का क्रम देखें और पक्का करें कि बैकग्राउंड से फ़ोरग्राउंड सेवा शुरू करने से पहले, आपके ऐप्लिकेशन में एक ऐक्टिव ओवरले विंडो हो. View.getWindowVisibility()
को कॉल करके, यह देखा जा सकता है कि ओवरले विंडो फ़िलहाल दिख रही है या नहीं. इसके अलावा, View.onWindowVisibilityChanged()
को बदलकर, यह भी सेट किया जा सकता है कि ओवरले विंडो दिखने या न दिखने पर सूचना मिलती रहे.
टेस्ट करना
अपने ऐप्लिकेशन के व्यवहार की जांच करने के लिए, ये नई पाबंदियां चालू की जा सकती हैं. भले ही, आपका ऐप्लिकेशन Android 15 को टारगेट न करता हो. हालांकि, यह ज़रूरी है कि ऐप्लिकेशन Android 15 वाले डिवाइस पर चल रहा हो. बैकग्राउंड से फ़ोरग्राउंड सेवाएं शुरू करने से जुड़ी इन नई पाबंदियों को चालू करने के लिए, यहां दिया गया adb
निर्देश चलाएं:
adb shell am compat enable FGS_SAW_RESTRICTIONS your-package-name
ऐप्लिकेशन, 'परेशान न करें' मोड की ग्लोबल स्थिति में कब बदलाव कर सकते हैं, इसमें बदलाव
Android 15 (एपीआई लेवल 35) और उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन, अब किसी डिवाइस पर 'परेशान न करें' (डीएनडी) मोड की ग्लोबल स्थिति या नीति को नहीं बदल सकते. ऐसा, उपयोगकर्ता की सेटिंग में बदलाव करके या डीएनडी मोड को बंद करके नहीं किया जा सकता. इसके बजाय, ऐप्लिकेशन को AutomaticZenRule
का योगदान देना होगा. सिस्टम, इस योगदान को सबसे ज़्यादा पाबंदी वाली मौजूदा नीति के साथ मिलाकर, ग्लोबल नीति बनाता है. पहले जिन मौजूदा एपीआई कॉल से ग्लोबल स्टेटस (setInterruptionFilter
,
setNotificationPolicy
) पर असर पड़ा था उनसे, एक 'असहमति' वाला AutomaticZenRule
पैरामीटर बनता है या अपडेट होता है. यह पैरामीटर, उन एपीआई कॉल के कॉल-साइकल के हिसाब से टॉगल किया जाता है.
ध्यान दें कि इस बदलाव का असर सिर्फ़ तब पड़ता है, जब ऐप्लिकेशन setInterruptionFilter(INTERRUPTION_FILTER_ALL)
को कॉल कर रहा हो और उसे उम्मीद हो कि उस कॉल से, AutomaticZenRule
को बंद किया जा सकेगा. AutomaticZenRule
को पहले उसके मालिकों ने चालू किया था.
OpenJDK API में हुए बदलाव
Android 15 में, Android की मुख्य लाइब्रेरी को रीफ़्रेश करने का काम जारी है, ताकि इसे OpenJDK LTS के नए रिलीज़ की सुविधाओं के साथ अलाइन किया जा सके.
इनमें से कुछ बदलावों का असर, Android 15 (एपीआई लेवल 35) को टारगेट करने वाले ऐप्लिकेशन के साथ काम करने की सुविधा पर पड़ सकता है:
स्ट्रिंग फ़ॉर्मैटिंग एपीआई में बदलाव: इन
String.format()
औरFormatter.format()
एपीआई का इस्तेमाल करते समय, आर्ग्युमेंट इंडेक्स, फ़्लैग, चौड़ाई, और सटीक वैल्यू की पुष्टि अब ज़्यादा सख्त तरीके से की जाती है:String.format(String, Object[])
String.format(Locale, String, Object[])
Formatter.format(String, Object[])
Formatter.format(Locale, String, Object[])
उदाहरण के लिए, आर्ग्युमेंट के इंडेक्स के तौर पर 0 का इस्तेमाल करने पर (फ़ॉर्मैट स्ट्रिंग में
%0
), यह अपवाद दिखता है:IllegalFormatArgumentIndexException: Illegal format argument index = 0
इस मामले में, फ़ॉर्मैट स्ट्रिंग में 1 (
%1
) के आर्ग्युमेंट इंडेक्स का इस्तेमाल करके, समस्या को ठीक किया जा सकता है.Arrays.asList(...).toArray()
के कॉम्पोनेंट टाइप में बदलाव:Arrays.asList(...).toArray()
का इस्तेमाल करने पर, नतीजे के ऐरे का कॉम्पोनेंट टाइप अबObject
है, न कि ऐरे के एलिमेंट का टाइप. इसलिए, यह कोडClassCastException
दिखाता है:String[] elements = (String[]) Arrays.asList("one", "two").toArray();
इस मामले में, नतीजे के ऐरे में
String
को कॉम्पोनेंट टाइप के तौर पर बनाए रखने के लिए,Collection.toArray(Object[])
का इस्तेमाल किया जा सकता है:String[] elements = Arrays.asList("two", "one").toArray(new String[0]);
भाषा कोड को मैनेज करने के तरीके में बदलाव:
Locale
API का इस्तेमाल करते समय, हिब्रू, येहुदी, और इंडोनेशियन भाषा के कोड अब पुराने फ़ॉर्म (हिब्रू:iw
, येहुदी:ji
, और इंडोनेशियन:in
) में बदले नहीं जाते. इनमें से किसी एक स्थानीय भाषा के लिए भाषा कोड बताते समय, ISO 639-1 के कोड का इस्तेमाल करें (हिब्रू:he
, येहुदी:yi
, और इंडोनेशियन:id
).रैंडम int सीक्वेंस में बदलाव: https://bugs.openjdk.org/browse/JDK-8301574 में किए गए बदलावों के बाद, यहां दिए गए
Random.ints()
तरीके अब संख्याओं का एक अलग क्रम दिखाते हैं, जबकिRandom.nextInt()
तरीके ऐसा नहीं करते:आम तौर पर, इस बदलाव से ऐप्लिकेशन के काम करने के तरीके पर कोई असर नहीं पड़ना चाहिए. हालांकि, आपके कोड को यह उम्मीद नहीं करनी चाहिए कि
Random.ints()
तरीकों से जनरेट किया गया क्रम,Random.nextInt()
से मैच करेगा.
Android 15 (एपीआई लेवल 35) का इस्तेमाल करने के लिए, अपने ऐप्लिकेशन के बिल्ड कॉन्फ़िगरेशन में compileSdk
को अपडेट करने के बाद, नए SequencedCollection
एपीआई से आपके ऐप्लिकेशन के काम करने के तरीके पर असर पड़ सकता है:
kotlin-stdlib
मेंMutableList.removeFirst()
औरMutableList.removeLast()
एक्सटेंशन फ़ंक्शन के साथ टकरावJava में
List
टाइप, Kotlin मेंMutableList
टाइप पर मैप किया जाता है. Android 15 (एपीआई लेवल 35) मेंList.removeFirst()
औरList.removeLast()
एपीआई को शामिल किया गया है. इसलिए, Kotlin कंपाइलर,list.removeFirst()
जैसे फ़ंक्शन कॉल कोkotlin-stdlib
में मौजूद एक्सटेंशन फ़ंक्शन के बजाय, नएList
एपीआई के लिए स्टैटिक तौर पर हल करता है.अगर किसी ऐप्लिकेशन को
compileSdk
को35
पर सेट करके औरminSdk
को34
या उससे पहले के वर्शन पर सेट करके फिर से कंपाइल किया जाता है और फिर उस ऐप्लिकेशन को Android 14 और उससे पहले के वर्शन पर चलाया जाता है, तो रनटाइम के दौरान गड़बड़ी का मैसेज दिखता है:java.lang.NoSuchMethodError: No virtual method removeFirst()Ljava/lang/Object; in class Ljava/util/ArrayList;
Android Gradle प्लग इन में मौजूद
NewApi
lint विकल्प, एपीआई के इन नए इस्तेमालों का पता लगा सकता है../gradlew lint
MainActivity.kt:41: Error: Call requires API level 35 (current min is 34): java.util.List#removeFirst [NewApi] list.removeFirst()रनटाइम अपवाद और लिंट की गड़बड़ियों को ठीक करने के लिए, Kotlin में
removeFirst()
औरremoveLast()
फ़ंक्शन कॉल को क्रमशःremoveAt(0)
औरremoveAt(list.lastIndex)
से बदला जा सकता है. अगर Android Studio Ladybug | 2024.1.3 या इसके बाद के वर्शन का इस्तेमाल किया जा रहा है, तो इन गड़बड़ियों को तुरंत ठीक करने का विकल्प भी मिलता है.अगर लिंट करने का विकल्प बंद है, तो
@SuppressLint("NewApi")
औरlintOptions { disable 'NewApi' }
को हटाएं.Java में अन्य तरीकों के साथ टकराव
मौजूदा टाइप में नए तरीके जोड़े गए हैं. उदाहरण के लिए,
List
औरDeque
. हो सकता है कि ये नए तरीके, दूसरे इंटरफ़ेस और क्लास में मौजूद, एक ही नाम और आर्ग्युमेंट टाइप वाले तरीकों के साथ काम न करें. अगर किसी मेथड के सिग्नेचर में, काम न करने वाले सिग्नेचर का इस्तेमाल किया गया है, तोjavac
कंपाइलर, बिल्ड के समय गड़बड़ी का मैसेज दिखाता है. उदाहरण के लिए:गड़बड़ी का पहला उदाहरण:
javac MyList.java
MyList.java:135: error: removeLast() in MyList cannot implement removeLast() in List public void removeLast() { ^ return type void is not compatible with Object where E is a type-variable: E extends Object declared in interface Listगड़बड़ी का दूसरा उदाहरण:
javac MyList.java
MyList.java:7: error: types Deque<Object> and List<Object> are incompatible; public class MyList implements List<Object>, Deque<Object> { both define reversed(), but with unrelated return types 1 errorतीसरी गड़बड़ी का उदाहरण:
javac MyList.java
MyList.java:43: error: types List<E#1> and MyInterface<E#2> are incompatible; public static class MyList implements List<Object>, MyInterface<Object> { class MyList inherits unrelated defaults for getFirst() from types List and MyInterface where E#1,E#2 are type-variables: E#1 extends Object declared in interface List E#2 extends Object declared in interface MyInterface 1 errorबिल्ड से जुड़ी इन गड़बड़ियों को ठीक करने के लिए, इन इंटरफ़ेस को लागू करने वाली क्लास को, काम करने वाले रिटर्न टाइप के साथ, तरीके को बदलना चाहिए. उदाहरण के लिए:
@Override public Object getFirst() { return List.super.getFirst(); }
सुरक्षा
Android 15 में ऐसे बदलाव किए गए हैं जिनसे सिस्टम की सुरक्षा को बेहतर बनाया जा सके. इससे ऐप्लिकेशन और उपयोगकर्ताओं को नुकसान पहुंचाने वाले ऐप्लिकेशन से बचाने में मदद मिलती है.
पाबंदी वाले TLS वर्शन
Android 15 限制了对 TLS 版本 1.0 和 1.1 的使用。这些版本之前已在 Android 中被弃用,但现在不允许面向 Android 15 的应用使用。
बैकग्राउंड में सुरक्षित गतिविधि शुरू होना
Android 15, उपयोगकर्ताओं को नुकसान पहुंचाने वाले ऐप्लिकेशन से सुरक्षित रखता है. साथ ही, उन्हें अपने डिवाइसों पर ज़्यादा कंट्रोल देता है. इसके लिए, इसमें ऐसे बदलाव किए गए हैं जिनसे बैकग्राउंड में चल रहे नुकसान पहुंचाने वाले ऐप्लिकेशन, दूसरे ऐप्लिकेशन को फ़ोरग्राउंड पर नहीं ला पाते. साथ ही, वे अपने ऐक्सेस लेवल को बढ़ा नहीं पाते और उपयोगकर्ता के इंटरैक्शन का गलत इस्तेमाल नहीं कर पाते. इस तारीख से बैकग्राउंड में होने वाली गतिविधि के लॉन्च पर पाबंदी लगी हुई है Android 10 (एपीआई लेवल 29).
उन ऐप्लिकेशन को लॉन्च करने से रोकें जो स्टैक में मौजूद मुख्य यूआईडी से मेल नहीं खाते
नुकसान पहुंचाने वाले ऐप्लिकेशन उसी टास्क में किसी अन्य ऐप्लिकेशन की गतिविधि को लॉन्च कर सकते हैं. इसके बाद,
अपने-आप को ओवरले कर लेता है, जिससे उस ऐप्लिकेशन के होने का भ्रम पैदा होता है. यह "टास्क
हाइजैकिंग" हमले से वीडियो को बैकग्राउंड में लॉन्च करने की मौजूदा पाबंदियों को बायपास कर दिया जाता है. ऐसा इसलिए, क्योंकि
उसी टास्क में होता हो जो उपयोगकर्ताओं को दिखता है. इस जोखिम को कम करने के लिए, Android 15
यह फ़्लैग उन ऐप्लिकेशन को लॉन्च होने से रोकता है जो स्टैक में मौजूद मुख्य यूआईडी से मेल नहीं खाते
गतिविधियां. अपने ऐप्लिकेशन की सभी गतिविधियों में ऑप्ट इन करने के लिए,
allowCrossUidActivitySwitchFromBelow
विशेषता AndroidManifest.xml
फ़ाइल में:
<application android:allowCrossUidActivitySwitchFromBelow="false" >
सुरक्षा से जुड़े नए उपाय तब चालू किए जा सकते हैं, जब:
- लॉन्च करने वाला ऐप्लिकेशन, Android 15 को टारगेट करता हो.
- टास्क स्टैक में सबसे ऊपर मौजूद ऐप्लिकेशन, Android 15 को टारगेट करता है.
- दिखने वाली किसी भी गतिविधि को, नई सुरक्षा सुविधाओं में ऑप्ट-इन किया गया है
अगर सुरक्षा उपाय चालू हैं, तो ऐप्लिकेशन ऐप्लिकेशन, जो अपना टास्क पूरा कर लेता है, वह आखिरी बार दिखने वाला ऐप्लिकेशन होता है.
अन्य बदलाव
यूआईडी मैच करने से जुड़ी पाबंदी के अलावा, इन अन्य बदलावों को भी शामिल किया गया है:
PendingIntent
क्रिएटर्स को बदलकर, बैकग्राउंड में की जाने वाली गतिविधियों को ब्लॉक करें. इसके लिए यह तरीका अपनाएं: डिफ़ॉल्ट बनाएं. इससे ऐप्लिकेशन को ग़लती सेPendingIntent
, जिसका इस्तेमाल नुकसान पहुंचाने वाले लोग या ग्रुप गलत इस्तेमाल कर सकते हैं.- किसी ऐप्लिकेशन को तब तक फ़ोरग्राउंड में न लाएं, जब तक उसे भेजने वाला
PendingIntent
व्यक्ति न हो इसकी अनुमति देता है. इस बदलाव का मकसद, नुकसान पहुंचाने वाले ऐप्लिकेशन को बैकग्राउंड में गतिविधियां शुरू करने की सुविधा का गलत इस्तेमाल करने से रोकना है. डिफ़ॉल्ट रूप से, ऐप्लिकेशन टास्क स्टैक को फ़ोरग्राउंड में लाने की अनुमति है, जब तक कि क्रिएटर अनुमति न दे बैकग्राउंड में होने वाली गतिविधि को लॉन्च करने के खास अधिकार या भेजने वाले के पास बैकग्राउंड में होने वाली गतिविधि है खास अधिकार लॉन्च करना. - कंट्रोल करें कि किसी टास्क स्टैक की सबसे लोकप्रिय गतिविधि से टास्क पूरा कैसे हो सकता है. अगर टॉप ऐक्टिविटी किसी टास्क को पूरा करती है. Android उसी टास्क पर वापस चला जाएगा पिछली बार सक्रिय. अगर कोई नॉन-टॉप गतिविधि, टास्क पूरा कर लेती है, तो Android होम स्क्रीन पर वापस जाने के लिए; यह इस नॉन-टॉप की पूरी प्रोसेस को ब्लॉक नहीं करेगा गतिविधि.
- अन्य ऐप्लिकेशन की आर्बिट्रेरी गतिविधियों को अपने ऐप्लिकेशन में लॉन्च होने से रोकें टास्क के लिए सबमिट किया गया है. इस बदलाव से, नुकसान पहुंचाने वाले ऐप्लिकेशन, उपयोगकर्ताओं को फ़िशिंग से बचा पाएंगे. ऐसा, अन्य ऐप्लिकेशन से होने वाली गतिविधियों की नकल करके किया जाएगा.
- न दिखने वाली विंडो को बैकग्राउंड में होने वाली गतिविधि में शामिल होने से रोकें लॉन्च के बारे में ज़्यादा जानें. इससे, नुकसान पहुंचाने वाले ऐप्लिकेशन को बैकग्राउंड का गलत इस्तेमाल करने से रोका जा सकता है गतिविधि लॉन्च होती है. इसकी मदद से, लोगों को अनचाहा या नुकसान पहुंचाने वाला कॉन्टेंट दिखाया जाता है.
ज़्यादा सुरक्षित इंटेंट
Android 15 में, इंटेंट को ज़्यादा सुरक्षित और बेहतर बनाने के लिए, सुरक्षा से जुड़े नए विकल्प जोड़े गए हैं. हालांकि, इनका इस्तेमाल करना ज़रूरी नहीं है. इन बदलावों का मकसद, संभावित जोखिमों को रोकना और उन इंटेंट का गलत इस्तेमाल करना है जिनका इस्तेमाल नुकसान पहुंचाने वाले ऐप्लिकेशन कर सकते हैं. Android 15 में इंटेंट की सुरक्षा में दो मुख्य सुधार किए गए हैं:
- टारगेट इंटेंट-फ़िल्टर से मैच करना: किसी खास कॉम्पोनेंट को टारगेट करने वाले इंटेंट, टारगेट के इंटेंट-फ़िल्टर की खास बातों से सटीक तौर पर मैच होने चाहिए. अगर आपकी ओर से किसी दूसरे ऐप्लिकेशन की गतिविधि को लॉन्च करने का अनुरोध भेजा जाता है, तो टारगेट इंटेंट कॉम्पोनेंट को, सूचना पाने वाली गतिविधि के एलान किए गए इंटेंट फ़िल्टर के साथ अलाइन होना चाहिए.
- इंटेंट में कार्रवाइयां होनी चाहिए: बिना कार्रवाई वाले इंटेंट, अब किसी भी इंटेंट-फ़िल्टर से मैच नहीं करेंगे. इसका मतलब है कि गतिविधियों या सेवाओं को शुरू करने के लिए इस्तेमाल किए गए इंटेंट में, साफ़ तौर पर बताई गई कार्रवाई होनी चाहिए.
यह देखने के लिए कि आपका ऐप्लिकेशन इन बदलावों का जवाब कैसे देता है, अपने ऐप्लिकेशन में StrictMode
का इस्तेमाल करें. Intent
के इस्तेमाल से जुड़े उल्लंघनों के बारे में ज़्यादा जानकारी वाले लॉग देखने के लिए, यह तरीका जोड़ें:
Kotlin
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() .detectUnsafeIntentLaunch() .build() ) }
Java
public void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() .detectUnsafeIntentLaunch() .build()); }
उपयोगकर्ता अनुभव और सिस्टम यूज़र इंटरफ़ेस (यूआई)
Android 15 में कुछ बदलाव किए गए हैं. इनका मकसद, उपयोगकर्ताओं को ज़्यादा बेहतर और आसान अनुभव देना है.
विंडो इनसेट में बदलाव
Android 15 中与窗口内边距相关的两项变更:默认强制执行边到边,此外还有配置变更,例如系统栏的默认配置。
全面实施政策
अगर ऐप्लिकेशन, Android 15 (एपीआई लेवल 35) को टारगेट कर रहा है, तो Android 15 वाले डिवाइसों पर ऐप्लिकेशन डिफ़ॉल्ट रूप से एज-टू-एज दिखते हैं.

यह एक ऐसा बदलाव है जिससे आपके ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) पर बुरा असर पड़ सकता है. इन बदलावों का असर यूज़र इंटरफ़ेस (यूआई) के इन हिस्सों पर पड़ेगा:
- जेस्चर हैंडल वाला नेविगेशन बार
- डिफ़ॉल्ट रूप से पारदर्शी होता है.
- बॉटम ऑफ़सेट बंद है, ताकि जब तक इनसेट लागू नहीं किए जाते, तब तक कॉन्टेंट सिस्टम नेविगेशन बार के पीछे दिखे.
setNavigationBarColor
औरR.attr#navigationBarColor
का इस्तेमाल अब नहीं किया जा सकता. इनसे जेस्चर नेविगेशन पर कोई असर नहीं पड़ता.setNavigationBarContrastEnforced
औरR.attr#navigationBarContrastEnforced
से, जेस्चर नेविगेशन पर अब भी कोई असर नहीं पड़ेगा.
- तीन बटन वाला नेविगेशन
- ओपैसिटी डिफ़ॉल्ट रूप से 80% पर सेट होती है. साथ ही, इसका रंग विंडो के बैकग्राउंड से मैच करता है.
- बॉटम ऑफ़सेट की सुविधा बंद है, ताकि जब तक इनसेट लागू नहीं किए जाते, तब तक कॉन्टेंट सिस्टम नेविगेशन बार के पीछे दिखे.
setNavigationBarColor
औरR.attr#navigationBarColor
, डिफ़ॉल्ट रूप से विंडो के बैकग्राउंड से मैच करने के लिए सेट होते हैं. यह डिफ़ॉल्ट विकल्प लागू करने के लिए, विंडो का बैकग्राउंड, रंग में ड्रॉ किए जा सकने वाला होना चाहिए. इस एपीआई का इस्तेमाल अब नहीं किया जा सकता. हालांकि, तीन बटन वाले नेविगेशन पर इसका असर अब भी पड़ता है.setNavigationBarContrastEnforced
औरR.attr#navigationBarContrastEnforced
डिफ़ॉल्ट रूप से 'सही' पर सेट होते हैं. इससे तीन बटन वाले नेविगेशन में, 80% अपारदर्शी बैकग्राउंड जुड़ जाता है.
- स्टेटस बार
- डिफ़ॉल्ट रूप से पारदर्शी होता है.
- टॉप ऑफ़सेट बंद है, ताकि जब तक इनसेट लागू न हों, तब तक कॉन्टेंट स्टेटस बार के पीछे दिखे.
setStatusBarColor
औरR.attr#statusBarColor
का इस्तेमाल बंद कर दिया गया है. इनका Android 15 पर कोई असर नहीं पड़ेगा.setStatusBarContrastEnforced
औरR.attr#statusBarContrastEnforced
का इस्तेमाल अब नहीं किया जा सकता. हालांकि, इनका असर अब भी Android 15 पर पड़ता है.
- कटआउट दिखाएं
- नॉन-फ़्लोटिंग विंडो के
layoutInDisplayCutoutMode
की वैल्यूLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
होनी चाहिए.SHORT_EDGES
,NEVER
, औरDEFAULT
कोALWAYS
के तौर पर समझा जाता है, ताकि उपयोगकर्ताओं को डिसप्ले के कटी हुई जगह की वजह से काला बार न दिखे और डिसप्ले किनारे से किनारे तक दिखे.
- नॉन-फ़्लोटिंग विंडो के
नीचे दिए गए उदाहरण में, Android 15 (एपीआई लेवल 35) को टारगेट करने से पहले और बाद के साथ-साथ, इनसेट लागू करने से पहले और बाद के ऐप्लिकेशन को दिखाया गया है.



अगर आपका ऐप्लिकेशन पहले से ही पूरे डिवाइस के साइज़ का है, तो क्या देखना चाहिए
अगर आपका ऐप्लिकेशन पहले से ही एज-टू-एज है और उसमें इनसेट लागू हैं, तो आपके ऐप्लिकेशन पर इन स्थितियों को छोड़कर, ज़्यादातर मामलों में कोई असर नहीं पड़ेगा. हालांकि, भले ही आपको लगता हो कि आपके ऐप्लिकेशन पर इसका कोई असर नहीं पड़ा है, फिर भी हमारा सुझाव है कि आप अपने ऐप्लिकेशन की जांच करें.
- आपके पास ऐसी विंडो है जो फ़्लोटिंग नहीं है. जैसे,
Activity
, जोLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
के बजायSHORT_EDGES
,NEVER
याDEFAULT
का इस्तेमाल करती है. अगर आपका ऐप्लिकेशन लॉन्च होने पर क्रैश हो जाता है, तो ऐसा स्प्लैशस्क्रीन की वजह से हो सकता है. core splashscreen डिपेंडेंसी को 1.2.0-alpha01 पर या उसके बाद के वर्शन पर अपग्रेड किया जा सकता है. इसके अलावा,window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always
को सेट भी किया जा सकता है. - हो सकता है कि कुछ स्क्रीन पर यूज़र इंटरफ़ेस (यूआई) न दिखे और उन पर कम ट्रैफ़िक हो. पुष्टि करें कि कम देखी गई इन स्क्रीन पर, यूज़र इंटरफ़ेस (यूआई) नहीं छिपा है. कम ट्रैफ़िक वाली स्क्रीन में ये शामिल हैं:
- ऑनबोर्डिंग या साइन-इन स्क्रीन
- सेटिंग पेज
अगर आपका ऐप्लिकेशन पहले से ही पूरे डिवाइस के साइज़ का नहीं है, तो क्या देखना चाहिए
अगर आपका ऐप्लिकेशन पहले से ही एज-टू-एज नहीं है, तो हो सकता है कि आप पर इसका असर पड़े. पहले से ही पूरे डिवाइस के स्क्रीन साइज़ के हिसाब से डिज़ाइन किए गए ऐप्लिकेशन के अलावा, आपको इन बातों का भी ध्यान रखना चाहिए:
- अगर आपका ऐप्लिकेशन, कॉम्पोनेंट बनाने के लिए Material 3 कॉम्पोनेंट (
androidx.compose.material3
) का इस्तेमाल करता है, जैसे किTopAppBar
,BottomAppBar
, औरNavigationBar
, तो इन कॉम्पोनेंट पर कोई असर नहीं पड़ेगा, क्योंकि ये इनसेट को अपने-आप मैनेज करते हैं. - अगर आपका ऐप्लिकेशन, Compose में Material 2 कॉम्पोनेंट (
androidx.compose.material
) का इस्तेमाल कर रहा है, तो ये कॉम्पोनेंट अपने-आप इनसेट मैनेज नहीं करते. हालांकि, इनसेट का ऐक्सेस पाकर, उन्हें मैन्युअल तरीके से लागू किया जा सकता है. androidx.compose.material 1.6.0 और उसके बाद के वर्शन में,windowInsets
पैरामीटर का इस्तेमाल करके,BottomAppBar
,TopAppBar
,BottomNavigation
, औरNavigationRail
के लिए इनसेट को मैन्युअल तरीके से लागू करें. इसी तरह,Scaffold
के लिएcontentWindowInsets
पैरामीटर का इस्तेमाल करें. - अगर आपका ऐप्लिकेशन व्यू और Material Components (
com.google.android.material
) का इस्तेमाल करता है, तोBottomNavigationView
,BottomAppBar
,NavigationRailView
याNavigationView
जैसे ज़्यादातर व्यू-आधारित Material Components, इनसेट को मैनेज करते हैं और इसके लिए किसी और काम की ज़रूरत नहीं होती. हालांकि,AppBarLayout
का इस्तेमाल करने पर, आपकोandroid:fitsSystemWindows="true"
जोड़ना होगा. - कस्टम कॉम्पोज़ेबल के लिए, इनसेट को पैडिंग के तौर पर मैन्युअल तरीके से लागू करें. अगर आपका कॉन्टेंट
Scaffold
में है, तोScaffold
पैडिंग वैल्यू का इस्तेमाल करके इनसेट का इस्तेमाल किया जा सकता है. इसके अलावा,WindowInsets
में से किसी एक का इस्तेमाल करके पैडिंग लागू करें. - अगर आपका ऐप्लिकेशन व्यू और
BottomSheet
,SideSheet
या कस्टम कंटेनर का इस्तेमाल कर रहा है, तोViewCompat.setOnApplyWindowInsetsListener
का इस्तेमाल करके पैडिंग लागू करें.RecyclerView
के लिए, इस लिसनर का इस्तेमाल करके पैडिंग लागू करें औरclipToPadding="false"
भी जोड़ें.
बैकग्राउंड में काम करने वाले ऐप्लिकेशन को कस्टम सुरक्षा देने के लिए, क्या-क्या देखना चाहिए
अगर आपके ऐप्लिकेशन को तीन बटन वाले नेविगेशन या स्टेटस बार के लिए, बैकग्राउंड की कस्टम सुरक्षा की सुविधा देनी है, तो आपके ऐप्लिकेशन को WindowInsets.Type#tappableElement()
का इस्तेमाल करके, सिस्टम बार के पीछे कोई कॉम्पोज़ेबल या व्यू डालना चाहिए. इससे, तीन बटन वाले नेविगेशन बार की ऊंचाई या WindowInsets.Type#statusBars
की जानकारी मिलती है.
एज-टू-एज के लिए अन्य संसाधन
इनसेट लागू करने के बारे में ज़्यादा जानने के लिए, एज-टू-एज व्यू और एज-टू-एज कॉम्पोज़ के दिशा-निर्देश देखें.
बंद किए गए एपीआई
यहां दिए गए एपीआई बंद कर दिए गए हैं, लेकिन बंद नहीं किए गए हैं:
R.attr#enforceStatusBarContrast
R.attr#navigationBarColor
(80% ऐल्फ़ा वाले तीन बटन वाले नेविगेशन के लिए)Window#isStatusBarContrastEnforced
Window#setNavigationBarColor
(तीन बटन वाले नेविगेशन के लिए, 80% ऐल्फ़ा के साथ)Window#setStatusBarContrastEnforced
यहां दिए गए एपीआई बंद कर दिए गए हैं:
R.attr#navigationBarColor
(जेस्चर वाले नेविगेशन के लिए)R.attr#navigationBarDividerColor
R.attr#statusBarColor
Window#setDecorFitsSystemWindows
Window#getNavigationBarColor
Window#getNavigationBarDividerColor
Window#getStatusBarColor
Window#setNavigationBarColor
(जेस्चर वाले नेविगेशन के लिए)Window#setNavigationBarDividerColor
Window#setStatusBarColor
稳定配置
如果您的应用以 Android 15(API 级别 35)或更高版本为目标平台,Configuration
不再排除系统栏。如果您使用 Configuration
类中的屏幕尺寸进行布局计算,则应根据需要将其替换为更好的替代方案,例如适当的 ViewGroup
、WindowInsets
或 WindowMetricsCalculator
。
Configuration
从 API 1 开始提供。它通常从 Activity.onConfigurationChanged
中获取。它提供窗口密度、屏幕方向和尺寸等信息。从 Configuration
返回的窗口大小的一个重要特征是,它之前会排除系统栏。
配置大小通常用于资源选择(例如 /res/layout-h500dp
),这仍然是一个有效的用例。不过,我们一直不建议将其用于布局计算。如果您在使用此功能,请立即停止使用。您应根据自己的用例,将 Configuration
的使用替换为更合适的用法。
如果您使用它来计算布局,请使用适当的 ViewGroup
,例如 CoordinatorLayout
或 ConstraintLayout
。如果您使用它来确定系统侧边栏的高度,请使用 WindowInsets
。如果您想知道应用窗口的当前大小,请使用 computeCurrentWindowMetrics
。
以下列表介绍了受此变更影响的字段:
Configuration.screenWidthDp
和screenHeightDp
尺寸不再排除系统栏。Configuration.smallestScreenWidthDp
会间接受到对screenWidthDp
和screenHeightDp
的更改的影响。- 在接近方形的设备上,
Configuration.orientation
会间接受到对screenWidthDp
和screenHeightDp
所做的更改的影响。 Display.getSize(Point)
会间接受到Configuration
中更改的影响。从 API 级别 30 开始,此方法已被弃用。- 从 API 级别 33 开始,
Display.getMetrics()
就已经这样运作了。
elegantTextHeight एट्रिब्यूट की वैल्यू डिफ़ॉल्ट रूप से 'सही' पर सेट होती है
Android 15 (एपीआई लेवल 35) को टारगेट करने वाले ऐप्लिकेशन के लिए, elegantTextHeight
TextView
एट्रिब्यूट डिफ़ॉल्ट रूप से true
हो जाता है. इससे, डिफ़ॉल्ट रूप से इस्तेमाल किए जाने वाले कॉम्पैक्ट फ़ॉन्ट की जगह, कुछ ऐसी स्क्रिप्ट का इस्तेमाल किया जाता है जिनमें बड़ी वर्टिकल मेट्रिक होती हैं. इन मेट्रिक को पढ़ना ज़्यादा आसान होता है.
कॉम्पैक्ट फ़ॉन्ट को लेआउट के बीच में रुकावट आने से रोकने के लिए लॉन्च किया गया था. Android 13 (एपीआई लेवल 33), fallbackLineSpacing
एट्रिब्यूट का इस्तेमाल करके, टेक्स्ट लेआउट की वर्टिकल ऊंचाई को बढ़ाकर, इनमें से कई रुकावटों को रोकता है.
Android 15 में, कॉम्पैक्ट फ़ॉन्ट अब भी सिस्टम में मौजूद है. इसलिए, आपका ऐप्लिकेशन पहले जैसा व्यवहार पाने के लिए, elegantTextHeight
को false
पर सेट कर सकता है. हालांकि, आने वाले समय में रिलीज़ होने वाले वर्शन में, इसकी सुविधा काम नहीं करेगी. इसलिए, अगर आपका ऐप्लिकेशन इन स्क्रिप्ट के साथ काम करता है: ऐरेबिक, लाओ, म्यांमार, तमिल, गुजराती, कन्नड़, मलयालम, उड़ीया, तेलुगु या थाई, तो elegantTextHeight
को true
पर सेट करके अपने ऐप्लिकेशन की जांच करें.

elegantTextHeight
Android 14 (एपीआई लेवल 34) और उससे पहले के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए व्यवहार.
elegantTextHeight
Android 15 को टारगेट करने वाले ऐप्लिकेशन के लिए व्यवहार.अक्षरों के जटिल आकार के लिए, TextView की चौड़ाई में बदलाव होता है
在以前的 Android 版本中,某些具有复杂形状的手写字体或语言可能会在上一个或下一个字符的区域绘制字母。在某些情况下,此类字母会在开头或结尾处被剪裁。从 Android 15 开始,TextView
会分配宽度,以便为此类字母绘制足够的空间,并允许应用请求向左额外添加内边距以防止剪裁。
由于此更改会影响 TextView
确定宽度的方式,因此如果应用以 Android 15(API 级别 35)或更高版本为目标平台,TextView
会默认分配更多宽度。您可以通过对 TextView
调用 setUseBoundsForWidth
API 来启用或停用此行为。
由于添加左内边距可能会导致现有布局未对齐,因此默认情况下不会添加内边距,即使以 Android 15 或更高版本为目标平台的应用也是如此。不过,您可以通过调用 setShiftDrawingOffsetForStartOverhang
添加额外的内边距以防止剪裁。
以下示例展示了这些更改如何改进某些字体和语言的文本布局。

<TextView android:fontFamily="cursive" android:text="java" />

<TextView android:fontFamily="cursive" android:text="java" android:useBoundsForWidth="true" android:shiftDrawingOffsetForStartOverhang="true" />

<TextView android:text="คอมพิวเตอร์" />

<TextView android:text="คอมพิวเตอร์" android:useBoundsForWidth="true" android:shiftDrawingOffsetForStartOverhang="true" />
EditText के लिए, स्थानीय भाषा के हिसाब से डिफ़ॉल्ट लाइन की ऊंचाई
Android के पिछले वर्शन में, टेक्स्ट लेआउट, टेक्स्ट की ऊंचाई को बढ़ा देता था, ताकि मौजूदा स्थानीय भाषा से मैच करने वाले फ़ॉन्ट की लाइन की ऊंचाई पूरी की जा सके. उदाहरण के लिए, अगर कॉन्टेंट जैपनीज़ में था, तो टेक्स्ट की ऊंचाई थोड़ी ज़्यादा हो गई, क्योंकि जैपनीज़ फ़ॉन्ट की लाइन की ऊंचाई, लैटिन फ़ॉन्ट की लाइन की ऊंचाई से थोड़ी ज़्यादा होती है. हालांकि, लाइन हाइट में इन अंतरों के बावजूद, इस्तेमाल किए जा रहे स्थानीय भाषा के बावजूद, EditText
एलिमेंट का साइज़ एक जैसा था, जैसा कि इस इमेज में दिखाया गया है:

EditText
एलिमेंट दिखाने वाले तीन बॉक्स, जिनमें इंग्लिश (en), जैपनीज़ (ja), और बर्मीज़ (my) भाषा का टेक्स्ट हो सकता है. EditText
की ऊंचाई एक जैसी है, भले ही इन भाषाओं की लाइन की ऊंचाई एक-दूसरे से अलग हो.Android 15 (एपीआई लेवल 35) को टारगेट करने वाले ऐप्लिकेशन के लिए, EditText
के लिए कम से कम लाइन हाइट तय की गई है. इससे, तय की गई लोकेल के रेफ़रंस फ़ॉन्ट से मैच करने में मदद मिलती है. इसकी जानकारी इस इमेज में दी गई है:

EditText
एलिमेंट दिखाने वाले तीन बॉक्स, जिनमें इंग्लिश (en), जैपनीज़ (ja), और बर्मीज़ (my) भाषा का टेक्स्ट हो सकता है. EditText
की ऊंचाई में अब इन भाषाओं के फ़ॉन्ट के लिए, डिफ़ॉल्ट लाइन की ऊंचाई को शामिल करने के लिए स्पेस शामिल है.ज़रूरत पड़ने पर, आपका ऐप्लिकेशन useLocalePreferredLineHeightForMinimum
एट्रिब्यूट को false
पर सेट करके, पहले जैसा व्यवहार वापस ला सकता है. साथ ही, आपका ऐप्लिकेशन Kotlin और Java में setMinimumFontMetrics
एपीआई का इस्तेमाल करके, कस्टम मिनिमम वर्टिकल मेट्रिक सेट कर सकता है.
कैमरा और मीडिया
Android 15 में, कैमरे और मीडिया के व्यवहार में ये बदलाव किए गए हैं. ये बदलाव, Android 15 या इसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए किए गए हैं.
ऑडियो फ़ोकस का अनुरोध करने से जुड़ी पाबंदियां
Android 15 (एपीआई लेवल 35) को टारगेट करने वाले ऐप्लिकेशन को ऑडियो फ़ोकस का अनुरोध करने के लिए, टॉप ऐप्लिकेशन या फ़ोरग्राउंड सेवा के तौर पर चलना होगा. अगर कोई ऐप्लिकेशन इनमें से किसी एक ज़रूरी शर्त को पूरा न करने पर फ़ोकस का अनुरोध करता है, तो कॉल AUDIOFOCUS_REQUEST_FAILED
दिखाता है.
ऑडियो फ़ोकस के बारे में ज़्यादा जानने के लिए, ऑडियो फ़ोकस मैनेज करें पर जाएं.
SDK टूल के अलावा अन्य चीज़ों पर लगी पाबंदियां अपडेट की गईं
Android 15 包含更新后的受限非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。在限制使用非 SDK 接口之前,我们会尽可能确保有可用的公开替代方案。
如果您的应用并非以 Android 15 为目标平台,其中一些变更可能不会立即对您产生影响。不过,虽然您的应用可以访问一些非 SDK 接口(具体取决于应用的目标 API 级别),但如果您使用任何非 SDK 方法或字段,应用无法运行的风险始终会很高。
如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用,进行确认。如果您的应用依赖于非 SDK 接口,您应该开始计划迁移到 SDK 替代方案。不过,我们知道某些应用具有使用非 SDK 接口的有效用例。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,则应请求新的公共 API。
Android के इस वर्शन में हुए बदलावों के बारे में ज़्यादा जानने के लिए, Android 15 में, SDK टूल के अलावा अन्य इंटरफ़ेस से जुड़ी पाबंदियों में हुए अपडेट देखें. आम तौर पर, SDK टूल के बाहर के इंटरफ़ेस के बारे में ज़्यादा जानने के लिए, SDK टूल के बाहर के इंटरफ़ेस पर लगी पाबंदियां देखें.