إضافة تبعيات إلى الإصدار

يُسهّل نظام تصميم Gradle في "استوديو Android" إمكانية تضمين برامج ثنائية خارجية أو وحدات مكتبة أخرى في تصميمك كتبعيات. ويمكن العثور على التبعيات على جهازك أو في مستودع بعيد، ويتم أيضًا تضمين أي تبعيات مؤقتة يتم الإعلان عنها تلقائيًا. توضّح هذه الصفحة كيفية استخدام التبعيات مع مشروع Android، بما في ذلك تفاصيل حول السلوكيات والتهيئات الخاصة بالمكون الإضافي Android لـ Gradle. للحصول على دليل مفاهيمي أكثر تفصيلاً حول تبعيات Gradle، يجب عليك أيضًا الاطّلاع على دليل Gradle لإدارة التبعية، ولكن تذكّر أنّ مشروع Android يجب أن يستخدم فقط إعدادات التبعية المحددة في هذه الصفحة.

أنواع التبعية

لإضافة تبعية إلى مشروعك، حدِّد إعدادًا للتبعية مثل implementation في القطعة dependencies من ملف build.gradle.kts الخاص بالوحدة.

على سبيل المثال، يتضمّن ملف build.gradle.kts التالي لوحدة تطبيق معيّنة ثلاثة أنواع مختلفة من التبعيات:

Kotlin

plugins {
    id("com.android.application")
}

android { ... }

dependencies {
    // Dependency on a local library module
    implementation(project(":mylibrary"))

    // Dependency on local binaries
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))

    // Dependency on a remote binary
    implementation("com.example.android:app-magic:12.3")
}

رائع

plugins {
    id 'com.android.application'
}

android { ... }

dependencies {
    // Dependency on a local library module
    implementation project(':mylibrary')

    // Dependency on local binaries
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    // Dependency on a remote binary
    implementation 'com.example.android:app-magic:12.3'
}

يطلب كل خيار من هذه الطرق نوعًا مختلفًا من تبعية المكتبة على النحو التالي:

اعتمادية وحدة المكتبة المحلية

Kotlin

implementation(project(":mylibrary"))

رائع

implementation project(':mylibrary')

يعلن هذا الإجراء عن اعتمادية على وحدة مكتبة Android باسم "mylibrary" (يجب أن يتطابق هذا الاسم مع اسم المكتبة المحدّد بـ include: في ملف settings.gradle.kts). عند إنشاء تطبيقك، يجمع نظام الإصدار وحدة المكتبة ويجمع المحتوى المجمَّع الناتج في التطبيق.

التبعية الثنائية المحلية

Kotlin

  implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
  

رائع

  implementation fileTree(dir: 'libs', include: ['*.jar'])
  

يعلن تطبيق Gradle عن التبعيات على ملفات JAR داخل دليل module_name/libs/ لمشروعك (لأنّ Gradle يقرأ المسارات المرتبطة بملف build.gradle.kts).

بدلاً من ذلك، يمكنك تحديد ملفات فردية على النحو التالي:

Kotlin

  implementation(files("libs/foo.jar", "libs/bar.jar"))
  

رائع

  implementation files('libs/foo.jar', 'libs/bar.jar')
  
التبعية الثنائية البعيدة

Kotlin

  implementation("com.example.android:app-magic:12.3")
  

رائع

  implementation 'com.example.android:app-magic:12.3'
  

وهذا في الواقع اختصار لما يلي:

Kotlin

  implementation(group = "com.example.android", name = "app-magic", version = "12.3")

رائع

  implementation group: 'com.example.android', name: 'app-magic', version: '12.3'

يؤدي هذا إلى إعلان الاعتماد على الإصدار 12.3 من مكتبة app-magic ضمن مجموعة مساحات الاسم "com.example.android".

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

إذا كنت تعتمد على تبعية AGP في وقت التجميع، فتأكد من إضافتها كتبعية صريحة. ولأنّ AGP يستخدم إعدادات api/implementation داخليًا، قد تتم إزالة بعض العناصر من مسار فئة التجميع، وقد يتغيّر مسار الفئة المجمّعة.

التبعيات الأصلية

بدءًا من الإصدار 4.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android، يمكن أيضًا استيراد التبعيات الأصلية بالأسلوب الموضّح في هذه الصفحة.

واعتمادًا على AAR الذي يعرض المكتبات الأصلية، ستصبح متاحة تلقائيًا لنظام التصميم الذي يستخدمه externalNativeBuild. للوصول إلى المكتبات من خلال التعليمات البرمجية الخاصة بك، عليك إنشاء رابط لها في النصوص البرمجية للإصدارات الأصلية. في هذه الصفحة، راجع استخدام التبعيات الأصلية.

إعدادات التبعية

داخل كتلة dependencies، يمكنك تعريف تبعية المكتبة باستخدام إعداد من العديد من إعدادات التبعية المختلفة (مثل implementation الموضّحة أعلاه). تزود كل تهيئة تبعية Gradle بتعليمات مختلفة حول كيفية استخدام التبعية. يصف الجدول التالي كل إعداد من الإعدادات التي يمكنك استخدامها للتبعية في مشروع Android الخاص بك. يقارن الجدول أيضًا هذه الإعدادات بتلك التي تم إيقافها نهائيًا في الإصدار 3.0.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android.

الإعدادات السُلوك
implementation يضيف Gradle التبعية إلى مسار فئة التجميع ويحزم التبعية إلى مخرجات الإصدار. في المقابل، عندما تضبط وحدتك إحدى العناصر التابعة لـ implementation، يعني ذلك إعلام Gradle بأنّك لا تريد أن تسرّب الوحدة التبعية إلى وحدات أخرى في وقت التجميع. ويعني ذلك أنّ الاعتمادية متاحة للوحدات الأخرى في وقت التشغيل فقط.

قد يؤدي استخدام إعداد الاعتمادية هذا بدلاً من api أو compile (متوقف نهائيًا) إلى تحسينات كبيرة في مدة الإصدار، لأنّه يقلل من عدد الوحدات التي يحتاج نظام التصميم إلى إعادة تجميعها. على سبيل المثال، إذا تغيّرت تبعية implementation واجهة برمجة التطبيقات الخاصة بها، لن يجمع Gradle سوى تلك التبعية والوحدات التي تعتمد عليها مباشرةً. يجب أن تستخدم معظم وحدات التطبيقات والاختبار هذه الإعدادات.

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

