الإصدار 4.0.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android" (نيسان/أبريل 2020)

يتطلّب هذا الإصدار من المكوّن الإضافي لنظام Android ما يلي:

4.0.1 (تموز/يوليو 2020)

يتيح هذا التعديل البسيط التوافق مع الإعدادات التلقائية الجديدة والميزات الجديدة لمستوى عرض الحِزمة في Android 11.

في الإصدارات السابقة من Android، كان من الممكن عرض قائمة بكل التطبيقات المثبَّتة على الجهاز. اعتبارًا من الإصدار 11 من Android (المستوى 30 لواجهة برمجة التطبيقات)، يمكن للتطبيقات تلقائيًا الوصول إلى قائمة مفلتَرة فقط من الحِزم المثبَّتة. للاطّلاع على قائمة أوسع بالتطبيقات على النظام، عليك الآن إضافة عنصر <queries> فيملف بيان Android الخاص بتطبيقك أو مكتبتك.

إنّ الإصدار 4.1 من المكوّن الإضافي لنظام Gradle المتوافق مع Android والإصدارات الأحدث متوافقة مع ملف بيان <queries> الجديد، ولكن الإصدارات القديمة غير متوافقة. في حال إضافة العنصر <queries> أو في حال الاعتماد على مكتبة أو حزمة تطوير برامج (SDK) تتيح استهداف Android 11، قد تواجه أخطاء في دمج البيان عند إنشاء تطبيقك.

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

الحد الأدنى للإصدار الإصدار التلقائي ملاحظات
Gradle 6.1.1 6.1.1 لمزيد من المعلومات، يمكنك الاطّلاع على تحديث Gradle.
أدوات إنشاء حِزم SDK 29.0.2 29.0.2 ثبِّت أو اضبط أدوات إنشاء حِزم SDK.

لمزيد من المعلومات حول هذه الميزة الجديدة، يُرجى الاطّلاع على مقالة مستوى ظهور الحِزم في Android 11.

الميزات الجديدة

يتضمّن هذا الإصدار من المكوّن الإضافي لنظام Gradle المتوافق مع Android الميزات الجديدة التالية.

إتاحة أداة تحليل عمليات البناء في "استوديو Android"

تساعدك نافذة أداة تحليل عمليات الإنشاء في فهم المشاكل المتعلّقة بعملية الإنشاء وتحديدها، مثل عمليات التحسين غير المفعّلة والمهام التي تم ضبط إعداداتها بشكل غير صحيح. تتوفّر هذه الميزة عند استخدام الإصدار 4.0 من Android Studio والإصدارات الأحدث مع المكوّن الإضافي لنظام Gradle المتوافق مع Android 4.0.0 والإصدارات الأحدث. يمكنك فتح نافذة أداة تحليل عملية الإنشاء من "استوديو Android" باتّباع الخطوات التالية:

  1. أنشئ تطبيقك من خلال اختيار إنشاء > إنشاء المشروع من شريط القوائم، إذا لم يسبق لك إجراء ذلك.
  2. اختَر عرض > نوافذ الأدوات > إنشاء من شريط القوائم.
  3. في نافذة الإنشاء، افتح نافذة أداة تحليل الإنشاء بإحدى الطريقتَين التاليتَين:
    • بعد أن ينتهي "استوديو Android" من إنشاء مشروعك، انقر على علامة التبويب محلل عملية الإنشاء.
    • بعد انتهاء Android Studio من إنشاء مشروعك، انقر على الرابط على الجانب الأيمن من نافذة ناتج الإنشاء.

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

لمزيد من المعلومات، يُرجى الاطّلاع على مقالة تحديد حالات التراجع في سرعة إنشاء الإصدارات.

إزالة رمز Java 8 البرمجي في D8 وR8

يتضمّن الآن المكوّن الإضافي لنظام Android Gradle إمكانية استخدام عدد من واجهات برمجة تطبيقات لغة Java 8 بدون اشتراط الحد الأدنى من مستوى واجهة برمجة التطبيقات لتطبيقك.

