افزونه اندروید گریدل ۴.۰.۰ (آوریل ۲۰۲۰)

این نسخه از افزونه اندروید به موارد زیر نیاز دارد:

۴.۰.۱ (ژوئیه ۲۰۲۰)

این به‌روزرسانی جزئی از سازگاری با تنظیمات پیش‌فرض جدید و ویژگی‌های مربوط به قابلیت مشاهده بسته در اندروید ۱۱ پشتیبانی می‌کند.

در نسخه‌های قبلی اندروید، امکان مشاهده لیستی از تمام برنامه‌های نصب شده روی دستگاه وجود داشت. از اندروید ۱۱ (سطح API 30)، برنامه‌ها به طور پیش‌فرض فقط به یک لیست فیلتر شده از بسته‌های نصب شده دسترسی دارند. برای مشاهده لیست گسترده‌تری از برنامه‌های روی سیستم، اکنون باید یک عنصر <queries> را در مانیفست اندروید برنامه یا کتابخانه خود اضافه کنید .

افزونه‌ی اندروید گریدل ۴.۱+ از قبل با تعریف جدید <queries> سازگار است؛ با این حال، نسخه‌های قدیمی‌تر سازگار نیستند. اگر عنصر <queries> را اضافه کنید یا اگر به کتابخانه یا SDK ای متکی شوید که از اندروید ۱۱ پشتیبانی می‌کند، ممکن است هنگام ساخت برنامه خود با خطاهای ادغام آشکار مواجه شوید.

برای رفع این مشکل، ما مجموعه‌ای از وصله‌ها را برای AGP 3.3 و بالاتر منتشر می‌کنیم. اگر از نسخه قدیمی‌تر AGP استفاده می‌کنید، آن را به یکی از نسخه‌های زیر ارتقا دهید :

حداقل نسخه نسخه پیش‌فرض یادداشت‌ها
گرادل ۶.۱.۱ ۶.۱.۱ برای کسب اطلاعات بیشتر، به به‌روزرسانی Gradle مراجعه کنید.
ابزارهای ساخت SDK ۲۹.۰.۲ ۲۹.۰.۲ ابزارهای ساخت SDK را نصب یا پیکربندی کنید .

برای اطلاعات بیشتر در مورد این ویژگی جدید، به بخش «قابلیت مشاهده بسته‌ها در اندروید ۱۱» مراجعه کنید.

ویژگی‌های جدید

این نسخه از افزونه Android Gradle شامل ویژگی‌های جدید زیر است.

پشتیبانی از تحلیلگر ساخت اندروید استودیو

پنجره Build Analyzer به شما کمک می‌کند تا مشکلات مربوط به فرآیند ساخت خود، مانند بهینه‌سازی‌های غیرفعال و وظایف پیکربندی نشده نادرست را درک و تشخیص دهید. این ویژگی زمانی در دسترس است که از اندروید استودیو ۴.۰ و بالاتر با افزونه Android Gradle نسخه 4.0.0 و بالاتر استفاده می‌کنید. می‌توانید پنجره Build Analyzer را از اندروید استودیو به صورت زیر باز کنید:

  1. اگر هنوز این کار را نکرده‌اید، با انتخاب Build > Make Project از نوار منو، برنامه خود را بسازید.
  2. از نوار منو، گزینه View > Tool Windows > Build را انتخاب کنید.
  3. در پنجره Build ، پنجره Build Analyzer را به یکی از روش‌های زیر باز کنید:
    • پس از اینکه اندروید استودیو ساخت پروژه شما را تمام کرد، روی تب Build Analyzer کلیک کنید.
    • پس از اینکه اندروید استودیو ساخت پروژه شما را تمام کرد، روی لینکی که در سمت راست پنجره Build Output قرار دارد کلیک کنید.

