Android 14 में, पिछले वर्शन की तरह ही कुछ ऐसे बदलाव किए गए हैं जो आपके ऐप्लिकेशन पर असर डाल सकते हैं. यहां दिए गए बदलाव, सिर्फ़ उन ऐप्लिकेशन पर लागू होते हैं जो Android 14 (एपीआई लेवल 34) या इसके बाद के वर्शन को टारगेट कर रहे हैं. अगर आपका ऐप्लिकेशन, Android 14 या इसके बाद के वर्शन को टारगेट कर रहा है, तो आपको अपने ऐप्लिकेशन में बदलाव करके, इन बदलावों के हिसाब से काम करने की सुविधा जोड़नी चाहिए.
साथ ही, आपको उन बदलावों की सूची भी देखनी चाहिए जो Android 14 पर चलने वाले सभी ऐप्लिकेशन
पर लागू होते हैं. भले ही,
ऐप्लिकेशन का targetSdkVersionकुछ भी हो.
मुख्य फ़ंक्शन
फ़ोरग्राउंड सेवा के टाइप की जानकारी देना ज़रूरी है
If your app targets Android 14 (API level 34) or higher, it must specify at least one foreground service type for each foreground service within your app. You should choose a foreground service type that represents your app's use case. The system expects foreground services that have a particular type to satisfy a particular use case.
If a use case in your app isn't associated with any of these types, it's strongly recommended that you migrate your logic to use WorkManager or user-initiated data transfer jobs.
BluetoothAdapter में BLUETOOTH_CONNECT अनुमति लागू करना
Android 14 enforces the BLUETOOTH_CONNECT permission when calling the
BluetoothAdapter getProfileConnectionState() method for apps targeting
Android 14 (API level 34) or higher.
This method already required the BLUETOOTH_CONNECT permission, but it was not
enforced. Make sure your app declares BLUETOOTH_CONNECT in your app's
AndroidManifest.xml file as shown in the following snippet and check that
a user has granted the permission before calling
getProfileConnectionState.
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
OpenJDK 17 के अपडेट
Android 14 में, Android की मुख्य लाइब्रेरी को अपडेट करने की प्रोसेस जारी है, ताकि इसे OpenJDK LTS के नए वर्शन की सुविधाओं के साथ अलाइन किया जा सके. इसमें, ऐप्लिकेशन और प्लैटफ़ॉर्म डेवलपर के लिए, लाइब्रेरी के अपडेट और Java 17 भाषा की सहायता, दोनों शामिल हैं.
इनमें से कुछ बदलावों का असर, ऐप्लिकेशन के साथ काम करने की सुविधा पर पड़ सकता है:
- रेगुलर एक्सप्रेशन में बदलाव: OpenJDK के सेमेंटेक्स को ज़्यादा बारीकी से फ़ॉलो करने के लिए, अब अमान्य ग्रुप रेफ़रंस का इस्तेमाल करने की अनुमति नहीं है. आपको ऐसे नए मामले दिख सकते हैं जहां
java.util.regex.Matcherक्लास सेIllegalArgumentExceptionट्रिगर होता है. इसलिए, रेगुलर एक्सप्रेशन का इस्तेमाल करने वाले हिस्सों के लिए, अपने ऐप्लिकेशन की जांच करना न भूलें. जांच के दौरान इस बदलाव को चालू या बंद करने के लिए, कंपैटिबिलिटी फ़्रेमवर्क टूल का इस्तेमाल करके,DISALLOW_INVALID_GROUP_REFERENCEफ़्लैग को टॉगल करें. - यूनीक आइडेंटिफ़ायर (यूयूआईडी) मैनेज करना:
java.util.UUID.fromString()तरीका अब इनपुट आर्ग्युमेंट की पुष्टि करते समय, ज़्यादा सख्त जांच करता है. इसलिए, आपको डेसिरियलाइज़ेशन के दौरानIllegalArgumentExceptionदिख सकता है. टेस्टिंग के दौरान इस बदलाव को चालू या बंद करने के लिए, साथ काम करने की सुविधा वाले फ़्रेमवर्क टूल का इस्तेमाल करके,ENABLE_STRICT_VALIDATIONफ़्लैग को टॉगल करें. - ProGuard से जुड़ी समस्याएं: कुछ मामलों में, ProGuard का इस्तेमाल करके अपने ऐप्लिकेशन को छोटा करने, उसे कोड करने, और ऑप्टिमाइज़ करने पर,
java.lang.ClassValueक्लास जोड़ने से समस्या आ सकती है. यह समस्या, Kotlin की एक लाइब्रेरी की वजह से होती है. यह लाइब्रेरी,Class.forName("java.lang.ClassValue")के क्लास दिखाने या न दिखाने के आधार पर, रनटाइम के व्यवहार में बदलाव करती है. अगर आपका ऐप्लिकेशन, रनटाइम के पुराने वर्शन के लिए डेवलप किया गया था और उसमेंjava.lang.ClassValueक्लास उपलब्ध नहीं थी, तो इन ऑप्टिमाइज़ेशन की वजह सेjava.lang.ClassValueसे ली गई क्लास सेcomputeValueतरीका हट सकता है.
JobScheduler, कॉलबैक और नेटवर्क के व्यवहार को बेहतर बनाता है
शुरुआत के बाद से, JobScheduler को उम्मीद है कि आपका ऐप्लिकेशन
onStartJob या onStopJob कुछ सेकंड में. Android 14 से पहले के वर्शन
अगर कोई काम ज़्यादा समय तक चलता है, तो काम रुक जाता है और बिना किसी आवाज़ के पूरा नहीं हो पाता.
अगर आपका ऐप्लिकेशन Android 14 (एपीआई लेवल 34) या उसके बाद के वर्शन को टारगेट करता है और मुख्य थ्रेड पर तय समय से ज़्यादा समय लेता है, तो ऐप्लिकेशन "onStartJob पर कोई जवाब नहीं" या "onStopJob पर कोई जवाब नहीं" गड़बड़ी मैसेज के साथ एएनआर को ट्रिगर करता है.
यह ANR, इन दो स्थितियों की वजह से हो सकता है:
1. मुख्य थ्रेड को ब्लॉक करने वाला कोई काम है, जिसकी वजह से कॉलबैक onStartJob
या onStopJob तय समयसीमा के अंदर लागू नहीं हो पा रहे हैं और पूरे नहीं हो पा रहे हैं.
2. डेवलपर JobScheduler में ब्लॉक करने का काम चला रहा है
onStartJob या onStopJob कॉलबैक, जो कॉलबैक को रोक रहा है
तय समयसीमा में पूरा हो जाता है.
#1 को ठीक करने के लिए, आपको यह पता लगाना होगा कि एएनआर होने पर मुख्य थ्रेड को क्या ब्लॉक कर रहा है. एएनआर होने पर टॉम्बस्टोन ट्रैक पाने के लिए, ApplicationExitInfo#getTraceInputStream() का इस्तेमाल करें. अगर एएनआर को मैन्युअल तरीके से दोहराया जा सकता है, तो सिस्टम ट्रेस रिकॉर्ड किया जा सकता है. साथ ही, Android Studio या Perfetto का इस्तेमाल करके, ट्रेस की जांच की जा सकती है. इससे यह बेहतर तरीके से समझा जा सकता है कि एएनआर होने पर मुख्य थ्रेड पर क्या चल रहा है.
ध्यान दें कि यह सीधे तौर पर JobScheduler API का इस्तेमाल करने या androidx लाइब्रेरी WorkManager का इस्तेमाल करने पर हो सकता है.
#2 को ठीक करने के लिए, WorkManager पर माइग्रेट करें. यह प्लैटफ़ॉर्म
onStartJob या onStopJob में किसी भी प्रोसेसिंग को रैप करने के लिए सहायता
एसिंक्रोनस थ्रेड में है.
JobScheduler में, setRequiredNetworkType या
setRequiredNetwork कंस्ट्रेंट का इस्तेमाल करने पर,
ACCESS_NETWORK_STATE अनुमति का एलान करने की ज़रूरत भी शामिल की गई है. अगर आपका ऐप्लिकेशन, टास्क शेड्यूल करते समय ACCESS_NETWORK_STATE अनुमति का एलान नहीं करता है और Android 14 या उसके बाद के वर्शन को टारगेट करता है, तो आपको SecurityException दिखेगा.
टाइल्स लॉन्च करने का एपीआई
For apps targeting 14 and higher,
TileService#startActivityAndCollapse(Intent) is deprecated and now throws
an exception when called. If your app launches activities from tiles, use
TileService#startActivityAndCollapse(PendingIntent) instead.
निजता
फ़ोटो और वीडियो का सीमित ऐक्सेस
Android 14 में, चुनिंदा फ़ोटो का ऐक्सेस देने की सुविधा जोड़ी गई है. इसकी मदद से, उपयोगकर्ता किसी खास तरह के सभी मीडिया का ऐक्सेस देने के बजाय, ऐप्लिकेशन को अपनी लाइब्रेरी में मौजूद चुनिंदा फ़ोटो और वीडियो का ऐक्सेस दे सकते हैं.
यह बदलाव सिर्फ़ तब चालू होता है, जब आपका ऐप्लिकेशन Android 14 (एपीआई लेवल 34) या उसके बाद के वर्शन को टारगेट करता है. अगर आपने अब तक फ़ोटो पिकर का इस्तेमाल नहीं किया है, तो हमारा सुझाव है कि आप इसे अपने ऐप्लिकेशन में लागू करें. इससे, उपयोगकर्ताओं को इमेज और वीडियो चुनने का बेहतर अनुभव मिलेगा. साथ ही, स्टोरेज से जुड़ी अनुमतियों का अनुरोध किए बिना, उपयोगकर्ता की निजता को भी बेहतर बनाया जा सकेगा.
अगर आपने स्टोरेज की अनुमतियों का इस्तेमाल करके, अपना गैलरी पिकर बनाया है और आपको इसे लागू करने पर पूरा कंट्रोल रखना है, तो नई READ_MEDIA_VISUAL_USER_SELECTED अनुमति का इस्तेमाल करने के लिए, अपने ऐप्लिकेशन को लागू करने के तरीके में बदलाव करें. अगर आपका ऐप्लिकेशन नई अनुमति का इस्तेमाल नहीं करता है, तो सिस्टम आपके ऐप्लिकेशन को काम करने के तरीके के हिसाब से बनाए गए मोड में चलाता है.
उपयोगकर्ता अनुभव
पूरी स्क्रीन पर दिखने वाली इंटेंट सूचनाओं को सुरक्षित करना
Android 11 (एपीआई लेवल 30) में, फ़ोन के लॉक होने पर भी किसी भी ऐप्लिकेशन के पास, Notification.Builder.setFullScreenIntent का इस्तेमाल करके फ़ुल स्क्रीन इंटेंट भेजने का विकल्प था. ऐप्लिकेशन इंस्टॉल होने पर, यह अनुमति अपने-आप मिल सकती है. इसके लिए, AndroidManifest में USE_FULL_SCREEN_INTENT अनुमति का एलान करें.
फ़ुल-स्क्रीन इंटेंट वाली सूचनाओं को ऐसी सूचनाओं के लिए डिज़ाइन किया गया है जिन पर उपयोगकर्ता को तुरंत ध्यान देने की ज़रूरत होती है. जैसे, कोई इनकमिंग फ़ोन कॉल या उपयोगकर्ता की कॉन्फ़िगर की गई अलार्म घड़ी की सेटिंग. Android 14 (एपीआई लेवल 34) या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए, इस अनुमति का इस्तेमाल सिर्फ़ कॉल और अलार्म की सुविधा देने वाले ऐप्लिकेशन कर सकते हैं. Google Play Store, इस प्रोफ़ाइल में शामिल न होने वाले किसी भी ऐप्लिकेशन के लिए, डिफ़ॉल्ट USE_FULL_SCREEN_INTENT अनुमतियां रद्द कर देता है. नीति में होने वाले इन बदलावों को 31 मई,
2024 तक लागू करना ज़रूरी है.
यह अनुमति, फ़ोन पर इंस्टॉल किए गए उन ऐप्लिकेशन के लिए चालू रहती है जिन्हें उपयोगकर्ता ने Android 14 पर अपडेट करने से पहले इंस्टॉल किया था. उपयोगकर्ता, इस अनुमति को चालू और बंद कर सकते हैं.
आपके पास नए एपीआई NotificationManager.canUseFullScreenIntent का इस्तेमाल करके यह देखने का विकल्प है कि आपके ऐप्लिकेशन के पास अनुमति है या नहीं. अगर अनुमति नहीं है, तो आपका ऐप्लिकेशन सेटिंग पेज को लॉन्च करने के लिए, नए इंटेंट ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT का इस्तेमाल कर सकता है. इस पेज पर जाकर, उपयोगकर्ता अनुमति दे सकते हैं.
सुरक्षा
इम्प्लिसिट और पेंडिंग इंटेंट पर पाबंदियां
Android 14 (एपीआई लेवल 34) या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए, Android, ऐप्लिकेशन के इंटरनल कॉम्पोनेंट को इंप्लिसिट इंटेंट भेजने से इन तरीकों से प्रतिबंधित करता है:
- इंप्लिसिट इंटेंट सिर्फ़ एक्सपोर्ट किए गए कॉम्पोनेंट को डिलीवर किए जाते हैं. ऐप्लिकेशन को या तो एक्सपोर्ट नहीं किए गए कॉम्पोनेंट को डिलीवर करने के लिए, खास इंटेंट का इस्तेमाल करना चाहिए या कॉम्पोनेंट को एक्सपोर्ट किए गए के तौर पर मार्क करना चाहिए.
- अगर कोई ऐप्लिकेशन, बदले जा सकने वाले PendingIntent को ऐसे इंटेंट के साथ बनाता है जिसमें किसी कॉम्पोनेंट या पैकेज के बारे में जानकारी नहीं दी गई है, तो सिस्टम में अपवाद दिखता है.
इन बदलावों से, नुकसान पहुंचाने वाले ऐप्लिकेशन को इंप्लिसिट इंटेंट को इंटरसेप्ट करने से रोका जा सकता है. इन इंटेंट का इस्तेमाल, ऐप्लिकेशन के इंटरनल कॉम्पोनेंट करते हैं.
उदाहरण के लिए, यहां एक इंटेंट फ़िल्टर दिया गया है, जिसे आपके ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में एलान किया जा सकता है:
<activity
android:name=".AppActivity"
android:exported="false">
<intent-filter>
<action android:name="com.example.action.APP_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
अगर आपके ऐप्लिकेशन ने इंप्लिसिट इंटेंट का इस्तेमाल करके इस गतिविधि को लॉन्च करने की कोशिश की है, तो ActivityNotFoundException अपवाद दिखाया जाएगा:
Kotlin
// Throws an ActivityNotFoundException exception when targeting Android 14. context.startActivity(Intent("com.example.action.APP_ACTION"))
Java
// Throws an ActivityNotFoundException exception when targeting Android 14. context.startActivity(new Intent("com.example.action.APP_ACTION"));
एक्सपोर्ट नहीं की गई गतिविधि को लॉन्च करने के लिए, आपके ऐप्लिकेशन को एक्सप्लिसिट इंटेंट का इस्तेमाल करना चाहिए:
Kotlin
// This makes the intent explicit. val explicitIntent = Intent("com.example.action.APP_ACTION") explicitIntent.apply { package = context.packageName } context.startActivity(explicitIntent)
Java
// This makes the intent explicit. Intent explicitIntent = new Intent("com.example.action.APP_ACTION") explicitIntent.setPackage(context.getPackageName()); context.startActivity(explicitIntent);
रनटाइम के दौरान रजिस्टर किए गए ब्रॉडकास्ट रिसीवर के लिए, एक्सपोर्ट करने के तरीके की जानकारी देना ज़रूरी है
Apps and services that target Android 14 (API level 34) or higher and use
context-registered receivers are required to specify a flag
to indicate whether or not the receiver should be exported to all other apps on
the device: either RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED, respectively.
This requirement helps protect apps from security vulnerabilities by leveraging
the features for these receivers introduced in Android 13.
Exception for receivers that receive only system broadcasts
If your app is registering a receiver only for
system broadcasts through Context#registerReceiver
methods, such as Context#registerReceiver(), then it
shouldn't specify a flag when registering the receiver.
डाइनैमिक कोड को सुरक्षित तरीके से लोड करना
If your app targets Android 14 (API level 34) or higher and uses Dynamic Code Loading (DCL), all dynamically-loaded files must be marked as read-only. Otherwise, the system throws an exception. We recommend that apps avoid dynamically loading code whenever possible, as doing so greatly increases the risk that an app can be compromised by code injection or code tampering.
If you must dynamically load code, use the following approach to set the dynamically-loaded file (such as a DEX, JAR, or APK file) as read-only as soon as the file is opened and before any content is written:
Kotlin
val jar = File("DYNAMICALLY_LOADED_FILE.jar") val os = FileOutputStream(jar) os.use { // Set the file to read-only first to prevent race conditions jar.setReadOnly() // Then write the actual file content } val cl = PathClassLoader(jar, parentClassLoader)
Java
File jar = new File("DYNAMICALLY_LOADED_FILE.jar"); try (FileOutputStream os = new FileOutputStream(jar)) { // Set the file to read-only first to prevent race conditions jar.setReadOnly(); // Then write the actual file content } catch (IOException e) { ... } PathClassLoader cl = new PathClassLoader(jar, parentClassLoader);
Handle dynamically-loaded files that already exist
To prevent exceptions from being thrown for existing dynamically-loaded files, we recommend deleting and recreating the files before you try to dynamically load them again in your app. As you recreate the files, follow the preceding guidance for marking the files read-only at write time. Alternatively, you can re-label the existing files as read-only, but in this case, we strongly recommend that you verify the integrity of the files first (for example, by checking the file's signature against a trusted value), to help protect your app from malicious actions.
बैकग्राउंड से गतिविधियां शुरू करने पर अतिरिक्त पाबंदियां
Android 14 (एपीआई लेवल 34) या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए, सिस्टम ने बैकग्राउंड से गतिविधियां शुरू करने की अनुमति देने के समय पर और पाबंदी लगाई है:
- जब कोई ऐप्लिकेशन
PendingIntent#send()या मिलते-जुलते तरीकों का इस्तेमाल करकेPendingIntentभेजता है, तो उसे ऑप्ट-इन करना होगा. ऐसा इसलिए, ताकि वह बैकग्राउंड में गतिविधि शुरू करने की अनुमतियां दे सके और बाकी बचे इंटेंट को शुरू कर सके. ऑप्ट-इन करने के लिए, ऐप्लिकेशन कोsetPendingIntentBackgroundActivityStartMode(MODE_BACKGROUND_ACTIVITY_START_ALLOWED)के साथActivityOptionsबंडल पास करना होगा. - जब कोई ऐप्लिकेशन,
bindService()तरीके का इस्तेमाल करके, बैकग्राउंड में चल रहे किसी दूसरे ऐप्लिकेशन की सेवा को बांधता है, तो उसे अब ऑप्ट-इन करना होगा. ऐसा तब करना होगा, जब उसे बांधी गई सेवा को बैकग्राउंड में चल रही गतिविधि को लॉन्च करने की अनुमतियां देनी हों. ऑप्ट इन करने के लिए, ऐप्लिकेशन कोbindService()तरीके को कॉल करते समय,BIND_ALLOW_ACTIVITY_STARTSफ़्लैग शामिल करना चाहिए.
इन बदलावों से, पाबंदियों के मौजूदा सेट को बढ़ाया गया है. इससे उपयोगकर्ताओं को सुरक्षित रखने के लिए, नुकसान पहुंचाने वाले ऐप्लिकेशन को बैकग्राउंड से परेशान करने वाली गतिविधियां शुरू करने के लिए, एपीआई का गलत इस्तेमाल करने से रोका जा सकेगा.
ज़िप पाथ ट्रेवर्सल
Android 14 (एपीआई लेवल 34) या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए, Android इस तरह से ZIP पाथ ट्रेवर्सल की समस्या को रोकता है: अगर ज़िप फ़ाइल एंट्री के नाम में ".." शामिल है या "/" से शुरू होते हैं, तो ZipFile(String) और ZipInputStream.getNextEntry(), ZipException को दिखाता है.
ऐप्लिकेशन, dalvik.system.ZipPathValidator.clearCallback() को कॉल करके इस पुष्टि से ऑप्ट-आउट कर सकते हैं.
MediaProjection कैप्चर करने के हर सेशन के लिए, उपयोगकर्ता की सहमति ज़रूरी है
Android 14 (एपीआई लेवल 34) या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए, MediaProjection#createVirtualDisplay इनमें से किसी भी स्थिति में SecurityException को ट्रिगर करता है:
- आपका ऐप्लिकेशन,
MediaProjectionManager#createScreenCaptureIntentसे मिलेIntentको कैश मेमोरी में सेव करता है और उसेMediaProjectionManager#getMediaProjectionको कई बार पास करता है. - आपका ऐप्लिकेशन एक ही
MediaProjectionइंस्टेंस पर,MediaProjection#createVirtualDisplayको कई बार शुरू करता है.
आपका ऐप्लिकेशन, हर कैप्चर सेशन से पहले उपयोगकर्ता से सहमति लेना चाहिए. एक कैप्चर सेशन, MediaProjection#createVirtualDisplay पर एक बार इस्तेमाल किया जाता है. साथ ही, हर MediaProjection इंस्टेंस का इस्तेमाल सिर्फ़ एक बार किया जाना चाहिए.
कॉन्फ़िगरेशन के बदलावों को हैंडल करना
अगर आपके ऐप्लिकेशन को कॉन्फ़िगरेशन में हुए बदलावों (जैसे, स्क्रीन ओरिएंटेशन या स्क्रीन साइज़ में बदलाव) को मैनेज करने के लिए MediaProjection#createVirtualDisplay को कॉल करना है, तो मौजूदा MediaProjection इंस्टेंस के लिए VirtualDisplay को अपडेट करने के लिए, यह तरीका अपनाएं:
- नई चौड़ाई और ऊंचाई के साथ
VirtualDisplay#resizeको फिर से शुरू करें. VirtualDisplay#setSurfaceके लिए, नई चौड़ाई और ऊंचाई के साथ नयाSurfaceदें.
कॉलबैक रजिस्टर करना
आपके ऐप्लिकेशन को ऐसे मामलों को हैंडल करने के लिए कॉलबैक रजिस्टर करना चाहिए जहां उपयोगकर्ता, कैप्चर सेशन जारी रखने के लिए सहमति नहीं देता. ऐसा करने के लिए, Callback#onStop लागू करें और अपने ऐप्लिकेशन में इससे जुड़े संसाधन (जैसे, VirtualDisplay और Surface) रिलीज़ करें.
अगर आपका ऐप्लिकेशन इस कॉलबैक को रजिस्टर नहीं करता है, तो आपके ऐप्लिकेशन के इसे कॉल करने पर, MediaProjection#createVirtualDisplay IllegalStateException दिखाता है.
गैर-एसडीके से जुड़ी अपडेट की गई पाबंदियां
Android 14 में, पाबंदी वाले गैर-एसडीके इंटरफ़ेस की अपडेट की गई सूचियां शामिल हैं. ये सूचियां, Android डेवलपर के साथ मिलकर काम करने और हाल ही में हुई इंटरनल टेस्टिंग के आधार पर बनाई गई हैं. हम यह पक्का करते हैं कि गैर-एसडीके इंटरफ़ेस को प्रतिबंधित करने से पहले, सार्वजनिक विकल्प उपलब्ध हों.
अगर आपका ऐप्लिकेशन Android 14 को टारगेट नहीं करता है, तो हो सकता है कि इनमें से कुछ बदलावों का असर आप पर तुरंत न पड़े. हालांकि, फ़िलहाल कुछ गैर-एसडीके इंटरफ़ेस (आपके ऐप्लिकेशन के टारगेट एपीआई लेवल के हिसाब से) इस्तेमाल किए जा सकते हैं. हालांकि, किसी भी गैर-एसडीके तरीके या फ़ील्ड का इस्तेमाल करने से, आपके ऐप्लिकेशन के काम न करने का जोखिम हमेशा ज़्यादा होता है.
अगर आपको पक्का नहीं है कि आपका ऐप्लिकेशन, गैर-एसडीके इंटरफ़ेस का इस्तेमाल करता है या नहीं, तो यह पता लगाने के लिए अपने ऐप्लिकेशन की जांच करें. अगर आपका ऐप्लिकेशन, गैर-एसडीके इंटरफ़ेस पर निर्भर करता है, तो आपको एसडीके के विकल्पों पर माइग्रेट करने की योजना बनानी चाहिए. हालांकि, हम समझते हैं कि कुछ ऐप्लिकेशन के पास, गैर-एसडीके इंटरफ़ेस इस्तेमाल करने के लिए मान्य वजहें होती हैं. अगर आपको अपने ऐप्लिकेशन में किसी सुविधा के लिए, गैर-एसडीके इंटरफ़ेस के इस्तेमाल का कोई विकल्प नहीं मिल रहा है, तो आपको नया सार्वजनिक एपीआई का अनुरोध करना चाहिए.
To learn more about the changes in this release of Android, see Updates to non-SDK interface restrictions in Android 14. To learn more about non-SDK interfaces generally, see Restrictions on non-SDK interfaces.