تعمل هذه الإعدادات تمامًا مثل compile (التي تم إيقافها نهائيًا)، ولكن يجب استخدامها بحذر مع الاعتماديات فقط التي تحتاج إلى تصديرها بشكل عفوي إلى مستهلكين آخرين من المستوى الثانوي. ويرجع ذلك إلى أنّه إذا غيّرت تبعية api واجهة برمجة التطبيقات الخارجية الخاصة بها، سيعيد Gradle تجميع جميع الوحدات التي يمكنها الوصول إلى تلك الاعتمادية في وقت التجميع. لذلك، يمكن أن يؤدي وجود عدد كبير من تبعيات api إلى زيادة كبيرة في وقت الإنشاء. ما لم تكن تريد عرض واجهة برمجة التطبيقات التابعة للتبعية في وحدة منفصلة، يجب أن تستخدم وحدات المكتبة تبعيات implementation بدلاً من ذلك.

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

إذا استخدمت هذه الإعدادات، يجب أن تتضمّن وحدة المكتبة شرطًا لوقت التشغيل للتحقّق من توفُّر هذه السمة الفرعية، ثم تغيير سلوكها على نحو ملائم كي تتمكّن من العمل في حال عدم توفّرها. ويساعد ذلك في تقليل حجم التطبيق النهائي عن طريق عدم إضافة عناصر اعتمادية مؤقتة ليست مهمة. تعمل هذه الإعدادات تمامًا مثل provided (التي تم إيقافها نهائيًا الآن).

ملاحظة: لا يمكنك استخدام الإعداد compileOnly مع تبعيات AAR.

runtimeOnly يضيف Gradle التبعية إلى ناتج الإصدار فقط، وذلك لاستخدامها في وقت التشغيل. أي أنه لا تتم إضافته إلى مسار فئة التجميع. وتعمل هذه الإعدادات تمامًا مثل apk (التي تم إيقافها نهائيًا الآن).
annotationProcessor

لإضافة دالة تبعية إلى مكتبة تُستخدم في معالجة التعليقات التوضيحية، عليك إضافتها إلى مسار فئة معالج التعليقات التوضيحية باستخدام الإعدادات annotationProcessor. ويرجع ذلك إلى أنّ استخدام هذه الإعدادات يؤدي إلى تحسين أداء الإصدار من خلال فصل مسار فئة التجميع عن مسار فئة معالج التعليقات التوضيحية. إذا عثر نظام Gradle على معالجات التعليقات التوضيحية على مسار فئة التجميع، سيتم إيقاف تجنب التجميع، ما يؤثر سلبًا في وقت الإصدار (يتجاهل Gradle 5.0 والإصدارات الأحدث معالجات التعليقات التوضيحية الموجودة في مسار فئة التجميع).

يفترض المكوّن الإضافي لنظام Gradle المتوافق مع Android أن تكون التبعية هي معالج للتعليقات التوضيحية إذا كان ملف JAR يحتوي على الملف التالي:

META-INF/services/javax.annotation.processing.Processor

إذا اكتشف المكوّن الإضافي معالج تعليقات توضيحية على مسار الفئة المجمّعة، سينتج عن ذلك خطأ في الإصدار.

ملاحظة: يجب أن تستخدم مشاريع Kotlin استخدام kapt للإعلان عن تبعيات معالج التعليقات التوضيحية.

lintChecks

استخدِم هذه الإعدادات لتضمين عمليات التحقّق من الوبر التي تريد أن ينفذها Gradle عند إنشاء مشروعك.

ملاحظة: عند استخدام الإصدار 3.4.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android والإصدارات الأحدث، لم تعُد إعدادات الاعتمادية هذه تجمع عمليات التحقّق من Lit في مشاريع "مكتبة Android". لتضمين تبعيات فحص الوبر في مكتبات AAR، استخدِم إعدادات lintPublish الموضّحة أدناه.

lintPublish استخدِم هذه الإعدادات في مشاريع مكتبة Android لتضمين عمليات التحقّق من الوبر التي تريد من Gradle جمعها في ملف lint.jar وحزمة في الاقتراحات المطبّقة تلقائيًا. ويؤدي ذلك إلى أن تطبّق المشروعات التي تستهلك AAR تطبيق عمليات التحقق من الوبر هذه أيضًا. إذا كنت تستخدم في السابق إعدادات التبعية lintChecks لتضمين عمليات التحقق من Lint في AAR المنشور، عليك نقل بيانات تلك التبعيات لاستخدام إعدادات lintPublish بدلاً من ذلك.

Kotlin

dependencies {
  // Executes lint checks from the ":checks" project at build time.
  lintChecks(project(":checks"))
  // Compiles lint checks from the ":checks-to-publish" into a
  // lint.jar file and publishes it to your Android library.
  lintPublish(project(":checks-to-publish"))
}

رائع

dependencies {
  // Executes lint checks from the ':checks' project at build time.
  lintChecks project(':checks')
  // Compiles lint checks from the ':checks-to-publish' into a
  // lint.jar file and publishes it to your Android library.
  lintPublish project(':checks-to-publish')
}
apk يضيف Gradle التبعية إلى ناتج الإصدار فقط، وذلك لاستخدامها في وقت التشغيل. أي أنه لا تتم إضافته إلى مسار فئة التجميع. تم إيقاف هذه الإعدادات (وهي متاحة في الإصدارات 1.0 و4.2 من AGP).
compile تضيف Gradle التبعية إلى مسار الفئة المجمّعة وتُنشئ مخرجات، وتصدِّر التبعية إلى وحدات أخرى. تم إيقاف هذه الإعدادات نهائيًا (وهي متاحة في الإصدارات 1.0 و4.2 من AGP).
provided يضيف Gradle التبعية إلى مسار فئة التجميع فقط (أي لا تتم إضافتها إلى ناتج الإصدار). تم إيقاف هذه الإعدادات نهائيًا (وهي متاحة في الإصدارات 1.0 و4.2 من AGP).

تُطبّق جميع الإعدادات المذكورة أعلاه تبعيات على جميع خيارات الإصدار. إذا كنت بدلاً من ذلك، إذا كنت تريد الإعلان عن تبعية لمجموعة مصدر صيغة معيّنة فقط أو لمجموعة مصادر اختبار، عليك كتابة اسم الإعدادات بالأحرف اللاتينية الكبيرة وإضافة بادئة إلى اسم صيغة الإصدار أو مجموعة مصدر الاختبار.

