الإصدار 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 تتيح استهداف الإصدار 11 من نظام التشغيل Android، قد تواجه أخطاء في دمج ملف البيان عند إنشاء تطبيقك.

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

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

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

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

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

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

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

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

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

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

إزالة السكر من مكتبة Java 8 في D8 وR8

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

من خلال عملية تُعرف باسم إزالة السكر، وفَّر برنامج تجميع DEX، أي D8، في الإصدار 3.0 والإصدارات الأحدث من Android Studio دعمًا كبيرًا لميزات لغة Java 8 (مثل تعبيرات lambda وطُرق الواجهة التلقائية وعبارة try-with-resources وغير ذلك). في Android Studio 4.0، تم توسيع نطاق محرك إزالة التشويش ليتمكّن من إزالة التشويش من واجهات برمجة التطبيقات للغة 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 (مع إصلاحات للأخطاء في الإصدار 5.0 من نظام التشغيل Android)

ولإتاحة استخدام واجهات برمجة التطبيقات هذه، يجمع المحوّل البرمجي 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 على وحدة المكتبة بشكل منفصل. يساعد ذلك أداة lint في التعرّف على الاستخدامات الصالحة لواجهات برمجة التطبيقات الخاصة باللغة وتجنُّب عرض تحذيرات خاطئة.

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

يقدّم الإصدار 4.0.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android طريقة جديدة للتحكّم في ميزات الإصدار التي تريد تفعيلها وإيقافها، مثل View Binding وData Binding. عند إضافة ميزات جديدة، سيتم إيقافها تلقائيًا. يمكنك بعد ذلك استخدام الحظر 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"))
    ...
}

بالإضافة إلى ذلك، عليك تفعيل ميزة التبعية بين الميزات في Android Studio (لإتاحة استخدام الميزة عند تعديل إعدادات التشغيل، على سبيل المثال) من خلال النقر على Help > Edit Custom VM Options من شريط القوائم وتضمين ما يلي:

-Drundebug.feature.on.feature=true

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

عند إنشاء تطبيقك باستخدام الإصدار 4.0.0 من Android Gradle Plugin أو الإصدارات الأحدث، تتضمّن الإضافة بيانات وصفية توضّح العناصر التابعة التي يتم تجميعها في تطبيقك. وعند تحميل تطبيقك، تفحص أداة 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}. يبحث هذا الأمر عن حِزم config-file التي تتطابق مع اسم الحزمة والإصدار المحدّدين، ويعرض الأهداف التي تحدّدها لاستخدامها في عملية الإنشاء. على سبيل المثال، إذا كان تطبيقك يحدّد 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 بشكل صريح، ينفّذ "مكوّن Android الإضافي في Gradle" عملية توقيع التطبيق باستخدام الإصدار 1.
  • إذا أوقف المستخدم v1SigningEnabled بشكل صريح، لن يتم تنفيذ عملية توقيع التطبيق باستخدام الإصدار 1.
  • إذا لم يفعّل المستخدم التوقيع باستخدام الإصدار 1 بشكل صريح، يمكن إيقافه تلقائيًا استنادًا إلى minSdk وtargetSdk.

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

  • إذا تم تفعيل v2SigningEnabled بشكل صريح، تنفِّذ "مكوّنات Android الإضافية في Gradle" عملية توقيع التطبيق باستخدام الإصدار 2.
  • إذا أوقف المستخدم v2SigningEnabled بشكل صريح، لن يتم تنفيذ عملية توقيع التطبيق باستخدام الإصدار 2.
  • إذا لم يفعّل المستخدم التوقيع باستخدام الإصدار 2 بشكل صريح، يمكن إيقافه تلقائيًا استنادًا إلى targetSdk.

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

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

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

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

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

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

تمت إزالة إمكانية فصل معالجة التعليقات التوضيحية إلى مهمة مخصّصة. كان هذا الخيار يُستخدَم للحفاظ على عملية تجميع 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:

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 والإصدارات 6.3 أو الأقدم من Gradle، ما يؤدي إلى توقّف عمليات الإنشاء بعد انتهائها.

سيتم حلّ هذه المشكلة في الإصدار 6.4 من Gradle.