एंड्रॉइड मिन एसडीके संस्करण बनाम लक्ष्य एसडीके संस्करण


442

जब एंड्रॉइड के लिए विकासशील अनुप्रयोगों की बात आती है, तो न्यूनतम और लक्ष्य एसडीके संस्करण के बीच क्या अंतर है? जब तक मिन और टारगेट संस्करण समान नहीं होंगे, तब तक ग्रहण मुझे एक नई परियोजना नहीं बनाने देगा!


1
मैं जो पढ़ रहा हूं, उससे ऐसा लगता है कि टारगेट एसडीके वर्जन का इस बात पर कोई असर नहीं है कि आपका आवेदन कैसे संकलित है। यह केवल डिवाइस को बताने के लिए है कि एप्लिकेशन चल रहा है कि इसे आपके एप्लिकेशन को ठीक से काम करने के लिए किसी विशेष संगतता सुविधाओं को सक्षम करने की आवश्यकता नहीं है। क्या यह सही है? यह मुझे ऐसा लगता है जैसे आपको पता नहीं होगा कि आपके लक्ष्य एसडीके संस्करण क्या है जब तक कि आपके द्वारा संकलित और बहुत परीक्षण नहीं किया गया है। कंपाइलर सिर्फ आपके कोड को क्यों नहीं देख सकता है और यह पता लगा सकता है कि आपका एप्लिकेशन किस प्लेटफॉर्म के साथ संगत है?
माइकल नॉवेलो

5
ऊपर टिप्पणी करने वाले ने गलत समझा है कि कोई व्यक्ति लक्ष्यबैंक विशेषता का उपयोग क्यों करता है। अधिक जानकारी के लिए नीचे मेरा उत्तर देखें।
स्टीव हेली

157
स्वीकृत उत्तर सही नहीं है। कृपया स्टीव एच। का उत्तर पढ़ें
tylerl

3
@tylerl लेकिन यह गलत नहीं है बल्कि यह Google Android दस्तावेज़ों का संदर्भ दे रहा है। मैंने कुछ नहीं जोड़ा है।
विकास पाटीदार

3
कार्ल का जवाब मेरी राय में सबसे विस्तृत और सटीक है।
इल्या कोगन

जवाबों:


136

एंड्रॉयड: minSdkVersion

एप्लिकेशन को चलाने के लिए आवश्यक न्यूनतम एपीआई स्तर को निर्दिष्ट करने वाला पूर्णांक। एंड्रॉइड सिस्टम उपयोगकर्ता को एप्लिकेशन को इंस्टॉल करने से रोकेगा यदि सिस्टम का एपीआई स्तर इस विशेषता में निर्दिष्ट मूल्य से कम है। आपको हमेशा इस विशेषता को घोषित करना चाहिए।

एंड्रॉयड: targetSdkVersion

एक पूर्णांक एपीआई स्तर को नामित करता है जो अनुप्रयोग को लक्षित कर रहा है।

इस विशेषता सेट के साथ, एप्लिकेशन का कहना है कि यह पुराने संस्करणों (नीचे minSdkVersion) पर चलने में सक्षम है, लेकिन यहां निर्दिष्ट संस्करण के साथ काम करने के लिए स्पष्ट रूप से परीक्षण किया गया था। इस लक्ष्य संस्करण को निर्दिष्ट करने से प्लेटफॉर्म को अनुकूलता सेटिंग्स को अक्षम करने की अनुमति मिलती है जो लक्ष्य संस्करण के लिए आवश्यक नहीं हैं (जो कि आगे-संगतता बनाए रखने के लिए चालू हो सकते हैं) या नई सुविधाओं को सक्षम करने के लिए जो पुराने अनुप्रयोगों के लिए उपलब्ध नहीं हैं। इसका मतलब यह नहीं है कि आप प्लेटफ़ॉर्म के विभिन्न संस्करणों के लिए अलग-अलग सुविधाओं को प्रोग्राम कर सकते हैं - यह केवल उस प्लेटफ़ॉर्म को सूचित करता है जिसे आपने लक्ष्य संस्करण के विरुद्ध परीक्षण किया है और प्लेटफ़ॉर्म को लक्ष्य संस्करण के साथ आगे-संगतता बनाए रखने के लिए कोई अतिरिक्त कार्य नहीं करना चाहिए।

अधिक जानकारी के लिए इस URL को देखें:

http://developer.android.com/guide/topics/manifest/uses-sdk-element.html


द्वारा और बड़े, आप दोनों को एक ही चीज़ पर सेट करने जा रहे हैं। यह संभवतः एक असामान्य स्थिति होगी कि उन्हें विभिन्न मूल्यों पर सेट किया जाए।
jjb

66
Jjb की टिप्पणी के बारे में: मैं असहमत हूं। कई अच्छे कारण हैं कि आप एक अलग minSDK और targetSDK क्यों ले सकते हैं। अधिक जानकारी के लिए मेरा जवाब देखें।
स्टीव हेली

871

ओपी द्वारा प्रश्न के लिए पोस्ट की गई टिप्पणी (मूल रूप से यह कहते हुए कि टारगेटकेके ऐप के संकलन को प्रभावित नहीं करता है) पूरी तरह से गलत है! माफ़ करना शरमाना।