على سبيل المثال، لإضافة تبعية implementation فقط إلى نكهة المنتج "المجانية" (باستخدام تبعية ثنائية بعيدة)، يبدو كما يلي:

Kotlin

dependencies {
    freeImplementation("com.google.firebase:firebase-ads:9.8.0")
}

رائع

dependencies {
    freeImplementation 'com.google.firebase:firebase-ads:9.8.0'
}

مع ذلك، إذا كنت تريد إضافة سمة تابعة لصيغة تجمع بين نكهة المنتج ونوع تصميم، عليك إعداد اسم الإعداد في المجموعة configurations. يضيف النموذج التالي تبعية runtimeOnly إلى صيغة الإصدار "freeDebug" (باستخدام تبعية ثنائية محلية).

Kotlin

// Initializes a placeholder for the freeDebugRuntimeOnly dependency configuration.
val freeDebugRuntimeOnly by configurations.creating

dependencies {
    freeDebugRuntimeOnly(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
}

رائع

configurations {
    // Initializes a placeholder for the freeDebugRuntimeOnly dependency configuration.
    freeDebugRuntimeOnly {}
}

dependencies {
    freeDebugRuntimeOnly fileTree(dir: 'libs', include: ['*.jar'])
}

لإضافة اعتماديات implementation للاختبارات المحلية والاختبارات الآلية، يبدو ذلك على النحو التالي:

Kotlin

dependencies {
    // Adds a remote binary dependency only for local tests.
    testImplementation("junit:junit:4.12")

    // Adds a remote binary dependency only for the instrumented test APK.
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}

رائع

dependencies {
    // Adds a remote binary dependency only for local tests.
    testImplementation 'junit:junit:4.12'

    // Adds a remote binary dependency only for the instrumented test APK.
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}

ومع ذلك، هناك بعض التكوينات غير منطقية في هذه الحالة. على سبيل المثال، نظرًا لأن الوحدات الأخرى لا يمكن أن تعتمد على androidTest، ستتلقى التحذير التالي إذا كنت تستخدم الإعداد androidTestApi:

WARNING: Configuration 'androidTestApi' is obsolete and has been replaced with
'androidTestImplementation'.

إضافة معالجات التعليقات التوضيحية

إذا أضفت معالجات تعليقات توضيحية إلى مسار فئة التجميع، ستظهر لك رسالة خطأ مشابهة لما يلي:

Error: Annotation processors must be explicitly declared now.

لحل هذا الخطأ، أضِف معالجات التعليقات التوضيحية إلى مشروعك من خلال ضبط تبعيتك باستخدام annotationProcessor كما هو موضَّح أدناه:

Kotlin

dependencies {
    // Adds libraries defining annotations to only the compile classpath.
    compileOnly("com.google.dagger:dagger:version-number")
    // Adds the annotation processor dependency to the annotation processor classpath.
    annotationProcessor("com.google.dagger:dagger-compiler:version-number")
}

رائع

dependencies {
    // Adds libraries defining annotations to only the compile classpath.
    compileOnly 'com.google.dagger:dagger:version-number'
    // Adds the annotation processor dependency to the annotation processor classpath.
    annotationProcessor 'com.google.dagger:dagger-compiler:version-number'
}

ملاحظة: لم يعُد المكوّن الإضافي لنظام التشغيل Android لنظام Gradle 3.0.0 والإصدارات الأحدث متوافقًا مع المكوّن الإضافي android-apt.

تمرير الوسيطات إلى معالجات التعليقات التوضيحية

إذا كنت بحاجة إلى تمرير الوسيطات إلى معالج تعليقات توضيحية، يمكنك إجراء ذلك باستخدام الكتلة AnnotationProcessorOptions في إعداد تصميم الوحدة. على سبيل المثال، إذا كنت تريد تمرير أنواع البيانات الأولية كأزواج المفتاح/القيمة، يمكنك استخدام السمة argument، كما هو موضح أدناه:

Kotlin

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments += mapOf("key1" to "value1",
                                   "key2" to "value2")
            }
        }
    }
}

رائع

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                argument 'key1', 'value1'
                argument 'key2', 'value2'
            }
        }
    }
}

ومع ذلك، عند استخدام الإصدار 3.2.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android والإصدارات الأحدث، عليك تمرير وسيطات المعالج التي تمثّل الملفات أو الأدلة باستخدام واجهة CommandLineArgumentProvider من Gradle.

يتيح لك استخدام CommandLineArgumentProvider أنت أو مؤلف معالج التعليقات التوضيحية تحسين دقة وأداء البنى النظيفة المتزايدة والمخزنة مؤقتًا من خلال تطبيق التعليقات التوضيحية بشأن نوع خاصية الإصدار التزايدي على كل وسيطة.

على سبيل المثال، تُنفذ الفئة أدناه CommandLineArgumentProvider وتضيف تعليقات توضيحية إلى كل وسيطة للمعالج.

Kotlin

class MyArgsProvider(
    // Annotates each directory as either an input or output for the
    // annotation processor.
    @get:InputFiles
    // Using this annotation helps Gradle determine which part of the file path
    // should be considered during up-to-date checks.
    @get:PathSensitive(PathSensitivity.RELATIVE)
    val inputDir: FileCollection,

    @get:OutputDirectory
    val outputDir: File
) : CommandLineArgumentProvider {
    // Specifies each directory as a command line argument for the processor.
    // The Android plugin uses this method to pass the arguments to the
    // annotation processor.

    override fun asArguments(): Iterable<String> {
        // Use the form '-Akey[=value]' to pass your options to the Java compiler.
        return listOf("-AinputDir=${inputDir.singleFile.absolutePath}",
                      "-AoutputDir=${outputDir.absolutePath}")
    }
}

android {...}

رائع

class MyArgsProvider implements CommandLineArgumentProvider {

    // Annotates each directory as either an input or output for the
    // annotation processor.
    @InputFiles
    // Using this annotation helps Gradle determine which part of the file path
    // should be considered during up-to-date checks.
    @PathSensitive(PathSensitivity.RELATIVE)
    FileCollection inputDir

    @OutputDirectory
    File outputDir

    // The class constructor sets the paths for the input and output directories.
    MyArgsProvider(FileCollection input, File output) {
        inputDir = input
        outputDir = output
    }

