निर्यात की गई सेवा को अनुमति की आवश्यकता नहीं है: इसका क्या मतलब है?


143

मैंने एक ऐसी सेवा बनाई जो AIDL के माध्यम से अन्य अनुप्रयोगों से बंधी है, और मैं इसे इस प्रकार प्रकट करता हूं:

<service android:name=".MyService">
    <intent-filter>
        <action android:name="org.example.android.myservicedemo.IService" />
    </intent-filter>
</service>

जहां IService AIDL इंटरफ़ेस है।

इस तरह, ग्रहण मुझे चेतावनी दिखाता है कि निर्यात की गई सेवा को अनुमति की आवश्यकता नहीं है । यदि मैं हटाता हूं intent-filter, तो चेतावनी गायब हो जाती है, लेकिन जाहिर है कि एप्लिकेशन सेवा से बंधने में असमर्थ हैं।

इस चेतावनी का क्या मतलब है?


31
इसका अर्थ यह है कि उपयोगकर्ता के अन्य (मनमाने ढंग से) अनुप्रयोग उसके फोन पर आपके द्वारा बाँध सकते हैं Serviceऔर जो भी विधि वे चाहते हैं उसे कॉल करें जो आपके एआईडीएल इंटरफेस के माध्यम से उजागर होती है।
जेन्स

25
अपने AndroidManifest.xml में एक नया <अनुमति> बनाएं और android:permissionअपने <service>घोषणा की विशेषता के रूप में उस के नाम का उपयोग करें । या सिर्फ चेतावनी को अनदेखा करें - सेवा करने का इरादा क्या है? आप सेवा "आंतरिक" रखने के साथ ठीक लगे, तो यह बहुत आसान है बस सेट करने के लिए android:exported="false"पर अपने<service>
जेन्स

3
फिर या तो चेतावनी को अनदेखा करें या एक <अनुमति> जोड़ें, "हस्ताक्षर" का उपयोग करें यदि वे एक ही प्रमाण पत्र के साथ हस्ताक्षर किए गए आपके सभी एप्लिकेशन हैं या केवल "सामान्य" के साथ जाएं अन्यथा।
जेन्स

3
आप अपने अनुप्रयोगों पर हस्ताक्षर करने के लिए पहले से ही (रिलीज़) प्रमाण पत्र का उपयोग कर रहे हैं - हस्ताक्षर सुरक्षा जांच करती है कि अनुमति का अनुरोध करने वाला आवेदन उसी के रूप में हस्ताक्षरित है जिसने अनुमति को परिभाषित किया है।
जेन्स

2
@ जेन्स धन्यवाद ... इसने मेरी मदद की .... btw आप जवाब के रूप में अपनी टिप्पणी जोड़ सकते हैं। Enzom83 को इसे स्वीकार करने दें।
विजय सी।

जवाबों:


128

मेरे पास यही मुद्दा था जब मैंने एसडीके को संस्करण 20 में अद्यतन किया । मैंने इसे एंड्रॉइड जोड़कर हटा दिया : निर्यात की गई संपत्ति android:exported="false"जैसे:

<service android:name=".MyService"
    android:exported="false">
    <intent-filter>
        <action android:name="org.example.android.myservicedemo.IService" />
    </intent-filter>
</service>

देखिये ये डॉक


56

यदि आप अपने स्वयं के अनुप्रयोग के लिए गतिविधि के उपयोग को प्रतिबंधित करना चाहते हैं, तो आपको exported=falseअपनी गतिविधि के प्रकट बयान में जोड़ना चाहिए ।

यदि आप अन्य अनुप्रयोगों को इसका उपयोग करने की अनुमति देना चाहते हैं (स्पष्ट रूप से इसके वर्ग नाम या, बेहतर, डेटा प्रकार या कार्रवाई के साथ एक इरादे का उपयोग करके) तो आपके पास दो विकल्प हैं:

  • एक अनुमति का उपयोग करके उन अनुप्रयोगों को प्रतिबंधित करें
  • सभी अनुप्रयोगों को इसका उपयोग करने की अनुमति दें, फिर आप tools:ignore="ExportedActivity"अपनी गतिविधि के प्रकट बयान में जोड़ सकते हैं ।

-

एक ही तर्क एक सेवा पर लागू होता है, tools:ignore="ExportedService"और सामग्री प्रदाताओं के साथ tools:ignore="ExportedContentProvider"


8
यह मेरे लिए काम किया, धन्यवाद !! हालाँकि, ध्यान दें कि यह प्रकट फ़ाइल के शीर्ष पर एक xmlns घोषणा जोड़ने की आवश्यकता है :xmlns:tools="http://schemas.android.com/tools"
लुइस ए। फ्लोरिट

धन्यवाद, इसके ग्रहण द्वारा स्वचालित रूप से जोड़ा गया। यह अन्य आईडीई उपयोगकर्ताओं के लिए एक अच्छा पूरक है।
स्नोकॉल्स

मैं ४.२.१ ग्रहण का उपयोग करता हूं, और यह इसे नहीं जोड़ता है, एक त्रुटि दे रहा है (कम से कम डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ?)। यह सिर्फ कहता है: The prefix "tools" for attribute "tools:ignore" associated with an element type "activity" is not boundऔर इसे ठीक करने के लिए कोई विकल्प नहीं दिया गया है।
लुइस ए। फ्लोरेट

यदि आप अपने उपकरण हटाते हैं तो इसे जोड़ देगा: foo = bar स्टेटमेंट, तब जब कोई त्रुटि / चेतावनी हो तो राइट क्लिक करें और टूल स्टेटमेंट को जोड़ने के लिए क्विक फिक्स का उपयोग करें।
Snicolas

1
विशेष मामला सिंक सेवा है, जिसे निर्यात किया जाना चाहिए लेकिन आप केवल इसका उपयोग करना चाहते हैं। SyncService या AuthenticatorService के लिए android जोड़ें: अनुमति = "हस्ताक्षर"
Entreco

4

जैसा कि जेन्स ने कहा, "इसका मतलब यह है कि उपयोगकर्ता के अन्य (मनमाने ढंग से) अनुप्रयोग उसके फोन पर आपके सेवा से जुड़ सकते हैं और जो भी विधि वे चाहते हैं उसे कॉल करें जो आपके एआईडीएल इंटरफेस के माध्यम से उजागर हो।"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.