संक्षेप में, यहाँ minSDK से एक अलग टारगेट को घोषित करने का उद्देश्य है: इसका मतलब है कि आप अपने न्यूनतम की तुलना में उच्च स्तर के एसडीके से सुविधाओं का उपयोग कर रहे हैं, लेकिन आपने पीछे की संगतता सुनिश्चित की है । दूसरे शब्दों में, कल्पना करें कि आप एक ऐसी सुविधा का उपयोग करना चाहते हैं जो हाल ही में शुरू की गई थी, लेकिन यह आपके आवेदन के लिए महत्वपूर्ण नहीं है। फिर आप टारगेटकेके को उस संस्करण में सेट करेंगे जहां यह नई सुविधा शुरू की गई थी और न्यूनतम से कुछ कम है ताकि हर कोई अभी भी आपके ऐप का उपयोग कर सके।

एक उदाहरण देने के लिए, मान लीजिए कि आप एक ऐसा ऐप लिख रहे हैं, जो जेस्चर डिटेक्शन का व्यापक उपयोग करता है। हालांकि, प्रत्येक कमांड जिसे एक इशारे से पहचाना जा सकता है वह एक बटन या मेनू से भी किया जा सकता है। इस मामले में, इशारे एक 'शांत अतिरिक्त' हैं, लेकिन आवश्यक नहीं हैं। इसलिए आप लक्ष्य sdk को 7 ("एक्लेयर" पर सेट करेंगे जब GestureDetection पुस्तकालय शुरू किया गया था), और न्यूनतम 3 के स्तर ("कपकेक") ताकि पुराने फोन वाले लोग भी अपने ऐप का उपयोग कर सकें। आपको बस यह सुनिश्चित करना होगा कि आपका ऐप एंड्रॉइड के संस्करण की जांच करता है जो इशारे की लाइब्रेरी का उपयोग करने से पहले चल रहा था, अगर यह मौजूद नहीं था तो इसका उपयोग करने से बचने की कोशिश करें। (निश्चित रूप से यह एक दिनांकित उदाहरण है क्योंकि शायद ही किसी के पास अभी भी v1.5 फोन है, लेकिन एक समय था जब v1 के साथ संगतता बनाए रखा गया था।

एक और उदाहरण देने के लिए, आप इसका उपयोग कर सकते हैं यदि आप जिंजरब्रेड या हनीकॉम्ब से एक सुविधा का उपयोग करना चाहते थे। कुछ लोगों को जल्द ही अपडेट मिल जाएगा, लेकिन कई अन्य, विशेष रूप से पुराने हार्डवेयर के साथ, एक नया उपकरण खरीदने तक एक्लेयर के साथ फंस सकते हैं। यह आपको कुछ शांत नई सुविधाओं का उपयोग करने देगा, लेकिन आपके संभावित बाजार के हिस्से को छोड़कर।

एंड्रॉइड डेवलपर के ब्लॉग से वास्तव में एक अच्छा लेख है कि इस सुविधा का उपयोग कैसे किया जाए, और विशेष रूप से, "इसका उपयोग करने से पहले मौजूद सुविधा की जांच करें" कोड को डिज़ाइन करने के लिए कैसे मैंने ऊपर उल्लेख किया है।

ओपी के लिए: मैंने इसे मुख्य रूप से किसी के लाभ के लिए लिखा है जो भविष्य में इस प्रश्न पर ठोकर खाने के लिए होता है, जैसा कि मुझे पता है कि आपका प्रश्न बहुत पहले पूछा गया था।


2
क्या आप सटीक विवरण प्रदान कर सकते हैं कि टारगेटकॉवर्सन ऐप के संकलन को कैसे प्रभावित करता है? क्योंकि संकलन संस्करण फिर से एक और कॉन्फ़िगरेशन है जिसे आपको स्थापित करने की आवश्यकता है। अग्रिम धन्यवाद
hnviet

9
मुझे लगता है कि स्टीव प्रकट हुए एक्सएमएल विशेषता एंड्रॉइड के बीच उलझन में है : targetSdkVersion (जिसमें कोई वास्तविक कहना नहीं है) और प्रोजेक्ट में रहने वाली लक्ष्य संपत्ति के बीच है । कोड फ़ाइल संकलित होने के खिलाफ प्रोजेक्ट का प्रतिनिधित्व करने वाली फ़ाइल। मैं फिर से कहूंगा, xml attr targetSdkVersion का कोई वास्तविक अर्थ नहीं है !!!
एलिकएल्ज़िन-किलाका

3
@kilaka आधा आपकी टिप्पणी मान्य है, लेकिन अन्य आधा बस गलत है। मैं यह मान रहा था कि कोई XML और प्रोजेक्ट में समान मान का उपयोग करता है। प्रोजेक्ट (एक राइट क्लिक के माध्यम से पहुँचा जा सकता है -> ग्रहण में गुण), इसलिए आपको यह इंगित करने का अधिकार है कि वे अलग-अलग स्थानों पर संग्रहीत हैं। हालाँकि, Android मार्केट निश्चित रूप से इस बात की परवाह करता है कि आपने xml विशेषता targetSdkVersion में क्या मूल्य रखा है। उदाहरण के लिए, यह उपयोग करता है कि यह निर्धारित करते समय कि आपके पास एक्शनबार या हनीकॉम्ब और उससे ऊपर के अनुप्रयोगों के लिए संगतता मेनू होना चाहिए।
स्टीव हेली

2
@ नहीं मैं यह नहीं कह सकता कि यह 'जटिल कोड' कितना धीमा है, लेकिन रनटाइम बनाता है, लेकिन मुझे लगता है कि अलग-अलग APK का विभाजन और उपयोग करना कोड जटिलता के मामले में बदतर है। अब आपको प्रत्येक निर्यात करने से पहले अपने स्रोत नियंत्रण में अधिक शाखाओं के माध्यम से / बाहर टिप्पणी करने या विलय करने के लिए याद रखना होगा। जब पिछले अक्टूबर में एक एंड्रॉइड सम्मेलन में, उन्होंने कहा कि उन्होंने रियायत के रूप में कई एपीके सिस्टम पेश किए, लेकिन खुश थे कि बहुत कम लोग इसका उपयोग कर रहे थे।
स्टीव हेली

2
लेकिन कई संस्करणों को संभालना संस्करण नियंत्रण प्रणालियों के लिए क्या किया जाता है। यह वही है जो डेवलपर्स से परिचित हैं (अधिकांश सॉफ्टवेयर, मोबाइल या नहीं, विभिन्न प्लेटफार्मों के लिए थोड़ा अलग संस्करण जारी करता है)। यह Android "सुविधा" जटिलता को कम नहीं कर रहा है। यह बस इसे चल रहे एप्लिकेशन में धकेल रहा है, और जैसा कि इस धागे से स्पष्ट होता है, भ्रम पैदा करता है। निश्चित रूप से, Google खुश होने वाला है कि बहुत कम लोग इसका उपयोग कर रहे हैं ... जो उन्हें यह कहने में मदद करता है, "देखो, हम पहले स्थान पर इस चूक को बनाने के लिए सही थे"। इसके अलावा, कुछ इसका उपयोग नहीं करते हैं क्योंकि वे अभी तक नहीं जानते कि यह मौजूद है।
नैट

97

जब आप targetSdkVersion = "xx" सेट करते हैं, तो आप यह प्रमाणित कर रहे हैं कि एपीआई स्तर xx पर आपका ऐप ठीक से काम करता है (जैसे, अच्छी तरह से और सफलतापूर्वक परीक्षण किया गया है)।

एंड्रॉइड का एक संस्करण xx से ऊपर एक एपीआई स्तर पर चल रहा है, आप किसी भी सुविधाओं का समर्थन करने के लिए स्वचालित रूप से अनुकूलता कोड लागू करेंगे जो कि एपीआई स्तर xx पर या उससे पहले उपलब्ध थे, लेकिन जो अब उस Android संस्करण के उच्च स्तर पर अप्रचलित हैं।

इसके विपरीत, यदि आपको लगता है कि अप्रचलित हो गई किसी भी सुविधाओं का उपयोग कर रहे पर या पूर्व स्तर xx के लिए, संगतता कोड होगा नहीं स्वचालित रूप से OS संस्करण द्वारा उच्च API स्तरों पर उन का उपयोग करता है समर्थन करने के लिए लागू किया जा (जो अब उन सुविधाओं को शामिल)। उस स्थिति में, आपके स्वयं के कोड में विशेष केस क्लॉज़ होना चाहिए जो एपीआई स्तर का परीक्षण करता है और, यदि ओएस स्तर का पता लगाया गया है, तो वह उच्चतर है जिसमें अब दी गई एपीआई सुविधा नहीं है, आपके कोड को वैकल्पिक विशेषताओं का उपयोग करना चाहिए जो चल रहे ओएस पर उपलब्ध हैं एपीआई स्तर।

यदि यह ऐसा करने में विफल रहता है, तो कुछ इंटरफ़ेस सुविधाएँ बस प्रकट नहीं हो सकती हैं जो सामान्य रूप से आपके कोड के भीतर घटनाओं को ट्रिगर करेंगी, और आप एक महत्वपूर्ण इंटरफ़ेस सुविधा को याद कर सकते हैं जिसे उपयोगकर्ता को उन घटनाओं को ट्रिगर करने और उनकी कार्यक्षमता तक पहुंचने की आवश्यकता है (जैसा कि उनकी कार्यक्षमता के अनुसार) नीचे उदाहरण)।