من خلال عملية تُعرف باسم إزالة الرمز البرمجي المُحلّل، يوفّر مُجمِّع DEX، وهو D8، في الإصدار 3.0 من Android Studio والإصدارات الأحدث دعمًا كبيرًا لميزات لغة Java 8 (مثل تعبيرات لامبادا وطرق الواجهات التلقائية وtry with resources وغيرها). في الإصدار 4.0 من Android Studio، تم توسيع نطاق محرك إزالة المعالجة السكرية ليصبح قادرًا على إزالة المعالجة السكرية لواجهات برمجة تطبيقات لغة Java. يعني ذلك أنّه يمكنك الآن تضمين واجهة برمجة التطبيقات العادية للغة التي كانت متاحة فقط في إصدارات Android الحديثة (مثل java.util.streams) في التطبيقات المتوافقة مع إصدارات Android القديمة.

تتوفّر مجموعة واجهات برمجة التطبيقات التالية في هذا الإصدار:

  • أحداث البث التسلسلي (java.util.stream)
  • مجموعة فرعية من java.time
  • java.util.function
  • الإضافات الأخيرة إلى java.util.{Map,Collection,Comparator}
  • الفئات الاختيارية (java.util.Optional وjava.util.OptionalInt و java.util.OptionalDouble) وبعض الفئات الجديدة الأخرى المفيدة مع واجهات برمجة التطبيقات المذكورة أعلاه
  • بعض الإضافات إلى java.util.concurrent.atomic (طرق جديدة في AtomicInteger وAtomicLong وAtomicReference)
  • ConcurrentHashMap (تتضمّن إصلاحات للأخطاء في Android 5.0)

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

لتفعيل واجهات برمجة التطبيقات هذه للغات، أدرِج ما يلي في ملفbuild.gradle وحدة التطبيق:

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled true
  }

compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true // Sets Java compatibility to Java 8 sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }

dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4' }

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled = true
  }