پنجره Build Analyzer مشکلات احتمالی ساخت را در یک درخت در سمت چپ سازماندهی می‌کند. می‌توانید هر مشکل را بررسی کرده و روی آن کلیک کنید تا جزئیات آن را در پنل سمت راست بررسی کنید. وقتی اندروید استودیو ساخت شما را تجزیه و تحلیل می‌کند، مجموعه‌ای از وظایفی را که مدت زمان ساخت را تعیین کرده‌اند محاسبه می‌کند و یک تجسم ارائه می‌دهد تا به شما در درک تأثیر هر یک از این وظایف کمک کند. همچنین می‌توانید با گسترش گره Warnings، جزئیات مربوط به هشدارها را دریافت کنید.

برای کسب اطلاعات بیشتر، رگرسیون‌های سرعت ساخت را شناسایی کنید .

کتابخانه desugaring جاوا ۸ در D8 و R8

افزونه‌ی اندروید گریدل (Android Gradle) اکنون از تعدادی از APIهای زبان جاوا ۸ بدون نیاز به حداقل سطح API برای برنامه‌ی شما پشتیبانی می‌کند.

از طریق فرآیندی به نام desugaring ، کامپایلر DEX، D8، در اندروید استودیو ۳.۰ و بالاتر، پشتیبانی قابل توجهی از ویژگی‌های زبان جاوا ۸ (مانند عبارات لامبدا، متدهای رابط پیش‌فرض، try با منابع و موارد دیگر) ارائه می‌داد. در اندروید استودیو ۴.۰، موتور desugaring گسترش یافته است تا بتواند APIهای زبان جاوا را desugar کند. این بدان معناست که اکنون می‌توانید APIهای زبان استاندارد را که فقط در نسخه‌های اخیر اندروید در دسترس بودند (مانند java.util.streams ) در برنامه‌هایی که از نسخه‌های قدیمی‌تر اندروید پشتیبانی می‌کنند، بگنجانید.

مجموعه API های زیر در این نسخه پشتیبانی می‌شوند:

  • جریان‌های ترتیبی ( java.util.stream )
  • زیرمجموعه‌ای از java.time
  • java.util.function
  • موارد اضافه شده اخیر به java.util.{Map,Collection,Comparator}
  • کلاس‌های اختیاری ( java.util.Optional ، java.util.OptionalInt و java.util.OptionalDouble ) و برخی کلاس‌های جدید دیگر که با APIهای فوق مفید هستند
  • برخی اضافات به java.util.concurrent.atomic (متدهای جدید در AtomicInteger ، AtomicLong و AtomicReference )
  • ConcurrentHashMap (با رفع اشکال برای اندروید ۵.۰)

برای پشتیبانی از این APIهای زبان، D8 یک فایل DEX کتابخانه‌ای جداگانه را کامپایل می‌کند که شامل پیاده‌سازی APIهای از دست رفته است و آن را در برنامه شما قرار می‌دهد. فرآیند desugaring کد برنامه شما را بازنویسی می‌کند تا در زمان اجرا از این کتابخانه استفاده کند.

برای فعال کردن پشتیبانی از این APIهای زبان، موارد زیر را در فایل build.gradle ماژول app خود وارد کنید:

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 یک ماژول کتابخانه نیز وارد کنید، اگر:

  • تست‌های ابزارسازی‌شده‌ی ماژول کتابخانه از این APIهای زبان استفاده می‌کنند (چه مستقیماً و چه از طریق ماژول کتابخانه یا وابستگی‌های آن). این به این دلیل است که APIهای از دست رفته برای APK تست ابزارسازی‌شده‌ی شما فراهم شوند.

  • شما می‌خواهید lint را روی ماژول کتابخانه به صورت ایزوله اجرا کنید. این کار برای کمک به lint در تشخیص کاربردهای معتبر APIهای زبان و جلوگیری از گزارش هشدارهای نادرست است.

گزینه‌های جدید برای فعال یا غیرفعال کردن ویژگی‌های ساخت

افزونه اندروید Gradle نسخه ۴.۰.۰ روش جدیدی را برای کنترل فعال و غیرفعال کردن ویژگی‌های ساخت، مانند 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

وابستگی‌های ویژگی به ویژگی

