الاعتماد المتبادل بين الأدوات والمكتبات

تبعيات التصميم هي مكوّنات خارجية مطلوبة لإنشاء مشروعك بنجاح. وقد يعتمد التصميم على المكتبات والمكوّنات الإضافية والمشاريع الفرعية وحزمة تطوير البرامج (SDK) لنظام التشغيل Android وأدوات مثل برامج التحويل البرمجي Kotlin وJava وبيئات التطوير، مثل Android Studio وGradle.

ويمكن أن تتطلّب كل تبعية تبعيات أخرى. ونطلق على هذه التبعيات الانتقالية، ويمكن أن تزيد بسرعة من إجمالي التبعيات التي يستخدمها تطبيقك. عندما تريد ترقية تبعية، سواء كانت مكتبة أو أداة أو حزمة Android SDK، فإن هذه الترقية يمكن أن تتصاعد، مما يؤدي إلى ترقية العديد من التبعيات الأخرى.

وغالبًا ما لن يسبب هذا الأمر أي مشاكل، حيث تتّبع العديد من المكتبات نظامًا يُعرف باسم تحديد الإصدارات الدلالية. تحدّ هذه المكتبات من أنواع التغييرات التي تجريها لتوفير التوافق مع الإصدارات الأقدم.

يتّبع التنسيق الدلالي للإصدار تنسيق major.minor.patch. على سبيل المثال، في الإصدار 4.8.3، يمثّل الرقم 4 رقم الإصدار major، والرقم 8 هو الإصدار minor والرقم 3 هو رقم patch. عندما يتغير الجزء major، قد تتضمن المكتبة تغييرات قد تؤدي إلى أعطال في واجهة برمجة التطبيقات أو السلوك. ويمكن أن يؤثر ذلك في أداء تصميمك أو تطبيقك

عند تغيير الجزء minor (الميزات الجديدة) أو patch (إصلاح الأخطاء)، يخبرك مطوِّرو المكتبة بأنّ المكتبة لا تزال متوافقة ومن المفترض ألا تؤثر في تطبيقك.

من المهم ملاحظة هذه التغييرات التي يمكن أن تساعدك العديد من أدوات الترقية التابعة.

العلاقات في إصدارك

تحتوي إصدارات Android على علاقات بين ما يلي:

  • رمز المصدر: التعليمات البرمجية والموارد التي يمكنك التحكّم فيها
  • تبعيات المكتبة - المكتبات أو الوحدات الخارجية التي يتضمنها مشروعك والمشروعات الفرعية عند إنشاء
  • الأدوات - برامج التجميع والمكوّنات الإضافية وحِزم تطوير البرامج (SDK) التي تترجم المصدر إلى تطبيق أو مكتبة
إنشاء التبعيات وعلاقاتها
الشكل 1. بناء العلاقات

رمز مصدر

الرمز المصدر هو رمز Kotlin أو Java الذي تكتبه في تطبيقك أو مكتبتك. (للحصول على تفاصيل عن استخدام C++ ، راجع Android NDK.)

تعتمد رمز المصدر على المكتبات (بما في ذلك مكتبات وقت تشغيل Kotlin وJava) وحزمة تطوير البرامج (SDK) لنظام التشغيل Android، وتتطلّب برنامج الترميز البرمجي المقابل لـ Kotlin أو Java.

يتضمّن بعض الرموز البرمجية المصدرية تعليقات توضيحية تتطلّب معالجة إضافية. على سبيل المثال، إذا كنت تكتب رمز Jetpack Compose، يمكنك إضافة تعليقات توضيحية، مثل @Composable التي يجب معالجتها من خلال المكوّن الإضافي للمكون الإضافي Compose Kotlin. يمكن معالجة التعليقات التوضيحية الأخرى باستخدام معالج رمز Kotlin (KSP) أو أدوات معالجة التعليقات التوضيحية منفصلة.

تبعيات المكتبة