    // Specifies each directory as a command line argument for the processor.
    // The Android plugin uses this method to pass the arguments to the
    // annotation processor.
    @Override
    Iterable<String> asArguments() {
        // Use the form '-Akey[=value]' to pass your options to the Java compiler.
        ["-AinputDir=${inputDir.singleFile.absolutePath}",
         "-AoutputDir=${outputDir.absolutePath}"]
    }
}

android {...}

بعد تعريف فئة تنفّذ CommandLineArgumentProvider، عليك إنشاء مثيل وتمريره إلى مكوّن Android الإضافي باستخدام الطريقة annotationProcessorOptions.compilerArgumentProvider كما هو موضّح أدناه.

Kotlin

// This is in your module's build.gradle file.
android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                // Creates a new MyArgsProvider object, specifies the input and
                // output paths for the constructor, and passes the object
                // to the Android plugin.
                compilerArgumentProvider(MyArgsProvider(files("input/path"),
                                                          file("output/path")))
            }
        }
    }
}

رائع

// This is in your module's build.gradle file.
android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                // Creates a new MyArgsProvider object, specifies the input and
                // output paths for the constructor, and passes the object
                // to the Android plugin.
                compilerArgumentProvider new MyArgsProvider(files("input/path"),
                                         new File("output/path"))
            }
        }
    }
}

لمعرفة المزيد من المعلومات حول كيف يساعد تنفيذ CommandLineArgumentProvider في تحسين أداء الإصدار، يمكنك الاطّلاع على جارٍ التخزين في مشاريع Java في ذاكرة التخزين المؤقت.

إيقاف التحقق من أخطاء معالج التعليقات التوضيحية

إذا كانت لديك تبعيات على مسار فئة التجميع تتضمّن معالِجات تعليقات توضيحية لا تحتاج إليها، يمكنك إيقاف التحقق من الأخطاء من خلال إضافة ما يلي إلى ملف build.gradle.kts. ضع في اعتبارك أنه لا تتم إضافة معالِجات التعليقات التوضيحية التي تضيفها إلى مسار فئة التحويل البرمجي إلى مسار فئة المعالج.

Kotlin

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                argument("includeCompileClasspath", "false")
            }
        }
    }
}

رائع

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                includeCompileClasspath false
            }
        }
    }
}

إذا كنت تستخدم لغتَي Kotlin وkapt:

Kotlin

android {
    ...
    defaultConfig {
        ...
        kapt {
            includeCompileClasspath = false
        }
    }
}

رائع

android {
    ...
    defaultConfig {
        ...
        kapt {
            includeCompileClasspath false
        }
    }
}

إذا واجهت مشاكل بعد نقل معالِجات التعليقات التوضيحية في مشروعك إلى مسار فئة المعالج، يمكنك السماح بمعالجات التعليقات التوضيحية في مسار التجميع من خلال ضبط includeCompileClasspath على true. مع ذلك، لا يُنصح بضبط هذا السمة على true، وستتم إزالة خيار إجراء ذلك في تحديث مستقبلي للمكوِّن الإضافي Android.

استبعاد التبعيات المتبادلة

ومع تطوّر التطبيق، يمكن أن يحتوي على عدد من التبعيات بما في ذلك التبعيات المباشرة والتبعيات المتعدّدة (المكتبات التي تعتمد عليها مكتبات التطبيق المستورَدة). لاستبعاد العناصر التابعة المتبادلة التي لم تعُد بحاجة إليها، يمكنك استخدام الكلمة الرئيسية exclude كما هو موضّح أدناه:

Kotlin

dependencies {
    implementation("some-library") {
        exclude(group = "com.example.imgtools", module = "native")
    }
}

رائع

dependencies {
    implementation('some-library') {
        exclude group: 'com.example.imgtools', module: 'native'
    }
}

استبعاد التبعيات المتبادلة من إعدادات الاختبار

إذا كنت بحاجة إلى استبعاد بعض التبعيات المتبادلة من اختباراتك، فقد لا يعمل نموذج التعليمات البرمجية الموضح أعلاه كما هو متوقع. وهذا بسبب تهيئة اختبار (على سبيل المثال، androidTestImplementation) لتوسيع إعدادات implementation للوحدة. وهذا يعني أنها تحتوي دائمًا على تبعيات implementation عندما يحل Gradle الإعدادات.

لذلك، لاستبعاد التبعيات المتبادلة من اختباراتك، يجب عليك القيام بذلك في وقت التنفيذ كما هو موضح أدناه:

Kotlin

android.testVariants.all {
    compileConfiguration.exclude(group = "com.jakewharton.threetenabp", module = "threetenabp")
    runtimeConfiguration.exclude(group = "com.jakewharton.threetenabp", module = "threetenabp")
}

رائع

android.testVariants.all { variant ->
    variant.getCompileConfiguration().exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp'
    variant.getRuntimeConfiguration().exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp'
}

ملاحظة: لا يزال بإمكانك استخدام الكلمة الرئيسية exclude في مجموعة التبعيات كما هو موضّح في عيّنة الرمز البرمجي الأصلية من قسم استبعاد التبعيات المتبادلة لحذف التبعيات المتبادلة التي تخصّ إعداد الاختبار وغير مضمّنة في الإعدادات الأخرى.

ضبط العناصر الاعتمادية لتطبيق Wear OS

يشبه إعداد التبعيات لوحدة Wear OS إعداد أي وحدة أخرى، أي أنّ وحدات Wear OS تستخدم إعدادات التبعية نفسها، مثل implementation وcompileOnly.

تتوافق وحدات Wear أيضًا مع إدارة التبعية الواعية بالسياق. نتيجةً لذلك، إذا كانت وحدة التطبيق الأساسية تعتمد على وحدة Wear، ستستهلك كل صيغة في الوحدة الأساسية الصيغة المطابقة من وحدة Wear.

المستودعات عن بُعد

عندما تكون تبعيتك شيء آخر غير المكتبة المحلية أو شجرة الملفات، يبحث Gradle عن الملفات في أي مستودعات على الإنترنت تم تحديدها في مجموعة dependencyResolutionManagement { repositories {...} } من ملف settings.gradle. يحدد الترتيب الذي تسرد به كل مستودع الترتيب الذي يبحث به Gradle في مستودعات كل تبعية مشروع. على سبيل المثال، إذا كانت التبعية متاحة من كل من المستودع "أ" و"ب"، وأدرجت "أ" أولاً، تقوم Gradle بتنزيل التبعية من المستودع "أ".