در نسخه‌های قبلی افزونه‌ی اندروید گریدل، تمام ماژول‌های ویژگی فقط می‌توانستند به ماژول پایه‌ی برنامه وابسته باشند. هنگام استفاده از افزونه‌ی اندروید گریدل ۴.۰.۰، اکنون می‌توانید یک ماژول ویژگی را که به ماژول ویژگی دیگری وابسته است، اضافه کنید. یعنی، یک ویژگی :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"))
    ...
}

علاوه بر این، شما باید ویژگی وابستگی ویژگی به ویژگی را در اندروید استودیو فعال کنید (برای پشتیبانی از این ویژگی هنگام ویرایش پیکربندی Run، به عنوان مثال) با کلیک روی Help > Edit Custom VM Options از نوار منو و وارد کردن موارد زیر:

-Drundebug.feature.on.feature=true

فراداده وابستگی‌ها

هنگام ساخت برنامه خود با استفاده از افزونه Android Gradle نسخه ۴.۰.۰ و بالاتر، این افزونه شامل فراداده‌هایی است که وابستگی‌هایی را که در برنامه شما کامپایل می‌شوند، توصیف می‌کند. هنگام آپلود برنامه شما، کنسول Play این فراداده‌ها را بررسی می‌کند تا مزایای زیر را برای شما فراهم کند:

  • دریافت هشدار برای مشکلات شناخته‌شده با 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. برای سی‌میک:

    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_FIND_ROOT_PATH {: .external} در پروژه CMake شما نمایش داده می‌شوند. این مقدار به طور خودکار توسط 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)

اکنون می‌توانید در app.cpp #include "curl/curl.h" مشخص کنید. هنگام ساخت پروژه، سیستم ساخت بومی خارجی شما به طور خودکار libapp.so را به libcurl.so پیوند می‌دهد و libcurl.so را در APK یا بسته برنامه بسته‌بندی می‌کند. برای اطلاعات بیشتر، به نمونه پیش‌ساخته curl {:.external} مراجعه کنید.

تغییرات رفتاری

هنگام استفاده از این نسخه از افزونه، ممکن است با تغییرات رفتاری زیر مواجه شوید.

به‌روزرسانی‌های پیکربندی امضای نسخه ۱/۲

رفتار مربوط به پیکربندی‌های امضای برنامه در بلوک signingConfig به شکل زیر تغییر کرده است:

امضای نسخه ۱

  • اگر v1SigningEnabled به صراحت فعال باشد، AGP امضای برنامه v1 را انجام می‌دهد.
  • اگر v1SigningEnabled به صراحت توسط کاربر غیرفعال شده باشد، امضای برنامه v1 انجام نمی‌شود.
  • اگر کاربر صراحتاً امضای نسخه ۱ را فعال نکرده باشد، می‌تواند به طور خودکار بر اساس minSdk و targetSdk غیرفعال شود.

امضای v2

  • اگر v2SigningEnabled به صراحت فعال باشد، AGP امضای برنامه v2 را انجام می‌دهد.
  • اگر v2SigningEnabled به صراحت توسط کاربر غیرفعال شده باشد، امضای برنامه v2 انجام نمی‌شود.
  • اگر کاربر صراحتاً امضای نسخه ۲ را فعال نکرده باشد، می‌تواند به طور خودکار بر اساس targetSdk غیرفعال شود.

این تغییرات به AGP اجازه می‌دهد تا با غیرفعال کردن مکانیسم امضا، بر اساس اینکه آیا کاربر صراحتاً این پرچم‌ها را فعال کرده است یا خیر، ساخت‌ها را بهینه کند. قبل از این نسخه، حتی زمانی که v1Signing به صراحت فعال بود، غیرفعال می‌شد که می‌توانست گیج‌کننده باشد.

افزونه‌های اندروید Gradle feature و instantapp حذف شدند