تحتوي المكتبات على رمز بايت يتم سحبه كجزء من تطبيقك. قد يكون هذا المشروع عبارة عن Java JAR أو مكتبة Android (AAR) أو مشروعًا فرعيًا في إصدارك. تلتزم العديد من المكتبات بنظام الإصدارات الدلالية، ما يمكن أن يساعدك في معرفة متى تظل متوافقة (أو لا) عند الترقية.

قد تعتمد المكتبات على مكتبات أخرى لإعادة استخدامها، ما يُعرف باسم التبعية غير المباشرة. وهذا يقلل من التبعيات التي يجب عليك إدارتها بشكل صريح؛ حيث تحدد التبعيات التي تستخدمها مباشرة، وتسحبها Gradle إلى جانب تلك التبعيات المنتقلة. يُرجى العِلم أنّه أثناء ترقية التبعيات المباشرة، قد تؤدي إلى ترقية هذه التبعيات المتعدّدة.

في بعض الأحيان، قد تتطلّب المكتبة الحد الأدنى من إصدارات حزمة تطوير البرامج (SDK) لنظام التشغيل Android في وقت التشغيل (minSdk) أو وقت الترجمة (compileSdk). ويُعدّ ذلك ضروريًا عندما تستخدم المكتبة وظائف مضمّنة في حزمة تطوير البرامج (SDK) لنظام التشغيل Android أو واجهات برمجة التطبيقات JDK المقدَّمة. minSdk الفعّال لتطبيقك هو أعلى minSdk يطلبها تطبيقك وجميع مكتباته المباشرة وغير المباشرة.

قد يتطلب استخدام بعض المكتبات استخدام مكوّن إضافي محدّد من Gradle. غالبًا ما تُثبِّت هذه المكونات الإضافية المساعِدة معالجات رموز Kotlin أو معالجات التعليقات التوضيحية الأخرى التي تُنشئ رمزًا أو تعدّل عملية تجميع المصدر لتسهيل استخدامك لميزات المكتبة. على سبيل المثال، يشتمل Jetpack Room على تعليقات توضيحية وبروتوكول KSP يحوّلها إلى رمز تم إنشاؤه لاسترداد البيانات وتعديلها في قاعدة بيانات. يتطلب Jetpack Compose استخدام المكوّن الإضافي لمجمّع Compose من أجل تعديل الدوال المُشارَك عليها تعليقات توضيحية لإدارة كيفية إعادة تشغيل هذه الدالة ووقت إعادة تشغيلها.

الأدوات

قاعدة مخروطية

Gradle هي أداة الإنشاء التي تقرأ ملفات الإنشاء وتُنشئ تطبيقك أو مكتبتك، كما توفّر واجهة برمجة تطبيقات للمكوّنات الإضافية لتوسيع إمكاناتها. يُشغِّل Gradle عمليات متعدّدة على جهاز افتراضي واحد أو أكثر من أجهزة Java، وتستدعي مكوّنات Java الإضافية أدوات Java داخل حزمة JDK.

مكونات Gradle الإضافية

تعمل مكوّنات Gradle الإضافية على توسيع نطاق Gradle من خلال تحديد مهام وإعدادات جديدة. يؤدي تطبيق مكوّن إضافي على عملية الإنشاء إلى تفعيل إمكانات إنشاء محدّدة تم ضبطها كبيانات في نصوص إنشاء الإصدارات. بالنسبة إلى إصدارات Android، يُعدّ المكوّن الإضافي لنظام Gradle المتوافق مع Android (AGP) أهم مكوّن إضافي من Gradle.

محولات برمجية

يحول المحول البرمجي لـ Kotlin أو Java رمز المصدر إلى رمز بايت قابل للتنفيذ. يعرِض مُجمِّع Kotlin واجهة برمجة تطبيقات للمكوّنات الإضافية تتيح إجراء التحليل الخارجي وإنشاء الرموز البرمجية داخل المُجمِّع مباشرةً، والوصول إلى بنية الرمز البرمجي المفسَّر.