تحدّد مشاريع "استوديو Android" الجديدة تلقائيًا مستودع Maven من Google، ومستودع Maven المركزي كمواقع جغرافية للمستودع في ملف settings.gradle الخاص بالمشروع، كما هو موضّح أدناه:

Kotlin


dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

رائع


dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

إذا أردت الحصول على شيء من مستودع محلي، استخدِم mavenLocal():

Kotlin


dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        mavenLocal()
    }
}

رائع


dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        mavenLocal()
    }
}

أو يمكنك الإعلان عن مستودعات Maven أو Ivy محددة كما يلي:

Kotlin


dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven(url = "https://repo.example.com/maven2")
        maven(url = "file://local/repo/")
        ivy(url = "https://repo.example.com/ivy")
    }
}

رائع


dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven {
            url 'https://repo.example.com/maven2'
        }
        maven {
            url 'file://local/repo/'
        }
        ivy {
            url 'https://repo.example.com/ivy'
        }
    }
}

لمزيد من المعلومات، يُرجى الاطّلاع على دليل مستودعات Gradle.

مستودع Maven من Google

تتوفّر أحدث إصدارات لمكتبات Android التالية في مستودع Maven من Google:

يمكنك الاطّلاع على جميع العناصر المتاحة في فهرس مستودع Maven من Google (راجِع المعلومات الواردة أدناه للاطّلاع على الوصول الآلي).

لإضافة إحدى هذه المكتبات إلى إصدارك، يمكنك تضمين مستودع Maven من Google في ملف build.gradle.kts ذي المستوى الأعلى:

Kotlin


dependencyResolutionManagement {

    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()

        // If you're using a version of Gradle lower than 4.1, you must instead use:
        // maven {
        //     url = "https://maven.google.com"
        // }
        // An alternative URL is "https://dl.google.com/dl/android/maven2/".
    }
}

رائع


dependencyResolutionManagement {

    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()

        // If you're using a version of Gradle lower than 4.1, you must instead use:
        // maven {
        //     url 'https://maven.google.com'
        // }
        // An alternative URL is 'https://dl.google.com/dl/android/maven2/'.
    }
}

بعد ذلك، أضِف المكتبة المطلوبة إلى وحدة dependencies في الوحدة. على سبيل المثال، تبدو مكتبة التطبيقات على النحو التالي:

Kotlin


dependencies {
    implementation("com.android.support:appcompat-v7:28.0.0")
}

رائع


dependencies {
    implementation 'androidx.appcompat:appcompat:1.6.1'
}

ومع ذلك، إذا كنت تحاول استخدام إصدار أقدم من المكتبات المذكورة أعلاه وفشلت تبعيتك، فلن تكون متاحة في مستودع Maven وعليك بدلاً من ذلك الحصول على المكتبة من المستودع غير المتصل بالإنترنت.

الوصول الآلي

للوصول الآلي إلى عناصر Maven من Google، يمكنك الحصول على قائمة XML لمجموعات العناصر من maven.google.com/master-index.xml. بعد ذلك، يمكنك عرض أسماء المكتبات ونُسخها لأي مجموعة على الرابط التالي:

maven.google.com/group_path/group-index.xml

على سبيل المثال، يتم إدراج المكتبات في مجموعة android.arch.lifecycle من خلال maven.google.com/android/arch/lifecycle/group-index.xml.

يمكنك أيضًا تنزيل ملفات POM وJAR من خلال:

maven.google.com/group_path/library/version /library-version.ext

على سبيل المثال: maven.google.com/android/rc/lifecycle/compiler/1.0.0/compiler-1. 0.0.pom.

مستودع بلا اتصال بالإنترنت من "مدير SDK"

بالنسبة إلى المكتبات غير المتوفّرة من مستودع Google Maven (إصدارات المكتبة القديمة عادةً)، عليك تنزيل حزمة Google Repository بلا اتصال بالإنترنت من مدير SDK.

بعد ذلك، يمكنك إضافة هذه المكتبات إلى مجموعة dependencies كالمعتاد.

يتم حفظ المكتبات المتوفّرة بلا إنترنت في android_sdk/extras/.

التبعيات الأصلية مع المكوّن الإضافي لنظام Gradle المتوافق مع Android

يمكن أن تحتوي مكتبات AAR على تبعيات أصلية يمكن أن يستهلكها المكوّن الإضافي لنظام Gradle المتوافق مع Android. كما أن AGP قادر أيضًا على إنتاج AAR التي تكشف المكتبات الأصلية للمستهلكين.

استخدام التبعيات الأصلية

بدءًا من الإصدار 4.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android، يمكن استيراد تبعيات C/C++ من مصادر AAR المرتبطة بملف build.gradle. ستوفّر أداة Gradle تلقائيًا نظام التشغيل الأصلي، ولكن يجب ضبط نظام التصميم للاستفادة من المكتبات والعناوين التي تم استيرادها. وبما أنّ تبعيات C/C++ يتم توزيعها على أنّها AAR، فقد تكون الروابط التالية عن التطبيقات العامة لهذه الإعلانات مفيدة:

  • إنشاء مكتبة Android للحصول على مستندات عامة حول تقنية "الاقتراحات المطبّقة تلقائيًا" وكيفية دمجها في مشروعك، خاصةً عندما تريد استخدام تلك الأداة كتبعية محلية لـ C/C++.
  • أضِف تبعيات الإصدار للحصول على معلومات حول إضافة التبعيات إلى ملف build.gradle، خاصةً بالنسبة إلى التبعيات البعيدة.

يركز هذا المستند على كيفية تهيئة نظام التصميم الأصلي ويفترض أنك أضفت بالفعل AAR تبعية C/C++ إلى بيئة إنشاء Gradle لمشروعك.

التبعيات الأصلية في الاقتراحات المطبّقة تلقائيًا

يمكن أن تعرض تبعيات AAR لوحدات Gradle المكتبات الأصلية التي يستخدمها تطبيقك. داخل AAR، يحتوي دليل prefab على حزمة Prefab تتضمن عناوين ومكتبات التبعية الأصلية.

يمكن أن تكشف كل تبعية عن حزمة Prefab واحدة على الأكثر، والتي تتكون من وحدة واحدة أو أكثر. الوحدة الأولية هي مكتبة واحدة يمكن أن تكون إما مكتبة مشتركة أو ثابتة أو مكتبة في قسم العنوان فقط.

