Android SDK वर्शन की प्रॉपर्टी

Android ऐप्लिकेशन, अपनी build.gradle फ़ाइल में एसडीके टूल के वर्शन की कई प्रॉपर्टी सेट कर सकते हैं. Android build.gradle के दस्तावेज़ में बताया गया है कि ऐप्लिकेशन के लिए, उन प्रॉपर्टी का क्या मतलब है. इस दस्तावेज़ में बताया गया है कि ये प्रॉपर्टी, NDK बिल्ड को कैसे प्रभावित करती हैं.

compileSdkVersion

इस प्रॉपर्टी का, NDK बिल्ड पर कोई असर नहीं पड़ता. एनडीके के लिए एपीआई की उपलब्धता, minSdkVersion के हिसाब से तय होती है. ऐसा इसलिए होता है, क्योंकि C++ सिंबल को लाइब्रेरी लोड होने के समय ही तुरंत हल कर दिया जाता है. वहीं, Java में इन्हें पहली बार कॉल करने पर हल किया जाता है. minSdkVersion में उपलब्ध नहीं होने वाले किसी भी सिंबल का इस्तेमाल करने पर, लाइब्रेरी उन ओएस वर्शन पर लोड नहीं होगी जिनमें नया एपीआई नहीं है. भले ही, उन एपीआई को कॉल किया जाएगा या नहीं.

नए ऐप्लिकेशन के लिए, उपलब्ध सबसे नया वर्शन चुनें. मौजूदा ऐप्लिकेशन के लिए, इसे अपनी सुविधा के हिसाब से नए वर्शन में अपडेट करें.

targetSdkVersion

Java की तरह, आपके ऐप्लिकेशन का targetSdkVersion, नेटिव कोड के रनटाइम के व्यवहार को बदल सकता है. सिस्टम में होने वाले बदलावों को, सिर्फ़ उन ऐप्लिकेशन पर लागू किया जाता है जिनमें targetSdkVersion, ओएस के उस वर्शन के बराबर या उससे ज़्यादा हो जिसमें बदलाव किया गया था.

नए ऐप्लिकेशन के लिए, उपलब्ध सबसे नया वर्शन चुनें. किसी मौजूदा ऐप्लिकेशन के लिए, इसे नए वर्शन में अपडेट करें. इसके लिए, compileSdkVersion को अपडेट करने के बाद, अपनी सुविधा के हिसाब से अपडेट करें.

आम तौर पर, ऐप्लिकेशन डेवलपर को अपने ऐप्लिकेशन के targetSdkVersion के बारे में पता होता है. हालांकि, यह एपीआई लाइब्रेरी डेवलपर के लिए काम का है. ऐसा इसलिए, क्योंकि उन्हें यह नहीं पता होता कि उनके उपयोगकर्ता कौनसे targetSdkVersion चुनेंगे.

रनटाइम के दौरान, किसी ऐप्लिकेशन के इस्तेमाल किए गए targetSdkVersion को पाने के लिए, android_get_application_target_sdk_version() को कॉल किया जा सकता है. यह एपीआई, एपीआई लेवल 24 और इसके बाद के वर्शन में उपलब्ध है. इस फ़ंक्शन का सिग्नेचर यह है:

/**
 * Returns the `targetSdkVersion` of the caller, or `__ANDROID_API_FUTURE__` if
 * there is no known target SDK version (for code not running in the context of
 * an app).
 *
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the AndroidManifest.xml `targetSdkVersion`.
 *
 * See also android_get_device_api_level().
 *
 * Available since API level 24.
 */
int android_get_application_target_sdk_version() __INTRODUCED_IN(24);

अन्य व्यवहार में होने वाले बदलाव, डिवाइस के एपीआई लेवल पर निर्भर कर सकते हैं. android_get_device_api_level() को कॉल करके, उस डिवाइस का एपीआई लेवल पता लगाया जा सकता है जिस पर आपका ऐप्लिकेशन चल रहा है. इस फ़ंक्शन का सिग्नेचर यह है:

/**
 * Returns the API level of the device we're actually running on, or -1 on failure.
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the Java `Build.VERSION.SDK_INT` API.
 *
 * See also android_get_application_target_sdk_version().
 */
int android_get_device_api_level();