المكوّنات الإضافية لبرامج التحويل البرمجي

تُجري مكوّنات الترميز الإضافية عمليات التحليل وإنشاء الرموز البرمجية داخل مكوّن الترميز Kotlin أثناء تحليل مكوّن الترميز Kotlin لرمزك البرمجي، ويتم تثبيتها عند تطبيق مكوّنات Gradle الإضافية على عملية الإنشاء.

Android SDK

تحتوي حزمة تطوير البرامج (SDK) لنظام التشغيل Android على نظام Android وواجهات برمجة تطبيقات Java لإصدار محدّد من Android وأدواته المقابلة. تساعدك هذه الأدوات في إدارة حِزم تطوير البرامج (SDK) وإنشاء تطبيقاتك والتواصل مع أجهزة Android ومحاكاتها.

يقدّم كل إصدار من حزمة تطوير برامج Android واجهات برمجة تطبيقات Java معيّنة يمكن لرمز المصدر الوصول إليها، كما يقدّم ميزة إزالة السكر لاستخدام واجهات برمجة التطبيقات هذه على إصدارات Android الأقدم.

JDK

حزمة تطوير Java التي تحتوي على مكتبات Java وملفات تنفيذية لتجميع رمز مصدر Java وتشغيل تطبيقات Java هناك العديد من ألعاب JDK في إصدار Android. راجِع إصدارات Java في إصدارات Android للحصول على مزيد من التفاصيل.

نطاقات Gradle

يجمع Gradle العناصر الاعتمادية للمكتبات في نطاقات مختلفة (يُطلق عليها اسم الإعدادات في Gradle API)، ما يتيح لك تحديد مجموعات مختلفة من العناصر الاعتمادية للمكتبات لاستخدامها في أجزاء مختلفة من الإنشاء. على سبيل المثال، قد لا تريد تضمين مكتبات اختبار مثل JUnit في تطبيقك أو مكتبتك المنشورة، ولكنك تريد تضمينها عند إنشاء اختبارات الوحدة وتنفيذها. يمكنك أيضًا استخدام النطاقات لإضافة معالجات الرموز أو التعليقات التوضيحية لتحليل التعليمات البرمجية الخاصة بك.

على سبيل المثال، يحدّد AGP نطاقَي implementation وapi، وطريقتك في تحديد ما إذا كان يجب إظهار التبعية لمستخدمي مشروعك الفرعي أم لا. يُرجى الاطِّلاع على ضبط التبعيات للحصول على أوصاف هذه النطاقات والنطاقات الأخرى المستخدمة في إصدار Android.

أضِف تبعيات المكتبة في العنصر dependencies في ملفات الإنشاء، إما على شكل سلاسل group:artifact:version:

Kotlin

// In a module-level build script
// explicit dependency strings ("group:artifact:version")
dependencies {
    implementation("com.example:library1:1.2.3")
    api("com.example:library2:1.1.1")
}

رائع

// In a module-level build script
// explicit dependency strings ("group:artifact:version")
dependencies {
    implementation 'com.example:library1:1.2.3'
    api 'com.example:library2:1.1.1'
}

أو في كتالوج الإصدارات:

# Version catalog - gradle/libs.versions.toml
[versions]
exampleLib = "1.2.3"
examplePlugin = "2.3.4"

[libraries]
example-library = { group = "com.example", name = "library", version.ref = "exampleLib" }

[plugins]
example-plugin = { id = "com.example.plugin", version.ref = "examplePlugin" }

وتحديد المتغيرات التي تم إنشاؤها في ملفات الإصدار:

Kotlin

// In a module-level build script
// Using a version catalog
plugins {
    alias(libs.plugins.example.plugin)
}

dependencies {
    implementation(libs.example.library)
}

رائع

// In a module-level build script
// Using a version catalog
plugins {
    alias(libs.plugins.example.plugin)
}

dependencies {
    implementation libs.example.library
}