يجب أن تكون أسماء الحزم والوحدات معروفة للاستفادة من المكتبات. وبشكل تقليدي، سيتطابق اسم الحزمة مع اسم عنصر Maven وسيطابق اسم الوحدة اسم مكتبة C/C++، ولكن هذا ليس مطلوبًا. راجع وثائق التبعية لتحديد الأسماء التي تستخدمها.

إعداد إعدادات النظام

يجب تفعيل ميزة "prefab" في وحدة Gradle المتوافقة مع Android.

لإجراء ذلك، أضِف ما يلي إلى المجموعة android من ملف build.gradle في الوحدة:

Kotlin

buildFeatures {
  prefab = true
}

رائع

buildFeatures {
  prefab true
}

يمكنك اختياريًا ضبط إصدار في ملف gradle.properties الخاص بمشروعك:

android.prefabVersion=2.0.0

عادةً ما يتناسب الإصدار الافتراضي المحدد من AGP مع احتياجاتك. ينبغي أن تحتاج فقط إلى تحديد إصدار مختلف إذا كان هناك خطأ تحتاج إلى التغلب عليه أو ميزة جديدة تريدها.

يتم الكشف عن التبعيات التي تم استيرادها من AAR إلى CMake عبر Cmake_FIND_ROOT_PATH. سيتم ضبط هذه القيمة تلقائيًا بواسطة Gradle عند استدعاء CMake، لذا إذا كان إصدارك يعدّل هذا المتغير، فتأكد من إلحاقه بدلاً من تعيينه.

تعرض كل اعتمادية حزمة ملف config لإصدارك. ويتم استيراد هذه العناوين باستخدام الأمر find_package. يبحث هذا الأمر عن حزم ملف التكوين التي تطابق اسم الحزمة وإصدارها ويكشف الأهداف التي يحددها للاستخدام في إصدارك. على سبيل المثال، إذا كان تطبيقك يعرّف libapp.so وكان يستخدم cURL، يجب أن يتضمّن CMakeLists.txt ما يلي:

add_library(app SHARED app.cpp)

# Add these two lines.
find_package(curl REQUIRED CONFIG)
target_link_libraries(app curl::curl)

أصبح بإمكان "app.cpp" الآن تنفيذ #include "curl/curl.h"، وسيتم ربط libapp.so تلقائيًا بـ "libcurl.so" عند إنشائه، وسيتم تضمين "libcurl.so" مع التطبيق.

نشر المكتبات الأصلية في الاقتراحات المطبّقة تلقائيًا

تمت إضافة إمكانية إنشاء إعلانات AAR الأصلية لأول مرة في الإصدار 4.1 من AGP.

لتصدير مكتباتك الأصلية، أضِف ما يلي إلى مجموعة android من ملف build.gradle.kts لمشروع المكتبة:

Kotlin


buildFeatures {
    prefabPublishing = true
}

prefab {
    create("mylibrary") {
      headers = "src/main/cpp/mylibrary/include"
    }

    create("myotherlibrary") {
        headers = "src/main/cpp/myotherlibrary/include"
    }
}

رائع


buildFeatures {
    prefabPublishing true
}

prefab {
    mylibrary {
      headers "src/main/cpp/mylibrary/include"
    }

    myotherlibrary {
        headers "src/main/cpp/myotherlibrary/include"
    }
}

في هذا المثال، سيتم حزم مكتبات mylibrary وmyotherlibrary من إصدار ndk-build أو CMake الخارجي الأصلي في تنسيق AAR الذي تم إنشاؤه من خلال إصدارك، وستُصدِّر كل منهما العناوين من الدليل المحدّد إلى العناصر التابعة لها.

ترتيب التبعية

يشير الترتيب الذي تسرد به تبعياتك إلى أولوية كل منها: المكتبة الأولى أعلى أولوية من الثانية، والثانية أعلى من الثالثة، وهكذا. وهذا الترتيب مهم في حال دمج الموارد أو دمج عناصر البيان في تطبيقك من المكتبات.

على سبيل المثال، إذا كان مشروعك يُعلن عن ما يلي:

  • تعتمد على LIB_A وLIB_B (بهذا الترتيب)
  • وتعتمد LIB_A على LIB_C وLIB_D (بهذا الترتيب)
  • وتعتمد LIB_B أيضًا على LIB_C

بعد ذلك، سيكون ترتيب التبعية الثابت على النحو التالي:

  1. LIB_A
  2. LIB_D
  3. LIB_B
  4. LIB_C

يضمن ذلك أنّه يمكن لكل من LIB_A وLIB_B إلغاء LIB_C، ويظل LIB_D أعلى من LIB_B لأنّ LIB_A (الذي يعتمد على ذلك) له أولوية أعلى من LIB_B.

لمزيد من المعلومات حول كيفية دمج البيانات من مصادر/تبعيات المشروع المختلفة، يُرجى الاطّلاع على دمج ملفات بيان متعددة.

عرض تبعيات الوحدات

قد يكون لبعض التبعيات المباشرة تبعيات خاصة بها. وتسمى هذه التبعيات الانتقالية. بدلاً من أن تطلب منك الإفصاح يدويًا عن كل تبعية عابرة، تجمع Gradle تلقائيًا وتضيفها نيابةً عنك. يوفّر مكوّن Android الإضافي لنظام Gradle مَهمة تعرض قائمة بالتبعيات التي يحلها Gradle لوحدة معيّنة.

بالنسبة إلى كل وحدة، يجمع التقرير أيضًا التبعيات استنادًا إلى صيغة الإصدار ومجموعة مصادر الاختبار ومسار الفئة. في ما يلي نموذج تقرير لمسار فئة وقت تشغيل وحدة التطبيق لمتغير إصدار تصحيح الأخطاء و مسار فئة التجميع لمجموعة مصدر الاختبار المساعِد.

debugRuntimeClasspath - Dependencies for runtime/packaging
+--- :mylibrary (variant: debug)
+--- com.google.android.material:material:1.0.0@aar
+--- androidx.appcompat:appcompat:1.0.2@aar
+--- androidx.constraintlayout:constraintlayout:1.1.3@aar
+--- androidx.fragment:fragment:1.0.0@aar
+--- androidx.vectordrawable:vectordrawable-animated:1.0.0@aar
+--- androidx.recyclerview:recyclerview:1.0.0@aar
+--- androidx.legacy:legacy-support-core-ui:1.0.0@aar
...