जैसा कि अन्य उत्तरों में कहा गया है, आप minSdkVersion की तुलना में targetSdkVersion को उच्चतर सेट कर सकते हैं, यदि आप अपने एपीआईएसडाउन्ट की तुलना में उच्च एपीआई स्तरों पर शुरू में परिभाषित कुछ एपीआई सुविधाओं का उपयोग करना चाहते थे, और यह सुनिश्चित करने के लिए कदम उठाए थे कि आपका कोड उन विशेषताओं की अनुपस्थिति का पता लगा सके और उन्हें संभाल सके। targetSdkVersion की तुलना में निम्न स्तर।

किसी सुविधा का उपयोग करने के लिए आवश्यक न्यूनतम API स्तर के लिए विशेष रूप से परीक्षण करने के लिए डेवलपर्स को चेतावनी देने के लिए, कंपाइलर एक त्रुटि जारी करेगा (सिर्फ एक चेतावनी नहीं) यदि कोड में किसी भी विधि के लिए कॉल शामिल है जो कि minSdkersion की तुलना में बाद के एपीआई स्तर पर परिभाषित किया गया था, तो भले ही targetSdkVersion एपीआई स्तर से अधिक या उसके बराबर हो, जिस पर वह तरीका पहले उपलब्ध कराया गया था। इस त्रुटि को दूर करने के लिए, कंपाइलर निर्देश

@TargetApi(nn)

संकलक को बताता है कि उस निर्देश के दायरे के भीतर कोड (जो या तो एक विधि या एक वर्ग से पहले होगा) किसी भी तरीके से कॉल करने से पहले कम से कम nn के एपीआई स्तर के लिए परीक्षण करने के लिए लिखा गया है जो कम से कम उस एपीआई स्तर के होने पर निर्भर करता है । उदाहरण के लिए, निम्न कोड एक ऐसी विधि को परिभाषित करता है जिसे कोड से किसी ऐप के भीतर बुलाया जा सकता है जिसमें 11 से कम का minSdVersion और 11 या उससे अधिक का targetSdkVersion है:

