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

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

الإصدار 4.0.1 (يوليو 2020)

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

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

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

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

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

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

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

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

التوافق مع أداة "محلّل الإصدار" في "استوديو Android"

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

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

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

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

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

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

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

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

لتفعيل دعم واجهات برمجة تطبيقات اللغة هذه، أدرِج ما يلي في ملف وحدة التطبيق's 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") }

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

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

  • إذا كنت تريد تشغيل أداة lint على وحدة المكتبة بشكل منفصل يساعد ذلك أداة 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 block في ملف 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" (لدعم الميزة عند تعديل إعدادات التشغيل، مثلاً) من خلال النقر على مساعدة > تعديل خيارات الجهاز الظاهري المخصّصة من شريط القوائم وتضمين ما يلي:

-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 prefab sample{:.external}.

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

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

تعديلات على إعدادات التوقيع v1/v2

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

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

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

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

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

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

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

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

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

ملاحظة: لفتح المشاريع التي تستخدم المكوّنات الإضافية التي تمت إزالتها في "استوديو Android" 4.0 والإصدارات الأحدث منه، يجب أن يستخدم المشروع الإصدار 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 أو الإصدارات الأقدم منه، ما يؤدي إلى توقّف عمليات الإصدار بعد انتهائها.

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