compileOptions { // Flag to enable support for the new language APIs isCoreLibraryDesugaringEnabled = true // Sets Java compatibility to Java 8 sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } }

dependencies { coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.0.4") }

يُرجى العلم أنّه قد تحتاج أيضًا إلى تضمين مقتطف الرمز البرمجي أعلاه في ملف build.gradle الخاص بأحد وحدات المكتبة في حال

  • تستخدِم الاختبارات المزوّدة بأدوات قياس أداء وحدة المكتبة واجهات برمجة التطبيقات هذه للغة (إما مباشرةً أو من خلال وحدة المكتبة أو تبعياتها). يهدف ذلك إلى توفير واجهات برمجة التطبيقات غير المتوفّرة لحزمة APK لاختبار الأداء.

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

خيارات جديدة لتفعيل ميزات الإصدار أو إيقافها

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

android {
  // The default value for each feature is shown below. You can change the value to
  // override the default behavior.
  buildFeatures {
    // Determines whether to generate a BuildConfig class.
    buildConfig = true
    // Determines whether to support View Binding.
    // Note that the viewBinding.enabled property is now deprecated.
    viewBinding = false
    // Determines whether to support Data Binding.
    // Note that the dataBinding.enabled property is now deprecated.
    dataBinding = false
    // Determines whether to generate binder classes for your AIDL files.
    aidl = true
    // Determines whether to support RenderScript.
    renderScript = true
    // Determines whether to support injecting custom variables into the module’s R class.
    resValues = true
    // Determines whether to support shader AOT compilation.
    shaders = true
  }
}
android {
  // The default value for each feature is shown below. You can change the value to
  // override the default behavior.
  buildFeatures {
    // Determines whether to generate a BuildConfig class.
    buildConfig = true
    // Determines whether to support View Binding.
    // Note that the viewBinding.enabled property is now deprecated.
    viewBinding = false
    // Determines whether to support Data Binding.
    // Note that the dataBinding.enabled property is now deprecated.
    dataBinding = false
    // Determines whether to generate binder classes for your AIDL files.
    aidl = true
    // Determines whether to support RenderScript.
    renderScript = true
    // Determines whether to support injecting custom variables into the module’s R class.
    resValues = true
    // Determines whether to support shader AOT compilation.
    shaders = true
  }
}

يمكنك أيضًا تحديد الإعداد التلقائي لهذه الميزات في جميع الوحدات في مشروع معيّن عن طريق تضمين واحد أو أكثر مما يلي في ملف gradle.properties الخاص بالمشروع، كما هو موضّح أدناه. يُرجى العِلم أنّه لا يزال بإمكانك استخدام العنصر buildFeatures في ملف build.gradle على مستوى الوحدة لإلغاء هذه الإعدادات التلقائية على مستوى المشروع.

android.defaults.buildfeatures.buildconfig=true
android.defaults.buildfeatures.aidl=true
android.defaults.buildfeatures.renderscript=true
android.defaults.buildfeatures.resvalues=true
android.defaults.buildfeatures.shaders=true

الاعتمادات بين الميزات

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

التبعيات بين الميزات

تعتمد وحدة الميزات :video على وحدة الميزات :camera، التي تعتمد على الوحدة الأساسية :app.

وهذا يعني أنّه عندما يطلب تطبيقك تنزيل وحدة ميزة، ينزِّل التطبيق أيضًا وحدات الميزات الأخرى التي يعتمد عليها. بعد إنشاء وحدات ميزات لتطبيقك، يمكنك الإفصاح عن الاعتماد بين الميزات في ملف build.gradle الخاص بالوحدة. على سبيل المثال، تعرِض الوحدة :video تبعية على :camera على النحو التالي:

// In the build.gradle file of the ':video' module.
dependencies {
  // All feature modules must declare a dependency
  // on the base module.
  implementation project(':app')
  // Declares that this module also depends on the 'camera'
  // feature module.
  implementation project(':camera')
  ...
}
// In the build.gradle file of the ':video' module.
dependencies {
    // All feature modules must declare a dependency
    // on the base module.
    implementation(project(":app"))
    // Declares that this module also depends on the 'camera'
    // feature module.
    implementation(project(":camera"))
    ...
}

بالإضافة إلى ذلك، عليك تفعيل ميزة الاعتماد على ميزة أخرى في IDE Android Studio (لتفعيل الميزة عند تعديل إعدادات التشغيل، مثلاً) من خلال النقر على المساعدة > تعديل خيارات الجهاز الظاهري المخصّصة من شريط القوائم، بما في ذلك ما يلي:

-Drundebug.feature.on.feature=true

البيانات الوصفية للتبعيات

عند إنشاء تطبيقك باستخدام الإصدار 4.0.0 من "مكوّن إضافي لـ Gradle في Android" والإصدارات الأحدث، يحتوي المكوّن الإضافي على بيانات وصفية تصف التبعيات التي تم تجميعها في تطبيقك. وعند تحميل تطبيقك، تتحقّق أداة Play Console من هذه البيانات الوصفية لتقديم المزايا التالية لك:

  • تلقّي تنبيهات بشأن المشاكل المعروفة في حِزم SDK والعناصر الاعتمادية التي يستخدمها تطبيقك
  • تلقّي ملاحظات قابلة للتنفيذ لحلّ هذه المشاكل

يتم ضغط البيانات وتشفيرها باستخدام مفتاح توقيع Google Play وتخزينها في مجموعة التوقيع لتطبيق الإصدار. ومع ذلك، يمكنك فحص البيانات الوصفية بنفسك في ملفات الإصدارات الوسيطة المحلية في الدليل التالي: <project>/<module>/build/outputs/sdk-dependencies/release/sdkDependency.txt.

إذا كنت تفضّل عدم مشاركة هذه المعلومات، يمكنك إيقافها عن طريق تضمين العنصر التالي في ملف build.gradle الخاص بالوحدة:

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

استيراد المكتبات الأصلية من ملفات AAR التابعة

يمكنك الآن استيراد مكتبات C/C++ من العناصر الاعتمادية لملف AAR الخاص بتطبيقك. عند اتّباع خطوات الضبط описанة أدناه، يوفّر Gradle تلقائيًا هذه المكتبات الأصلية للاستخدام مع نظام الإنشاء الأصلي الخارجي، مثل CMake. تجدر الإشارة إلى أنّ Gradle لا يوفّر هذه المكتبات إلا لعملية الإنشاء، ويجب إعداد نصوص إنشاء التطبيقات لاستخدامها.

يتم تصدير المكتبات باستخدام تنسيق حِزمة Prefab.

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

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

ضبط نظام الإنشاء المتوافق مع الأجهزة الخارجية

للاطّلاع على الخطوات التي يجب اتّباعها، اتّبِع الخطوات التالية لنظام الإنشاء الأصلي الخارجي الذي تخطّط لاستخدامه.

كل ملف من ملفات AAR التي يعتمد عليها تطبيقك والتي تتضمّن رمزًا أصليًا يعرض ملف Android.mk الذي عليك استيراده إلى مشروع ndk-build. يمكنك استيراد هذا الملف باستخدام الأمر import&endash;module الذي يبحث في المسارات التي تحديدها باستخدام السمة import&endash;add&endash;path في مشروع ndk-build. على سبيل المثال، إذا كان تطبيقك يحدّد libapp.so ويستخدم curl، عليك تضمين ما يلي في ملف Android.mk:

  1. بالنسبة إلى CMake:

    add_library(app SHARED app.cpp)

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

  2. بالنسبة إلى ndk-build:

    include $(CLEAR_VARS)
    LOCAL_MODULE := libapp
    LOCAL_SRC_FILES := app.cpp
    # Link libcurl from the curl AAR.
    LOCAL_SHARED_LIBRARIES := curl
    include $(BUILD_SHARED_LIBRARY)

    # If you don't expect that your project will be built using versions of the NDK # older than r21, you can omit this block. ifneq ($(call ndk-major-at-least,21),true) $(call import-add-path,$(NDK_GRADLE_INJECTED_IMPORT_PATH)) endif

    # Import all modules that are included in the curl AAR. $(call import-module,prefab/curl)

يتم عرض التبعيات الأصلية المضمّنة في حزمة AAR لمشروع CMake من خلال المتغيّر CMAKE_FIND_ROOT_PATH{: .external}. سيضبط Gradle هذه القيمة تلقائيًا عند استدعاء CMake، لذا إذا عدّل نظام الإنشاء هذا المتغيّر، احرص على إلحاق بدلاً من تعيينه.

يعرِض كلّ مكوّن تابع حزمة ملفّ ضبط{: .external} لعملية إنشاء CMake، والتي يمكنك استيرادها باستخدام الأمر find_package{: .external}. يبحث هذا الأمر عن حزمملف الإعدادات التي تتطابق مع اسم الحزمة وإصدارها المحدَّدَين ويعرِض الاستهدافات التي يحدِّدها لاستخدامها في عملية الإنشاء. على سبيل المثال، إذا كان تطبيقك يحدّد 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)

يمكنك الآن تحديد #include "curl/curl.h" في app.cpp. عند إنشاء مشروعك، يربط نظام الإنشاء الأصلي الخارجي تلقائيًا libapp.so بـ libcurl.so ويُحزم libcurl.so في حزمة APK أو حِزمة التطبيق. للحصول على معلومات إضافية، يُرجى الاطّلاع على نموذج الوحدات الجاهزة لـ curl{:.external}.

تغييرات السلوك

عند استخدام هذا الإصدار من المكوّن الإضافي، قد تلاحظ التغيُّرات التالية في السلوك.

تعديلات على إعدادات التوقيع في الإصدار 1 أو الإصدار 2

لقد تغيّر سلوك إعدادات توقيع التطبيق في مجموعة signingConfig إلى ما يلي:

توقيع الإصدار 1

  • في حال تفعيل v1SigningEnabled صراحةً، يُجري AGP توقيع التطبيق من الإصدار 1.
  • إذا أوقف المستخدم v1SigningEnabled صراحةً، لن يتم تنفيذ توقيع التطبيق في الإصدار 1.
  • إذا لم يفعِّل المستخدم توقيع الإصدار 1 صراحةً، يمكنه إيقافه تلقائيًا استنادًا إلى minSdk وtargetSdk.

التوقيع بالإصدار 2

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

تسمح هذه التغييرات لـ AGP بتحسين عمليات الإنشاء من خلال إيقاف آلية التوقيع استنادًا إلى ما إذا كان المستخدم قد فعّل هذه العلامات بشكل صريح. قبل هذا الإصدار، كان من الممكن إيقاف v1Signing حتى في حال تفعيله بشكل صريح، ما قد يسبب بعض الالتباس.

إزالة المكوّنين الإضافيَين feature وinstantapp لنظام Gradle المتوافق مع Android

أوقف المكوّن الإضافي لنظام Gradle المتوافق مع Android 3.6.0 نهائيًا المكوّن الإضافي للميزات (com.android.feature) والمكوّن الإضافي للتطبيقات الفورية (com.android.instantapp) وشجّع على استخدام المكوّن الإضافي للميزات الديناميكية (com.android.dynamic-feature) لإنشاء التطبيقات الفورية وتعبئتها باستخدام مجموعة حزمات تطبيق Android.

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

ملاحظة: لفتح المشاريع التي تستخدم المكوّنات الإضافية التي تمت إزالتها في IDE Android Studio 4.0 والإصدارات الأحدث، يجب أن يستخدم المشروع المكوّن الإضافي لنظام Gradle المتوافق مع Android 3.6.0 أو إصدارًا أقدم.

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

تمت إزالة إمكانية فصل معالجة التعليقات التوضيحية إلى مهمة مخصّصة. تم استخدام هذا الخيار للحفاظ على compiling Java المتصاعد عند استخدام معالجات التعليقات التوضيحية غير المتصاعدة في المشاريع التي تستخدم Java فقط. وتم تفعيله من خلال ضبط android.enableSeparateAnnotationProcessing على true في ملف gradle.properties، والذي لم يعُد يعمل.

بدلاً من ذلك، عليك نقل البيانات إلى استخدام معالجات التعليقات التوضيحية المتزايدة لتحسين أداء عملية الإنشاء.

تم إيقاف includeCompileClasspath نهائيًا

لم يعُد المكوّن الإضافي لنظام Gradle المتوافق مع Android يتحقّق من معالجات التعليقات التوضيحية التي تحدّدها في مسار تجميع الترجمة البرمجية أو يشملها، ولم يعُد لخاصية annotationProcessorOptions.includeCompileClasspath DSL أي تأثير. في حال تضمين معالجات التعليقات التوضيحية في مسار تجميع الفصول الدراسية، قد تظهر لك رسالة الخطأ التالية:

Error: Annotation processors must be explicitly declared now.

لحلّ هذه المشكلة، يجب تضمين معالجات التعليقات التوضيحية فيملفاتك build.gradle باستخدام إعدادات التبعية annotationProcessor. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة إضافة معالجات التعليقات التوضيحية.

الحِزم التلقائية للتبعيات المُسبقة الإنشاء التي يستخدمها CMake

كانت الإصدارات السابقة من "المكوّن الإضافي لنظام Gradle المتوافق مع Android" تتطلّب منك تجميع أي مكتبات مُجمَّعة مسبقًا يستخدمها الإصدار الخارجي من CMake المُجمَّع من رموز برمجية أصلية باستخدام jniLibs. قد تكون لديك مكتبات في ملف src/main/jniLibs الخاص بالوحدة، أو ربما في ملف build.gradle تم ضبطه في ملف build.gradle:

sourceSets {
  main {
    // The libs directory contains prebuilt libraries that are used by the
    // app's library defined in CMakeLists.txt via an IMPORTED target.
    jniLibs.srcDirs = ['libs']
  }
}
sourceSets {
  main {
    // The libs directory contains prebuilt libraries that are used by the
    // app's library defined in CMakeLists.txt via an IMPORTED target.
    jniLibs.setSrcDirs(listOf("libs"))
  }
}

مع استخدام الإصدار 4.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android"، لم تعُد عملية الضبط أعلاه ضرورية وستؤدي إلى تعذُّر إنشاء الحِزمة:

* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
  > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
    > More than one file was found with OS independent path 'lib/x86/libprebuilt.so'

تُجمِّع الآن الإصدارات الخارجية الأصلية هذه المكتبات تلقائيًا، لذا يؤدي تجميع المكتبة صراحةً باستخدام jniLibs إلى تكرار المحتوى. لتجنّب خطأ الإنشاء، عليك نقل المكتبة المُنشأة مسبقًا إلى موقع خارج jniLibs أو إزالة إعدادات jniLibs من ملفbuild.gradle.

المشاكل المعروفة

يصف هذا القسم المشاكل المعروفة في الإصدار 4.0.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android".

حالة تسابق في آلية عامل Gradle

يمكن أن تؤدي التغييرات في الإصدار 4.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android إلى حدوث تداخل في Gradle عند التشغيل مع &endash;&endash;no&endash;daemon وإصدارات Gradle 6.3 أو الإصدارات الأقدم، ما يؤدي إلى تعليق عمليات التصميم بعد اكتمالها.

سيتم حلّ هذه المشكلة في Gradle 6.4.