@TargetApi(11)
    public void refreshActionBarIfApi11OrHigher() {
      //If the API is 11 or higher, set up the actionBar and display it
      if(Build.VERSION.SDK_INT >= 11) {
        //ActionBar only exists at API level 11 or higher
        ActionBar actionBar = getActionBar();

        //This should cause onPrepareOptionsMenu() to be called.
        // In versions of the API prior to 11, this only occurred when the user pressed 
        // the dedicated menu button, but at level 11 and above, the action bar is 
        // typically displayed continuously and so you will need to call this
        // each time the options on your menu change.
        invalidateOptionsMenu();

        //Show the bar
        actionBar.show();
    }
}

यदि आप उस उच्च स्तर पर परीक्षण कर चुके हैं और सब कुछ काम कर चुका है, तो भी आप एक उच्च लक्ष्य-निर्धारण की घोषणा कर सकते हैं , भले ही आप अपने minSdkVersion की तुलना में एपीआई स्तर से किसी भी सुविधाएँ का उपयोग नहीं कर रहे हों । यह सिर्फ अनुकूलता कोड तक पहुँचने के ओवरहेड से बचने के इरादे से लक्ष्य स्तर से नीचे न्यूनतम स्तर तक पहुंचने के लिए होगा, क्योंकि आपने पुष्टि की होगी (परीक्षण के माध्यम से) कि इस तरह के अनुकूलन की आवश्यकता नहीं थी।

यूआई फीचर का एक उदाहरण जो घोषित टारगेट पर निर्भर करता है। डिस्‍काउंट तीन से वर्टिकल-डॉट मेनू बटन होता है, जो उन एप्स के स्टेटस बार पर दिखाई देता है, जिनमें 11 से कम का टार्गेटवॉक वर्जन होता है, जब वे एप्स एपीआई 11 के तहत चल रहे होते हैं। यदि आपके ऐप में 10 या उससे नीचे का लक्ष्यविकास है, तो यह माना जाता है कि आपके ऐप का इंटरफ़ेस एक समर्पित मेनू बटन के अस्तित्व पर निर्भर करता है, और इसलिए तीन-डॉट बटन पहले समर्पित हार्डवेयर और / या स्क्रीन संस्करणों की जगह लेता है। उस बटन का (जैसे, जिंजरब्रेड में देखा गया) जब OS का उच्च API स्तर होता है, जिसके लिए डिवाइस पर एक समर्पित मेनू बटन अब ग्रहण नहीं किया जाता है। हालाँकि, यदि आप अपने ऐप के टारगेट SSkVersion को 11 या उससे अधिक पर सेट करते हैं, तो यह माना जाता है कि आपने उस स्तर पर शुरू की गई सुविधाओं का लाभ उठाया है जो समर्पित मेनू बटन (ई) को प्रतिस्थापित करते हैं। जी।, एक्शन बार), या कि आपने अन्यथा सिस्टम मेनू बटन की आवश्यकता को दरकिनार कर दिया है; नतीजतन, तीन-ऊर्ध्वाधर-मेनू "संगतता बटन" गायब हो जाता है। उस स्थिति में, यदि उपयोगकर्ता को मेनू बटन नहीं मिल रहा है, तो वह इसे दबा नहीं सकता है, और यह बदले में, इसका मतलब है कि आपकी गतिविधि का onCreateOptionsMenu (मेनू) ओवरराइड कभी भी चालान नहीं हो सकता है, जो फिर से, इसका मतलब है कि आपके ऐप की कार्यक्षमता का एक महत्वपूर्ण हिस्सा इसके उपयोगकर्ता इंटरफ़ेस से वंचित हो सकता है। जब तक, निश्चित रूप से, आपने इन सुविधाओं तक पहुंचने के लिए उपयोगकर्ता के लिए एक्शन बार या कुछ अन्य वैकल्पिक साधनों को लागू किया है। t एक मेनू बटन ढूंढें, वह इसे दबा नहीं सकती है, और यह बदले में, इसका मतलब है कि आपकी गतिविधि का onCreateOptionsMenu (मेनू) ओवरराइड कभी भी चालान नहीं हो सकता है, जो फिर से बदले में, इसका मतलब है कि आपके ऐप की कार्यक्षमता का एक महत्वपूर्ण हिस्सा हो सकता है। इसके यूजर इंटरफेस से वंचित। जब तक, निश्चित रूप से, आपने इन सुविधाओं तक पहुंचने के लिए उपयोगकर्ता के लिए एक्शन बार या कुछ अन्य वैकल्पिक साधनों को लागू किया है। t एक मेनू बटन ढूंढें, वह इसे दबा नहीं सकती है, और यह बदले में, इसका मतलब है कि आपकी गतिविधि का onCreateOptionsMenu (मेनू) ओवरराइड कभी भी चालान नहीं हो सकता है, जो फिर से बदले में, इसका मतलब है कि आपके ऐप की कार्यक्षमता का एक महत्वपूर्ण हिस्सा हो सकता है। इसके यूजर इंटरफेस से वंचित। जब तक, निश्चित रूप से, आपने इन सुविधाओं तक पहुंचने के लिए उपयोगकर्ता के लिए एक्शन बार या कुछ अन्य वैकल्पिक साधनों को लागू किया है।