डिवाइस के एपीआई लेवल की जानकारी मिलने से, NDK कोड को प्लैटफ़ॉर्म में होने वाले व्यवहार से जुड़े बदलावों के बारे में डाइनैमिक तरीके से पता चलता है. एपीआई लेवल में मामूली बदलावों से, ऐप्लिकेशन के काम करने के तरीके में कोई बदलाव नहीं होता. साथ ही, फ़िलहाल हमारा एपीआई लेवल में मामूली बदलावों के साथ नई NDK सुविधा जोड़ने का कोई प्लान नहीं है. इसलिए, NDK कॉल से सीधे तौर पर डिवाइस का पूरा एपीआई लेवल पाने का कोई तरीका नहीं है.

minSdkVersion में बताए गए एपीआई से नए एपीआई को कॉल करने के लिए, dlopen()/dlsym() या एपीआई के कमज़ोर रेफ़रंस का इस्तेमाल किया जा सकता है.

maxSdkVersion

इस प्रॉपर्टी का, NDK बिल्ड पर कोई असर नहीं पड़ता.

minSdkVersion

आपकी build.gradle फ़ाइल में सेट किया गया minSdkVersion यह तय करता है कि बिल्ड के समय कौनसे एपीआई उपलब्ध हैं. यह जानने के लिए कि यह Java बिल्ड से अलग क्यों है, compileSdkVersion देखें. साथ ही, यह ओएस के उस वर्शन के बारे में बताता है जिस पर आपका कोड काम करेगा.

एनडीके, minSdkVersion का इस्तेमाल यह तय करने के लिए करता है कि आपके कोड को कंपाइल करते समय, किन सुविधाओं का इस्तेमाल किया जा सकता है. उदाहरण के लिए, यह प्रॉपर्टी तय करती है कि libc में FORTIFY की किन सुविधाओं का इस्तेमाल किया जाता है. यह परफ़ॉर्मेंस को बेहतर बनाने या साइज़ को कम करने वाली सुविधाओं (जैसे कि GNU हैश या RELR) को भी चालू कर सकती है. ये सुविधाएं, Android के पुराने वर्शन के साथ काम न करने वाले आपके बाइनरी के लिए होती हैं. अगर आपने किसी नए एपीआई का इस्तेमाल नहीं किया है, तब भी यह प्रॉपर्टी आपके कोड के लिए, ओएस के कम से कम उस वर्शन को कंट्रोल करती है जिस पर वह काम करता है.

नए ऐप्लिकेशन के लिए, Android Studio के New Project Wizard या apilevels.com पर जाकर, उपयोगकर्ता डिस्ट्रिब्यूशन का डेटा देखें. संभावित मार्केट शेयर और रखरखाव की लागत के बीच संतुलन बनाएं. minSdkVersion जितना कम होगा, आपको पुराने बग ठीक करने और उन सुविधाओं के लिए फ़ॉलबैक व्यवहार जोड़ने में उतना ही ज़्यादा समय लगेगा जिन्हें अभी तक लागू नहीं किया गया है.

अगर आपके पास पहले से कोई ऐप्लिकेशन है, तो उसके minSdkVersion को तब बढ़ाएं, जब पुराने एपीआई लेवल को बनाए रखने की लागत ज़्यादा हो. इसके अलावा, अगर उपयोगकर्ता इसकी मांग करते हैं और इसे बनाए रखने की लागत कम है, तो इसे कम करें. Play Console में, आपके ऐप्लिकेशन के उपयोगकर्ताओं के डिस्ट्रिब्यूशन से जुड़ी मेट्रिक मौजूद होती हैं.

आपके ऐप्लिकेशन का minSdkVersion, प्रीप्रोसेसर को __ANDROID_MIN_SDK_VERSION__ मैक्रो के ज़रिए उपलब्ध कराया जाता है. लेगसी __ANDROID_API__ भी एक जैसा है, लेकिन पहले वाले का इस्तेमाल करें, क्योंकि इसका मतलब ज़्यादा साफ़ तौर पर समझ में आता है. इस मैक्रो को Clang अपने-आप तय करता है. इसलिए, इसका इस्तेमाल करने के लिए किसी हेडर को शामिल करने की ज़रूरत नहीं होती. NDK बिल्ड के लिए, इस मैक्रो को हमेशा तय किया जाता है.