debugAndroidTest
debugAndroidTestCompileClasspath - Dependencies for compilation
+--- androidx.test.ext:junit:1.1.0@aar
+--- androidx.test.espresso:espresso-core:3.1.1@aar
+--- androidx.test:runner:1.1.1@aar
+--- junit:junit:4.12@jar
...

لتشغيل المهمة، اتّبِع الخطوات التالية:

  1. اختَر عرض > أداة Windows > Gradle (أو انقر على أداة Gradle في شريط نوافذ الأدوات).
  2. وسِّع AppName > "مهام Google" > android وانقر مرّتين على androidExpirationiness. بعد تنفيذ Gradle للمهمة، من المُفترَض أن تفتح نافذة Run (تشغيل) لعرض النتيجة.

لمزيد من المعلومات حول إدارة التبعيات في Gradle، راجع أساسيات إدارة التبعيات في دليل مستخدم Gradle.

إصلاح أخطاء حل التبعية

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

لمساعدتك في التحقق من التبعيات التي تساهم في حدوث أخطاء، يمكنك فحص شجرة تبعية التطبيق والبحث عن التبعيات التي تظهر أكثر من مرة أو مع إصدارات متعارضة.

إذا لم تتمكن بسهولة من تحديد التبعية المكررة، جرِّب استخدام واجهة مستخدم Android Studio للبحث عن التبعيات التي تتضمّن الفئة المكررة على النحو التالي:

  1. اختَر التنقل > الصف من شريط القوائم.
  2. في مربع حوار البحث المنبثق، تأكد من تحديد المربع بجوار تضمين عناصر غير المشروع.
  3. اكتب اسم الفئة الذي يظهر في خطأ الإصدار.
  4. افحص نتائج التبعيات التي تتضمن الفئة.

تصف الأقسام التالية الأنواع المختلفة من أخطاء حل التبعية التي قد تواجهها وكيفية إصلاحها.

إصلاح أخطاء الصف المكرّرة

فإذا ظهرت فئة أكثر من مرة على مسار الفئة في وقت التشغيل، فستحصل على خطأ مشابه لما يلي:

Program type already present com.example.MyClass

يحدث هذا الخطأ عادةً بسبب أحد الحالات التالية:

  • تتضمن التبعية الثنائية مكتبة يتضمنها تطبيقك أيضًا كتبعية مباشرة. على سبيل المثال، يشير تطبيقك إلى اعتماد مباشر على المكتبة "أ" والمكتبة "ب"، إلا أنّ المكتبة "أ" تتضمّن المكتبة "ب" في ملفها الثنائي.
    • لحلّ هذه المشكلة، عليك إزالة المكتبة "ب" كتبعية مباشرة.
  • يحتوي تطبيقك على تبعية ثنائية محلية وتبعية ثنائية عن بُعد على المكتبة نفسها.
    • لحلّ هذه المشكلة، عليك إزالة إحدى التبعيات الثنائية.

إصلاح التعارضات بين مسارات الصفوف

عندما يحل Gradle مسار فئة التجميع، فإنه يحل أولاً مسار الفئة وقت التشغيل ويستخدم النتيجة لتحديد إصدارات التبعيات التي ينبغي إضافتها إلى مسار فئة التجميع. بمعنى آخر، يحدد مسار فئة وقت التشغيل أرقام الإصدار المطلوبة للتبعيات المتطابقة على مسارات الفئات النهائية.

يحدد مسار فئة وقت تشغيل تطبيقك أيضًا أرقام الإصدار التي يتطلبها تطبيق Gradle لمطابقة التبعيات في مسار فئة وقت التشغيل لملف APK الاختباري للتطبيق. يتم وصف التسلسل الهرمي لمسارات الفئات في الشكل 1.

الشكل 1. يجب أن تتطابق أرقام إصدارات التبعيات التي تظهر على مسارات فئات متعددة وفقًا لهذا التسلسل الهرمي.

التعارض الذي قد تظهر فيه إصدارات مختلفة من التبعية نفسها على مستوى مسارات فئات متعددة عندما يتضمّن تطبيقك مثلاً إصدارًا من التبعية باستخدام implementation إعداد التبعية وتتضمّن وحدة المكتبة إصدارًا مختلفًا من التبعية باستخدام إعدادات runtimeOnly.

عند حل مشكلة الاعتماديات على وقت التشغيل وتجميع مسارات فئات الوقت، يحاول المكوّن الإضافي Android Gradle 3.3.0 والإصدارات الأحدث إصلاح بعض التعارضات في إصدارات المراحل اللاحقة تلقائيًا. على سبيل المثال، إذا كان مسار الفئة وقت التشغيل يتضمن الإصدار 2.0 من المكتبة أ بينما كان مسار فئة التجميع يتضمن الإصدار 1.0 من المكتبة أ، سيحدّث المكوّن الإضافي تلقائيًا التبعية على مسار فئة التجميع إلى الإصدار 2.0 من المكتبة A لتجنُّب حدوث أخطاء.

ومع ذلك، إذا كان مسار فئة وقت التشغيل يتضمن الإصدار 1.0 من المكتبة أ أمّا مسار فئة التجميع يتضمن الإصدار 2.0 من المكتبة أ، فلن يقلل المكوّن الإضافي من تبعية مسار فئة التجميع إلى الإصدار 1.0 للمكتبة أ، وسيستمر ظهور خطأ مشابه لما يلي:

Conflict with dependency 'com.example.library:some-lib:2.0' in project 'my-library'.
Resolved versions for runtime classpath (1.0) and compile classpath (2.0) differ.

لحلّ هذه المشكلة، نفِّذ أحد الإجراءات التالية:

  • ضمِّن النسخة المطلوبة من التبعية كتبعية api إلى وحدة مكتبتك. وهذا يعني أن وحدة المكتبة فقط هي التي تعلن عن التبعية، ولكن سيكون بإمكان وحدة التطبيق أيضًا الوصول إلى واجهة برمجة التطبيقات الخاصة بها، بشكل تبادلي.
  • بدلاً من ذلك، يمكنك تعريف التبعية في كلتا الوحدتين، ولكن يجب عليك التأكد من أن كل وحدة تستخدم نفس إصدار التبعية. ضع في اعتبارك تهيئة الخصائص على مستوى المشروع لضمان بقاء إصدارات كل تبعية متسقة طوال مشروعك.