minSdkVersion, इसके विपरीत, एक आवश्यकता बताता है कि आपके ऐप को चलाने के लिए डिवाइस के OS संस्करण में कम से कम एपीआई स्तर है। यह प्रभावित करता है कि कौन से डिवाइस Google Play ऐप स्टोर (और संभवतः अन्य ऐप स्टोर, साथ ही) पर आपके ऐप को देखने और डाउनलोड करने में सक्षम हैं। यह बताते हुए कि आपका ऐप OS (API या अन्य) सुविधाओं पर निर्भर है, जो उस स्तर पर स्थापित किए गए थे, और उन सुविधाओं की अनुपस्थिति से निपटने के लिए स्वीकार्य तरीका नहीं है।

एक सुविधा है कि एपीआई से संबंधित नहीं है की उपस्थिति सुनिश्चित करने के लिए minSdkVersion का उपयोग करने का एक उदाहरण यह सुनिश्चित करने के लिए कि आपका ऐप केवल DalIT दुभाषिया के JIT- सक्षम संस्करण पर ही चलेगा, जब से JIT पेश किया गया था एपीआई स्तर 8 पर Android दुभाषिया के लिए)। चूँकि JIT- सक्षम दुभाषिया के लिए प्रदर्शन पाँच गुना हो सकता है, जिसमें उस विशेषता का अभाव होता है, यदि आपका ऐप प्रोसेसर का भारी उपयोग करता है, तो पर्याप्त प्रदर्शन सुनिश्चित करने के लिए आपको एपीआई स्तर 8 या उससे ऊपर की आवश्यकता हो सकती है।


TargetApi निर्देश का उपयोग करने के निर्देश के लिए धन्यवाद।
samir105

@Carl करता है तो इसका मतलब यह है कि मैं यह कर सकते हैं किसी भी परीक्षण के लिए मेरी minSdkVersion (विशेष रूप से उन यूआई संवर्द्धन हासिल करने के लिए) की तुलना में किसी भी संस्करण में अधिक आवश्यकता के बिना करने के लिए हमेशा सेट targetSdkVersion ( प्रति ) तक मैं अपने minSdkVersion में केवल एपीआई उपलब्ध उपयोग करने के लिए मेरी codebase प्रतिबंधित के रूप में ?
डेमिलोला ओलोवुकेरे

ओलोवुकेरे इमैनुएल: अगर मैं आपको सही ढंग से समझता हूं, तो नहीं, इसका मतलब यह नहीं है। जैसा कि मेरे उत्तर में कहा गया है, "यदि आप किसी ऐसी विशेषताओं का उपयोग कर रहे हैं जो स्तर xx से पहले या पूर्ववर्ती हो गई हैं, तो संगतता कोड OS संस्करणों द्वारा स्वचालित रूप से उच्च एपीआई स्तरों पर लागू नहीं होगा।" इसलिए यदि आपका कोड एक ऐसी सुविधा का उपयोग करता है, जो API स्तर 8 पर उपलब्ध हो गई है, और यह सुविधा 10 के स्तर पर अप्रचलित हो गई है, तो यदि आप 10 से ऊपर की किसी भी चीज के लिए अपना targetSdkVersion बढ़ाते हैं, तो आपके उपयोगों को समायोजित करने के लिए कोई अनुकूलता कोड उपलब्ध नहीं होगा। नए OS स्तर पर वह सुविधा।
कार्ल

(कंटीन्यूइंग): जबकि, यदि आप अपने टारगेट को 8 वें स्तर पर छोड़ते हैं, तो, जबकि आप उच्च स्तर पर शुरू की गई सुविधाओं का उपयोग नहीं कर पाएंगे, तो लेवल 8 पर आपके काम करने के लिए लेवल 8 के उपयोग की अनुमति देने के लिए अनुकूलता कोड लागू होगा। उच्च ओएस का स्तर।
कार्ल

(जारी): इसे इस तरह से सोचें: मान लीजिए कि आपने कुछ कोड लिखे थे जब उच्चतम Android स्तर उपलब्ध था 8, और आपने अपना targetSdkVersion को 8 पर सेट किया था (क्योंकि उस समय उच्चतम स्तर था)। अब, एंड्रॉइड के कुछ नए रिलीज़ सामने आए, और आपके द्वारा उपयोग किए गए स्तर 8 की कुछ सुविधाएँ अनुपलब्ध हो गईं। जिन उपयोगकर्ताओं के पास अभी भी आपका पुराना एपीके है, उन्हें त्रुटियों का अनुभव नहीं करना चाहिए, उन्हें करना चाहिए? इसलिए, यह सुनिश्चित करने के लिए कि संगतता कोड स्वचालित रूप से आपके पुराने एपीआई कॉल को समायोजित करने के लिए लागू किया जाता है, जब वे उपयोगकर्ता के ओएस के एक नए संस्करण को चला रहे हों, तब उन्हें कुछ उचित करने के लिए कॉल करें।
कार्ल

50

एक अवधारणा को हमेशा उदाहरणों के साथ दिया जा सकता है । मुझे एंड्रॉइड फ्रेमवर्क स्रोत कोड में खुदाई करने और एंड्रॉइड डेवलपर साइटों और संबंधित स्टैक्वेरफ़्लो थ्रेड्स के सभी दस्तावेजों को पढ़ने के बाद भी कुछ प्रयोगों को करने तक इन अवधारणा को समझने में परेशानी हुई। मैं उन दो उदाहरणों को साझा करने जा रहा हूं, जिन्होंने मुझे इन अवधारणाओं को पूरी तरह से समझने में बहुत मदद की।

