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

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

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

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

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

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

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

في حال استخدام
إصدار AGP...
...الترقية إلى:
*4.0 4.0.1
*3.6 3.6.4
*3.5 3.5.4
*3.4 3.4.3
*3.3 3.3.3

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

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

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

دعم أداة تحليل إصدار Android Studio

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

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

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

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

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

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

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

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

يقدّم الإصدار 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 واحدة كحد أقصى، وتتألف من وحدة واحدة أو أكثر. الوحدة الأولية هي مكتبة واحدة يمكن أن تكون إما مكتبة مشترَكة أو ثابتة أو مكتبة ذات عنوان فقط.

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

ضبط إعدادات نظام الإصدار الأصلي الخارجي

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

يعرض كل من تبعيات AAR في تطبيقك، التي تتضمّن رمزًا برمجيًا أصليًا، ملف Android.mk تحتاج إلى استيراده إلى مشروع إصدار ndk. يمكنك استيراد هذا الملف باستخدام الأمر 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، وبالتالي إذا كان نظام الإصدار يعدّل هذا المتغيّر، تأكد من إلحاقه بدلاً من تعيينه.

تعرض كل تبعية حزمة config-file{: .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 prefab sample{:.external}.

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

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

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

لقد تغيَّر سلوك إعدادات توقيع التطبيق في كتلة 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". من خلال نقل بيانات تطبيقاتك الفورية، يمكنك الاستفادة من مزايا حِزم التطبيقات وتبسيط التصميم النموذجي لتطبيقك.

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

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

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

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

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

لم يعُد المكوّن الإضافي لنظام Gradle المتوافق مع Android يتحقّق من معالِجات التعليقات التوضيحية التي تُحدّدها في مسار تصنيف التجميع، ولم يعُد لخاصية DSL 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 والإصدارات من Gradle 6.3 أو الإصدارات الأقدم، ما يؤدي إلى تعليق الإصدارات بعد انتهاء التصميم.

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