تطبيق منطق تصميم مخصّص

يصف هذا القسم المواضيع المتقدّمة التي يمكن الاستفادة منها عندما تريد توسيع مكوّن Android Gradle الإضافي أو كتابة المكوّن الإضافي الخاص بك.

نشر تبعيات الصيغ للمنطق المخصّص

يمكن أن تحتوي المكتبة على وظائف قد ترغب المشروعات أو المشروعات الفرعية الأخرى في استخدامها. نشر المكتبة هو العملية التي من خلالها تتوفر المكتبة للمستهلكين. يمكن للمكتبات التحكم في التبعيات التي يمكن لمستهلكيها الوصول إليها في وقت التجميع ووقت التشغيل.

هناك إعدادان منفصلان يحتويان على التبعيات المتبادلة لكل مسار فئة ويجب أن يستخدمها المستهلكون للاطّلاع على المكتبة كما هو موضّح أدناه:

  • variant_nameApiElements: تحتوي هذه الإعدادات على التبعيات الانتقالية المتاحة للمستهلكين في وقت التجميع.
  • variant_nameRuntimeElements: تحتفظ هذه الإعدادات بتبعيات النقل العام المتاحة للمستهلكين في وقت التشغيل.

لمعرفة المزيد حول العلاقات بين الإعدادات المختلفة، يمكنك الانتقال إلى إعدادات المكوّن الإضافي لمكتبة Java.

استراتيجيات مخصصة لحل التبعية

قد يتضمن المشروع التبعية على نسختين مختلفتين من نفس المكتبة مما قد يؤدي إلى تضارب التبعية. على سبيل المثال، إذا كان مشروعك يعتمد على الإصدار 1 من الوحدة أ والإصدار 2 من الوحدة ب، وتعتمد الوحدة أ بشكل تبادلي على الإصدار 3 من الوحدة ب، فسينشأ تعارض بين إصدارات التبعية.

لحل هذا التعارض، يستخدم المكوّن الإضافي لنظام Gradle المتوافق مع Android استراتيجية حلّ التبعية التالية: عندما يكتشف المكوّن الإضافي أنّ إصدارات مختلفة من الوحدة نفسها متوفّرة في الرسم البياني للتبعية، فإنّه يختار تلقائيًا الإصدار ذي رقم الإصدار الأعلى.

ومع ذلك، قد لا تعمل هذه الاستراتيجية على النحو المنشود دائمًا. لتخصيص استراتيجية حل التبعية، استخدم الإعدادات التالية لحل التبعيات المحددة لمتغير مطلوب مهمتك:

  • variant_nameCompileClasspath: تحتوي هذه الإعدادات على استراتيجية الحلّ لمسار فئة التجميع في صيغة معيّنة.
  • variant_nameRuntimeClasspath: تحتوي هذه الإعدادات على استراتيجية الحلّ لمسار فئة وقت تشغيل خيار منتج معيّن.

يتضمّن المكوّن الإضافي لنظام Gradle المتوافق مع Android رموزًا يمكنك استخدامها للوصول إلى كائنات الإعدادات لكل صيغة. بالتالي، يمكنك استخدام واجهة برمجة التطبيقات المتغيّرة للاستعلام عن دقة التبعية كما هو موضَّح في المثال أدناه:

Kotlin

android {
    applicationVariants.all {
        // Return compile configuration objects of a variant.
        compileConfiguration.resolutionStrategy {
        // Use Gradle's ResolutionStrategy API
        // to customize how this variant resolves dependencies.
            ...
        }
        // Return runtime configuration objects of a variant.
        runtimeConfiguration.resolutionStrategy {
            ...
        }
        // Return annotation processor configuration of a variant.
        annotationProcessorConfiguration.resolutionStrategy {
            ...
        }
    }
}

رائع

android {
    applicationVariants.all { variant ->
        // Return compile configuration objects of a variant.
        variant.getCompileConfiguration().resolutionStrategy {
        // Use Gradle's ResolutionStrategy API
        // to customize how this variant resolves dependencies.
            ...
        }
        // Return runtime configuration objects of a variant.
        variant.getRuntimeConfiguration().resolutionStrategy {
            ...
        }
        // Return annotation processor configuration of a variant.
        variant.getAnnotationProcessorConfiguration().resolutionStrategy {
            ...
        }
    }
}

المعلومات المتعلقة بالاعتمادية على Play Console

أثناء إنشاء تطبيقك، يتضمّن AGP بيانات وصفية تصف العناصر التابعة للمكتبة التي تم تجميعها في تطبيقك. فعند تحميل التطبيق، يفحص Play Console هذه البيانات الوصفية لتقديم تنبيهات بشأن المشاكل المعروفة في حِزم SDK والتبعيات التي يستخدمها تطبيقك، وفي بعض الحالات، تقديم ملاحظات قابلة للتنفيذ لحل هذه المشاكل.

يتم ضغط البيانات وتشفيرها باستخدام مفتاح توقيع Google Play وتخزينها في مجموعة التوقيع لتطبيق الإصدار الخاص بك. ننصحك بالاحتفاظ بملف الملحقات هذا لتوفير تجربة إيجابية وآمنة للمستخدم. يمكنك إيقاف الميزة من خلال تضمين المجموعة التالية في dependenciesInfo في ملف build.gradle.kts الخاص بالوحدة.

android {
    dependenciesInfo {
        // Disables dependency metadata when building APKs.
        includeInApk = false
        // Disables dependency metadata when building Android App Bundles.
        includeInBundle = false
    }
}

للاطّلاع على مزيد من المعلومات حول سياساتنا والمشاكل المحتملة المتعلقة بالملحقات، راجِع صفحة الدعم حول استخدام حِزم تطوير برامج (SDK) تابعة لجهات خارجية في تطبيقك.

إحصاءات حِزم SDK

يعرض "استوديو Android" تحذيرات حول البرامج غير المرغوب فيها في ملفات build.gradle.kts وbuild.gradle وفي مربّع حوار بنية المشروع لحِزم تطوير البرامج (SDK) المتاحة للجميع التي أشار المؤلفون إلى أنّها قديمة في أداة Google Play SDK Index. تهدف هذه الإشارة إلى تعديل تلك التبعيات، لأنّ استخدام إصدارات قديمة قد يمنعك من النشر على Google Play Console في المستقبل.