एक DatePickerDialog उस स्तर के आधार पर अलग-अलग दिखाई देगा, जो आप AndroidManifest.xml फ़ाइल के टार्गेटकॉवर्सन ( <uses-sdk android:targetSdkVersion="INTEGER_VALUE"/>) में डालते हैं । यदि आप मान 10 या उससे कम सेट करते हैं, तो आपका DatePickerDialog बाईं ओर दिखेगा। दूसरी ओर, यदि आप मान 11 या अधिक निर्धारित करते हैं, तो एक बहुत ही समान कोड के साथ एक DatePickerDialog सही लगेगा ।

DatePickerDialog targetSDKversion 10 या निम्न के साथ देखें DatePickerDialog targetSDKversion 11 या उच्चतर के साथ देखें

इस नमूने को बनाने के लिए मैंने जिस कोड का उपयोग किया है वह सुपर-सरल है। MainActivity.javaदिखता है:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onClickButton(View v) {
        DatePickerDialog d = new DatePickerDialog(this, null, 2014, 5, 4);
        d.show();       
    }
}

और activity_main.xmlदिखता है:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="onClickButton"
    android:text="Button" />
</RelativeLayout>


बस। यह वास्तव में हर कोड है जिसे मुझे यह परीक्षण करने की आवश्यकता है।

और जब आप एंड्रॉइड फ्रेमवर्क स्रोत कोड देखते हैं तो यह परिवर्तन क्रिस्टल स्पष्ट होता है । यह इस प्रकार है:

public DatePickerDialog(Context context,
    OnDateSetListener callBack,
    int year,
    int monthOfYear,
    int dayOfMonth,
    boolean yearOptional) {
        this(context, context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB
                ? com.android.internal.R.style.Theme_Holo_Light_Dialog_Alert
                : com.android.internal.R.style.Theme_Dialog_Alert,
        callBack, year, monthOfYear, dayOfMonth, yearOptional);
}

जैसा कि आप देख सकते हैं, फ्रेमवर्क को वर्तमान टारगेटोकवर्सन मिलता है और विभिन्न थीम सेट की जाती है। इस तरह का कोड स्निपेट ( getApplicationInfo().targetSdkVersion >= SOME_VERSION) एंड्रॉइड फ्रेमवर्क में यहां और वहां पाया जा सकता है।

एक अन्य उदाहरण WebView वर्ग के बारे में है । वेबव्यू क्लास के सार्वजनिक तरीकों को मुख्य धागे पर बुलाया जाना चाहिए, और यदि नहीं, तो रनटाइम सिस्टम एक को फेंकता है RuntimeException, जब आप टारगेटोकवर्सन 18 या उच्चतर सेट करते हैं। इस व्यवहार को इसके स्रोत कोड के साथ स्पष्ट रूप से वितरित किया जा सकता है । ऐसा ही लिखा है।

sEnforceThreadChecking = context.getApplicationInfo().targetSdkVersion >=
            Build.VERSION_CODES.JELLY_BEAN_MR2;

if (sEnforceThreadChecking) {
    throw new RuntimeException(throwable);
}


एंड्रॉइड डॉक्टर कहता है, " जैसा कि एंड्रॉइड प्रत्येक नए संस्करण के साथ विकसित होता है, कुछ व्यवहार और यहां तक ​​कि दिखावे भी बदल सकते हैं ।" इसलिए, हमने व्यवहार और उपस्थिति परिवर्तन को देखा है, और यह परिवर्तन कैसे पूरा हुआ है।

सारांश में, एंड्रॉइड डॉक्टर का कहना है कि " यह विशेषता (targetSdkVersion) सिस्टम को सूचित करती है कि आपने लक्ष्य संस्करण के खिलाफ परीक्षण किया है और सिस्टम को आपके संस्करण की लक्ष्य-संगतता को बनाए रखने के लिए किसी संगतता व्यवहार को सक्षम नहीं करना चाहिए " यह WebView मामले के साथ वास्तव में स्पष्ट है। यह तब तक ठीक था जब तक कि JELLY_BEAN_MR2 ने वेब-क्लास की सार्वजनिक पद्धति को मुख्य-सूत्र पर कॉल करने के लिए जारी नहीं किया। यदि Android फ्रेमवर्क JELLY_BEAN_MR2 उपकरणों पर रनटाइम एक्ससेप्शन फेंकता है तो यह बकवास है। यह सिर्फ अपनी रुचि के लिए नए शुरू किए गए व्यवहारों को सक्षम नहीं करना चाहिए, जो घातक परिणाम का कारण बनता है। तो, हमें क्या करना है, यह जांचना है कि क्या कुछ लक्ष्य-निर्धारण पर सब कुछ ठीक है। हमें उच्च लक्ष्य-स्थापना के साथ उपस्थिति बढ़ाने जैसा लाभ मिलता है,

संपादित करें: अस्वीकरण। DatePickerDialog कंस्ट्रक्टर जो वर्तमान टारगेटोकवर्सन (जो मैंने ऊपर दिखाया था) के आधार पर अलग-अलग थीम सेट करता है, वास्तव में बाद के कमिट में बदल दिया गया है । फिर भी मैंने उस उदाहरण का उपयोग किया है, क्योंकि तर्क को नहीं बदला गया है, और उन कोड स्निपेट में स्पष्ट रूप से targetSDKversion अवधारणा दिखाई देती है।


2
"हमें उच्च लक्ष्य निर्धारण के साथ उपस्थिति बढ़ाने जैसा लाभ मिलता है, लेकिन यह जिम्मेदारी के साथ आता है।" यदि उन्होंने डॉक्स में इस लाइन का उल्लेख किया है, तो मैं इसकी तलाश नहीं करूंगा।
पल्प_फिक्शन

