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

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

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

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

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

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

لمعالجة هذه المشكلة، نحن بصدد إطلاق مجموعة من التصحيحات للإصدار 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"

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

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

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

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

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

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

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

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.