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

يتطلّب هذا الإصدار ما يلي:

‫4.0.1 (يوليو 2020)

يتيح هذا التحديث الطفيف التوافق مع الإعدادات التلقائية والميزات الجديدة لإمكانية الوصول إلى الحِزم في Android 11.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

-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}.

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

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

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

تغيّر سلوك إعدادات توقيع التطبيق في الحظر signingConfig ليصبح على النحو التالي:

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

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

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

  • إذا تم تفعيل v2SigningEnabled بشكل صريح، ينفِّذ AGP عملية توقيع التطبيق باستخدام الإصدار 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 والإصدارات الأحدث، تمت إزالة هذه المكوّنات الإضافية المتوقّفة نهائيًا. لذا، لاستخدام أحدث إصدار من المكوّن الإضافي لنظام Gradle المتوافق مع Android، عليك نقل تطبيقك الفوري ليتوافق مع حِزم Android App Bundle. من خلال نقل تطبيقاتك الفورية، يمكنك الاستفادة من مزايا حِزم التطبيقات وتبسيط التصميم المعياري لتطبيقك.

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