@ The मुझे दो सवाल हैं: 1.) ऊपर दी गई तारीख के उदाहरण में, यदि आपने टार्गेटवॉक को 10 या उससे कम पर सेट किया है और एप्लिकेशन को नवीनतम एंड्रॉइड पर चलने वाले डिवाइस पर चलाएं (जैसे एपीआई 22) तो डेटपिकर अभी भी पुराने जैसा दिखाएगा बाईं तस्वीर पर? 2.) क्या इसका मतलब यह है कि मैं अपने minSdkVersion की तुलना में किसी भी संस्करण के लिए हमेशा टारगेट सेटड्रोवर्सन सेट कर सकता हूं (जैसे कि उन यूआई एन्हांसमेंट्स को प्राप्त करना है जैसे कि उच्च एपीआई से खस्ता खजूर) किसी भी परीक्षण की आवश्यकता के बिना ( प्रति se ) जब तक मैं अपना कोडबेस प्रतिबंधित करता हूं मेरे minSdkVersion में उपलब्ध केवल API का उपयोग करने के लिए
डेमिलोला ओलोवुकेरे

@ ओलोकेरे 1) हां। बस इसके लिए दौड़ें। 2) यदि आप minSDKVersion से अधिक है तो आप किसी भी संस्करण को टारगेट कर सकते हैं। लेकिन आपको अभी भी इसका परीक्षण करने की आवश्यकता है कि यह लक्षित संस्करण पर ठीक काम करता है या नहीं। इससे कोई फर्क नहीं पड़ता कि आप minSDKVersion api से चिपके हैं या नहीं। DatePicker उदाहरण के बारे में सोचो।

ऐसे मामले के बारे में सोचें, जब आपने न्यूनतम संस्करण 14 और लक्ष्य sdk संस्करण को 16 पर सेट किया था, और आपने केवल 14 या उससे कम के एपीस का उपयोग किया था। मान लीजिए कि आपने TextView का उपयोग किया है, जो एपीआई स्तर में प्रस्तुत है। 1. क्या होगा?

@ 김준호 धन्यवाद। लेकिन आपके दूसरे उत्तर के लिए मैं उलझन में हूं। यदि मेरा कोड minSdkVersion में केवल API का उपयोग करता है और मैं उच्च SDK को लक्षित करता हूं, तो मुझे परीक्षण की आवश्यकता क्यों है? DatePicker उदाहरण के बारे में सोचकर, उच्च targetSdkVersion ने केवल DatePicker विजेट के रूप में सुधार किया और कुछ भी नहीं टूटा क्योंकि मैंने API में किसी भी कोड का उपयोग minSdkVersion की तुलना में अधिक नहीं किया। मैं केवल उच्च targetSdkVersion चाहता हूं क्योंकि मैं विगेट्स का नया रूप और अनुभव चाहता हूं, यह नहीं कि मैं उच्च एपीआई पर पेश की गई नई सुविधाओं का उपयोग करना चाहता हूं
दमिलोला ओलोवुकेरे

21

सारांश चाहने वालों के लिए,

android:minSdkVersion

आपके आवेदन का समर्थन करने तक न्यूनतम संस्करण है। यदि आपके डिवाइस में Android का निचला संस्करण है, तो ऐप इंस्टॉल नहीं होगा।

जबकि,

android:targetSdkVersion

वह API स्तर है, जिस तक आपका ऐप चलाने के लिए डिज़ाइन किया गया है। मतलब, आपके फ़ोन के सिस्टम को आगे संगतता बनाए रखने के लिए किसी भी संगतता व्यवहार का उपयोग करने की आवश्यकता नहीं है क्योंकि आपने इस एपीआई तक परीक्षण किया है।

आपका एप्लिकेशन अभी भी दिए गए से अधिक Android संस्करणों पर चलेगा, targetSdkVersionलेकिन Android संगतता व्यवहार में किक करेगा।

फ्रीबी -

android:maxSdkVersion

यदि आपके डिवाइस का API संस्करण अधिक है, तो ऐप इंस्टॉल नहीं होगा। अर्थात। यह अधिकतम एपीआई है जिसके लिए आप अपने ऐप को इंस्टॉल करने की अनुमति देते हैं।

अर्थात। MinSDK -4 के लिए, maxSDK - 8, targetSDK - 8 मेरा ऐप न्यूनतम 1.6 पर काम करेगा, लेकिन मैंने उन विशेषताओं का भी उपयोग किया है जो केवल 2.2 में समर्थित हैं जो कि 2.2 डिवाइस पर स्थापित होने पर दिखाई देगी। साथ ही, अधिकतम 1 जीबीएसके - 8 के लिए, यह ऐप एपीआई> 8 का उपयोग कर फोन पर इंस्टॉल नहीं होगा।

इस उत्तर को लिखने के समय, एंड्रॉइड डॉक्यूमेंटेशन यह समझाने में बहुत अच्छा काम नहीं कर रहा था। अब यह बहुत अच्छी तरह से समझाया गया है। इसे यहां देखें


'अधिकतम संस्करण है जहां से आपको ऐप विरासत में मिली हैं।' : ये गलत है। यह न्यूनतम संस्करण है जहां से आपके ऐप को विरासत में मिली सुविधाएँ हैं - यानी पहला संस्करण जिसमें आपके ऐप द्वारा उपयोग की जाने वाली आवश्यक सुविधाएँ शामिल हैं।
रिचीएचएच

अंग्रेजी ट्रिकी भाषा है। उत्तर में दिए गए मेरे उदाहरण को पढ़ें। मुझे लगता है कि मैं वहाँ समझ बना रहा हूँ। :)
डैरन

