يمكن لتطبيقات Android ضبط عدد من خصائص إصدار حزمة SDK في ملف
build.gradle
. توضّح مستندات Android build.gradle
معنى هذه السمات للتطبيق بشكل عام. يوضّح هذا المستند كيف تؤثّر هذه الخصائص في عمليات إنشاء NDK.
compileSdkVersion
ليس لهذه السمة أي تأثير في إصدارات NDK. يتم تحديد مدى توفّر واجهة برمجة التطبيقات في 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.
يمكنك استخدام dlopen()
/dlsym()
أو مراجع ضعيفة لواجهة برمجة التطبيقات لاستدعاء واجهات برمجة تطبيقات أحدث من تلك التي يحدّدها minSdkVersion
.
maxSdkVersion
ليس لهذه السمة أي تأثير في إصدارات NDK.
minSdkVersion
تحدّد قيمة minSdkVersion
المضبوطة في ملف build.gradle
واجهات برمجة التطبيقات المتاحة في وقت الإنشاء (راجِع compileSdkVersion لمعرفة سبب اختلاف ذلك عن عمليات إنشاء Java)، كما تحدّد الحد الأدنى لإصدار نظام التشغيل المتوافق مع الرمز البرمجي.
يستخدم NDK minSdkVersion
لتحديد الميزات التي يمكن استخدامها عند تجميع الرمز البرمجي. على سبيل المثال، تحدّد هذه السمة ميزات FORTIFY
المستخدَمة في libc، وقد تتيح أيضًا تحسينات في الأداء أو الحجم
(مثل تجزئة GNU أو RELR) للثنائيات غير المتوافقة مع
الإصدارات القديمة من Android. حتى إذا لم تستخدم أي واجهات برمجة تطبيقات جديدة، ستظل هذه السمة تتحكّم في الحد الأدنى لإصدار نظام التشغيل المتوافق مع الرمز البرمجي.
بالنسبة إلى التطبيقات الجديدة، يمكنك الاطّلاع على بيانات توزيع المستخدمين في "معالج المشروع الجديد" في Android Studio أو على apilevels.com. اختَر التوازن بين حصة السوق المحتملة وتكاليف الصيانة. كلما انخفضت قيمة minSdkVersion
،
زاد الوقت الذي ستستغرقه في حلّ الأخطاء القديمة وإضافة سلوكيات احتياطية
للميزات التي لم يتم تنفيذها بعد.
بالنسبة إلى تطبيق حالي، ارفع مستوى واجهة برمجة التطبيقات المستهدَف إلى minSdkVersion
عندما تصبح تكاليف الصيانة غير مجدية، أو اخفضه إذا كان المستخدمون يطلبون ذلك وكان ذلك يستحق تكاليف الصيانة الجديدة. تتضمّن Play Console مقاييس خاصة بتوزيع المستخدمين في تطبيقك.
يتم توفير minSdkVersion
لتطبيقك للمعالج المسبق
من خلال الماكرو __ANDROID_MIN_SDK_VERSION__
(الماكرو القديم __ANDROID_API__
مطابق له، ولكن يُفضّل استخدام الماكرو الأول لأنّ معناه أكثر وضوحًا). يتم تعريف هذا الماكرو تلقائيًا بواسطة Clang، لذا لا حاجة إلى تضمين أي عنوان لاستخدامه. يتم دائمًا تحديد هذا الماكرو في إصدارات NDK.