این بخش موضوعات پیشرفته ای را توضیح می دهد که برای زمانی که می خواهید افزونه Android Gradle را گسترش دهید یا افزونه خود را بنویسید مفید هستند.
انتشار وابستگی های مختلف به منطق سفارشی
یک کتابخانه میتواند قابلیتهایی داشته باشد که پروژهها یا پروژههای فرعی ممکن است بخواهند از آنها استفاده کنند. انتشار یک کتابخانه فرآیندی است که از طریق آن کتابخانه در دسترس مصرف کنندگان خود قرار می گیرد. کتابخانهها میتوانند کنترل کنند که مصرفکنندگان به کدام وابستگیها در زمان کامپایل و زمان اجرا دسترسی دارند.
دو پیکربندی جداگانه وجود دارد که وابستگیهای انتقالی هر مسیر کلاس را نگه میدارد که باید توسط مصرفکنندگان برای مصرف کتابخانه به شرح زیر استفاده شود:
-
variant_name ApiElements
: این پیکربندی وابستگیهای انتقالی را که در زمان کامپایل در دسترس مصرفکنندگان هستند، نگه میدارد. -
variant_name RuntimeElements
: این پیکربندی وابستگیهای انتقالی را که در زمان اجرا در دسترس مصرفکنندگان هستند، نگه میدارد.
برای کسب اطلاعات بیشتر در مورد روابط بین پیکربندیهای مختلف، به تنظیمات افزونه کتابخانه جاوا بروید.
استراتژی های حل وابستگی سفارشی
یک پروژه ممکن است شامل یک وابستگی به دو نسخه مختلف از یک کتابخانه باشد که می تواند منجر به تضاد وابستگی شود. به عنوان مثال، اگر پروژه شما به نسخه 1 ماژول A و نسخه 2 ماژول B بستگی دارد، و ماژول A به طور گذرا به نسخه 3 ماژول B بستگی دارد، یک تضاد نسخه وابستگی ایجاد می شود.
برای حل این تضاد، افزونه Android Gradle از استراتژی تفکیک وابستگی زیر استفاده میکند: وقتی افزونه تشخیص میدهد که نسخههای مختلف یک ماژول در نمودار وابستگی هستند، به طور پیشفرض، نسخهای را انتخاب میکند که دارای بالاترین شماره نسخه است.
با این حال، این استراتژی ممکن است همیشه آنطور که می خواهید کار نکند. برای سفارشی کردن استراتژی تفکیک وابستگی، از پیکربندیهای زیر برای حل وابستگیهای خاص یک نوع که برای کار شما لازم است استفاده کنید:
-
variant_name CompileClasspath
: این پیکربندی حاوی استراتژی وضوح برای مسیر کلاسی کامپایل یک نوع معین است. -
variant_name RuntimeClasspath
: این پیکربندی حاوی استراتژی وضوح برای مسیر کلاس زمان اجرا یک نوع معین است.
پلاگین Android Gradle شامل دریافت کننده هایی است که می توانید برای دسترسی به اشیاء پیکربندی هر نوع از آنها استفاده کنید. بنابراین، میتوانید از API متغیر برای پرسوجو رزولوشن وابستگی همانطور که در مثال زیر نشان داده شده است استفاده کنید:
کاتلین
android { applicationVariants.all { // Return compile configuration objects of a variant. compileConfiguration.resolutionStrategy { // Use Gradle's ResolutionStrategy API // to customize how this variant resolves dependencies. ... } // Return runtime configuration objects of a variant. runtimeConfiguration.resolutionStrategy { ... } // Return annotation processor configuration of a variant. annotationProcessorConfiguration.resolutionStrategy { ... } } }
شیار
android { applicationVariants.all { variant -> // Return compile configuration objects of a variant. variant.getCompileConfiguration().resolutionStrategy { // Use Gradle's ResolutionStrategy API // to customize how this variant resolves dependencies. ... } // Return runtime configuration objects of a variant. variant.getRuntimeConfiguration().resolutionStrategy { ... } // Return annotation processor configuration of a variant. variant.getAnnotationProcessorConfiguration().resolutionStrategy { ... } } }