android:exported: Android 12 में Kotlin पर क्रैश से बचाव

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

आपका ऐप Android 12 पर अचानक लॉन्च क्यों नहीं हो रहा?

\n\n

आपने targetSdkVersion को 31 या उससे ऊपर अपडेट किया, APK बनाया, लॉन्च किया — और एक रहस्यमयी संदेश के साथ क्रैश हो गया:

\n\n
android:exported needs to be explicitly specified for <activity>. \nApps targeting Android 12 and higher are required to specify \nan explicit value for `android:exported` when the corresponding \ncomponent has an intent filter defined.
\n\n

परिचित लग रहा है? अगर आपने Stack Overflow पर देखा होगा, तो आपने देखा होगा कि इस प्रश्न को हजारों बार देखा गया है। डेवलपर्स घबराए हुए हैं, और उपयोगकर्ता हैरान हैं। लेकिन प्रोजेक्ट को डिलीट करने में जल्दबाजी न करें। इस लेख में, हम समझेंगे कि यह android:exported क्या है, Google ने आवश्यकताओं को क्यों कड़ा किया, और Kotlin पर त्रुटि को जल्दी कैसे ठीक करें। चलिए शुरू करते हैं!

\n\n

android:exported क्या है और इसकी आवश्यकता क्यों है?

\n\n

android:exported AndroidManifest.xml में एक विशेषता है जो नियंत्रित करती है कि क्या अन्य ऐप (या सिस्टम स्वयं) आपके घटक (Activity, Service, BroadcastReceiver या ContentProvider) को लॉन्च कर सकते हैं। यदि विशेषता true पर सेट है — घटक बाहर से सुलभ है। यदि false — केवल आपके ऐप के अंदर।

\n\n

Android 12 (API 31) से पहले, यह विशेषता वैकल्पिक थी। यदि आप इसे निर्दिष्ट नहीं करते थे, तो सिस्टम स्वयं तय करता था कि घटक सुलभ है या नहीं:

\n
    \n
  • यदि Activity में <intent-filter> है — सिस्टम मानता था कि exported = true।
  • \n
  • यदि कोई फ़िल्टर नहीं है — exported = false।
  • \n
\n\n

लेकिन यह "स्वचालित" व्यवहार सुरक्षा में एक छेद है। कल्पना करें: आपने ऐप में लॉगिन के लिए एक Activity लिखी और गलती से एक intent-filter जोड़ दिया। कोई भी तृतीय-पक्ष ऐप आपकी Activity को कॉल कर सकता है और टोकन चुरा सकता है। इसलिए Google ने फैसला किया: Android 12 से, आपको किसी भी घटक के लिए स्पष्ट रूप से android:exported निर्दिष्ट करना होगा जिसमें <intent-filter> है।

\n\n

व्यवहार में त्रुटि कैसी दिखती है?

\n\n

मान लीजिए, आपके पास एक सरल मेनिफेस्ट है:

\n\n
<activity android:name=".MainActivity">\n    <intent-filter>\n        <action android:name="android.intent.action.MAIN" />\n        <category android:name="android.intent.category.LAUNCHER" />\n    </intent-filter>\n</activity>
\n\n

यदि targetSdkVersion = 31 या उससे ऊपर है, तो आपको कंपाइलेशन या लॉन्च के दौरान त्रुटि मिलेगी। समाधान — android:exported जोड़ें:

\n\n
<activity \n    android:name=".MainActivity"\n    android:exported="true">\n    <intent-filter>\n        <action android:name="android.intent.action.MAIN" />\n        <category android:name="android.intent.category.LAUNCHER" />\n    </intent-filter>\n</activity>
\n\n

मुख्य Activity के लिए, जो होम स्क्रीन से लॉन्च होती है, exported को true होना चाहिए — अन्यथा लॉन्चर इसे नहीं खोल पाएगा।

\n\n

सही तरीके से कैसे ठीक करें: चरण-दर-चरण निर्देश

\n\n

चरण 1. AndroidManifest.xml खोलें

\n

सभी <activity>, <service>, <receiver> और <provider> खोजें जिनमें <intent-filter> है। उनमें से प्रत्येक के लिए android:exported जोड़ें।

\n\n

चरण 2. विशेषता का मान निर्धारित करें

\n

यहाँ एक सरल नियम है:

\n
    \n
  • true — यदि घटक अन्य ऐप से सुलभ होना चाहिए (उदाहरण के लिए, Google के माध्यम से लॉगिन के लिए Activity, सिस्टम इवेंट के लिए BroadcastReceiver, LAUNCHER फ़िल्टर वाली मुख्य Activity)।
  • \n
  • false — यदि घटक केवल आपके ऐप के अंदर उपयोग किया जाता है (उदाहरण के लिए, Activity जो आपके कोड में बटन दबाने पर खुलती है)।
  • \n
\n\n

चरण 3. विभिन्न परिदृश्यों के लिए उदाहरण

\n\n

परिदृश्य 1: मुख्य Activity (Launcher)

\n
                

ब्लॉग

पुस्तक अनुशंसाएँ