افزونه‌ی اندروید گریدل ۳.۶.۰، افزونه‌ی Feature ( com.android.feature ) و افزونه‌ی Instant App ( com.android.instantapp ) را منسوخ کرد و به جای آن از افزونه‌ی Dynamic Feature ( com.android.dynamic-feature ) برای ساخت و بسته‌بندی برنامه‌های فوری شما با استفاده از Android App Bundles استفاده کرد.

در افزونه اندروید گریدل ۴.۰.۰ و بالاتر، این افزونه‌های منسوخ‌شده به‌طور کامل حذف شده‌اند. بنابراین، برای استفاده از آخرین افزونه اندروید گریدل، باید برنامه فوری خود را برای پشتیبانی از بسته‌های برنامه اندروید (Android App Bundles) منتقل کنید . با مهاجرت برنامه‌های فوری خود، می‌توانید از مزایای بسته‌های برنامه بهره‌مند شوید و طراحی ماژولار برنامه خود را ساده کنید .

توجه: برای باز کردن پروژه‌هایی که از افزونه‌های حذف‌شده در اندروید استودیو ۴.۰ و بالاتر استفاده می‌کنند، پروژه باید از افزونه اندروید گریدل ۳.۶.۰ یا پایین‌تر استفاده کند.

ویژگی پردازش جداگانه حاشیه‌نویسی حذف شد

قابلیت جداسازی پردازش حاشیه‌نویسی به یک وظیفه اختصاصی حذف شده است. این گزینه برای حفظ کامپایل افزایشی جاوا، زمانی که پردازنده‌های حاشیه‌نویسی غیرافزایشی در پروژه‌های صرفاً جاوا استفاده می‌شوند، استفاده می‌شد؛ این قابلیت با تنظیم android.enableSeparateAnnotationProcessing روی true در فایل gradle.properties فعال می‌شد، که دیگر کار نمی‌کند.

در عوض، شما باید به استفاده از پردازنده‌های حاشیه‌نویسی افزایشی مهاجرت کنید تا عملکرد ساخت را بهبود بخشید.

includeCompileClasspath منسوخ شده است

افزونه‌ی Android Gradle دیگر پردازنده‌های حاشیه‌نویسی که در مسیر کامپایل تعریف می‌کنید را بررسی یا لحاظ نمی‌کند، و ویژگی annotationProcessorOptions.includeCompileClasspath DSL دیگر هیچ تاثیری ندارد. اگر پردازنده‌های حاشیه‌نویسی را در مسیر کامپایل لحاظ کنید، ممکن است خطای زیر را دریافت کنید:

Error: Annotation processors must be explicitly declared now.

برای حل این مشکل، باید پردازنده‌های حاشیه‌نویسی را با استفاده از پیکربندی وابستگی annotationProcessor در فایل‌های build.gradle خود وارد کنید. برای کسب اطلاعات بیشتر، افزودن پردازنده‌های حاشیه‌نویسی را مطالعه کنید.

بسته‌بندی خودکار وابستگی‌های از پیش ساخته شده مورد استفاده توسط CMake

نسخه‌های قبلی افزونه‌ی اندروید گریدل ایجاب می‌کرد که شما صراحتاً هر کتابخانه‌ی از پیش ساخته شده‌ای را که توسط ساخت بومی خارجی 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"))
  }
}

با افزونه اندروید گریدل ۴.۰، پیکربندی فوق دیگر ضروری نیست و منجر به شکست در ساخت خواهد شد:

* 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 خود حذف کنید.

مشکلات شناخته شده

این بخش مشکلات شناخته‌شده‌ای را که در افزونه‌ی اندروید Gradle نسخه ۴.۰.۰ وجود دارد، شرح می‌دهد.

شرایط رقابتی در مکانیزم کارگر Gradle

تغییرات در افزونه اندروید Gradle نسخه ۴.۰ می‌تواند هنگام اجرا با &endash;&endash;no&endash;daemon و نسخه‌های Gradle 6.3 یا پایین‌تر، باعث ایجاد شرایط رقابتی در Gradle شود و باعث شود که buildها پس از اتمام build، هنگ کنند.

این مشکل در Gradle 6.4 برطرف خواهد شد.