मुझे पांडित्य नहीं आ रहा है और अंग्रेजी इस समूह में सहायक भाषा है। मुश्किल या यह नहीं कह रहा है कि "अधिकतम संस्करण जहां ऐप ने समर्थन सुविधाओं का समर्थन किया है" न केवल गलत है: इसकी पूरी तरह से 180 डिग्री गलत है। यह एफआईआरएसटी या न्यूनतम संस्करण है जो आपके एप्लिकेशन की सभी इच्छित विशेषताओं का समर्थन करता है, बिना फॉलबैक संगतता मोड / लाइब्रेरी का उपयोग किए।
रिची एचएच

9

यदि आपको उदाहरण के लिए कुछ संकलित त्रुटियां मिलती हैं:

<uses-sdk
            android:minSdkVersion="10"
            android:targetSdkVersion="15" />

private void methodThatRequiresAPI11() {
        BitmapFactory.Options options = new BitmapFactory.Options();
                options.inPreferredConfig = Config.ARGB_8888;  // API Level 1          
                options.inSampleSize = 8;    // API Level 1
                options.inBitmap = bitmap;   // **API Level 11**
        //...
    }

आपको संकलित त्रुटि मिलती है:

फ़ील्ड के लिए API स्तर 11 (वर्तमान न्यूनतम 10 है) की आवश्यकता है: android.graphics.BitmapFactory $ विकल्प # inBitmap

एंड्रॉइड डेवलपमेंट टूल्स (एडीटी) के संस्करण 17 के बाद से एक नया और बहुत उपयोगी एनोटेशन है @TargetApiजो इसे बहुत आसानी से ठीक कर सकता है। समस्यात्मक घोषणा को घेरने की विधि से पहले इसे जोड़ें:

@TargetApi
private void methodThatRequiresAPI11() {            
  BitmapFactory.Options options = new BitmapFactory.Options();
      options.inPreferredConfig = Config.ARGB_8888;  // API Level 1          
      options.inSampleSize = 8;    // API Level 1

      // This will avoid exception NoSuchFieldError (or NoSuchMethodError) at runtime. 
      if (Integer.valueOf(android.os.Build.VERSION.SDK) >= android.os.Build.VERSION_CODES.HONEYCOMB) {
        options.inBitmap = bitmap;   // **API Level 11**
            //...
      }
    }

अब कोई संकलन त्रुटियाँ नहीं हैं और यह चलेगा!

EDIT: इसके परिणामस्वरूप एपीआई स्तर पर रनटाइम त्रुटि 11. 11 से कम होगी। 11 या उच्चतर पर यह बिना किसी समस्या के चलेगा। इसलिए आपको यह सुनिश्चित करना चाहिए कि आप इस पद्धति को संस्करण जांच द्वारा संरक्षित निष्पादन पथ पर बुलाएं। लक्ष्यएपीआई आपको इसे संकलित करने की अनुमति देता है लेकिन आप इसे अपने जोखिम पर चलाते हैं।


1
मैं इसे लेकर उलझन में हूं। यदि आप अपने ऐप को बाद में sdk 10 वाले सिस्टम में चलाते हैं तो क्या होगा?
फ्रेंक मारजोआ

यह ऑप्शंस को एक्सेप्ट करेगा। बिटमैप स्टेटमेंट और ऐप को ठीक काम करना चाहिए।
निंजा कैडर

1

android:minSdkVersionऔर android:targetSdkVersionदोनों ही Integer value हैं जो हमें एंड्रॉइड मेनिफ़ेस्ट फ़ाइल में घोषित करने की आवश्यकता है लेकिन दोनों में अलग-अलग गुण हैं।

android:minSdkVersion:Android ऐप चलाने के लिए यह न्यूनतम आवश्यक API स्तर है। अगर हम उसी ऐप को लोअर एपीआई वर्जन पर इंस्टॉल करेंगे तो पार्सर एरर दिखाई देगा, और एप्लिकेशन सपोर्ट न करने की समस्या सामने आएगी।

android:targetSdkVersion:लक्ष्य sdk संस्करण ऐप के लक्ष्य API स्तर को सेट करना है। यदि यह विशेषता प्रकट में घोषित नहीं की जाती है, तो minSdk संस्करण आपका TargetSdk संस्करण होगा। यह हमेशा सच होता है कि "हम एपीआई के सभी उच्चतर संस्करणों में ऐप सपोर्ट इंस्टालेशन जिसे हमने टार्गेटस्कैक वर्जन के रूप में घोषित किया है"। एप्लिकेशन सीमित लक्ष्य बनाने के लिए हमें अपनी मैनिफ़ेस्ट फ़ाइल में maxSdkVersion घोषित करने की आवश्यकता है ...


0

यदि आप ऐसे एप्लिकेशन बना रहे हैं, जिनके लिए खतरनाक अनुमतियों की आवश्यकता होती है और 23 या उससे ऊपर के लक्ष्य को निर्धारित करना चाहिए, तो आपको सावधान रहना चाहिए। यदि आप रनटाइम पर अनुमतियों की जांच नहीं करते हैं, तो आपको एक SecurityException मिलेगी और यदि आप एक कोशिश ब्लॉक के अंदर कोड का उपयोग कर रहे हैं, उदाहरण के लिए ओपन कैमरा, अगर आप लॉगकैट की जांच नहीं करते हैं, तो त्रुटि का पता लगाना मुश्किल हो सकता है।


0

लक्ष्य sdk वह संस्करण है जिसे आप लक्षित करना चाहते हैं, और न्यूनतम sdk न्यूनतम है।

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