انواع انتشار به شما امکان می دهد تجربه سفارشی تری را برای کاربران خود ایجاد کنید. پیکربندی انواع انتشارات به شما امکان می دهد انواع مختلف ساخت را منتشر کنید که هر کدام ویژگی های خاص خود را دارند.
انتشار چندین نسخه ساخت کتابخانه شما به کاربر امکان می دهد ویژگی های مناسب را برای نیازهای خود انتخاب کند. به عنوان مثال، میتوانید مصنوعات مختلفی را برای اشکالزدایی در مقابل انواع ساخت منتشر کنید. مصنوع انتشار اشکال زدایی ممکن است دارای کد گزارش اضافی و وابستگی های مختلف برای فعال کردن این گزارش اضافی باشد.
قبل از ادامه، مطمئن شوید که کتابخانه خود را برای انتشار آماده کرده اید.
از Gradle Module Metadata استفاده کنید
برای انتشار انواع کتابخانه خود، باید از Gradle Module Metadata (GMM) استفاده کنید. GMM انتشارات شما را توصیف میکند و مدیریت وابستگی آگاهانه را حفظ میکند. GMM به طور پیش فرض با کتابخانه شما منتشر می شود.
مزایای استفاده از GMM عبارتند از:
- اگر از GMM با Gradle 6.0 یا بالاتر استفاده میکنید، میتوانید چندین نوع انتشار یا مصنوعات متعدد را منتشر کنید - هر کدام با ویژگیها و وابستگیهای خاص خود. اگر از فایل POM Maven به جای GMM استفاده می کنید، فقط می توانید یک مصنوع را منتشر کنید. اگر از یک فایل POM استفاده می کنید، می توانید مصنوعات اضافی را با استفاده از طبقه بندی کننده ها منتشر کنید، اما مصنوعات اضافی نمی توانند وابستگی های خاص خود را داشته باشند.
- Gradle به طور خودکار یک نوع برای کامپایل و یکی برای زمان اجرا ایجاد می کند که هر کدام وابستگی های خاص خود را دارند. شما ممکن است یک نوع را برای کامپایل و دیگری را برای زمان اجرا منتشر کنید، بنابراین مصرفکننده میتواند بر اساس زمان استفاده از کتابخانه شما انتخاب کند. GMM به مصرفکنندگان این امکان را میدهد که وابستگیهای مختلف را برای کامپایل و زمان اجرا ببینند، بر اساس استفاده کتابخانه منتشر شده از
api
،implementation
یاcompileOnly
/runtimeOnly
. برای مشاهده لیست کامل وابستگی ها به تنظیمات وابستگی مراجعه کنید. این امکان وجود دارد حتی اگر یک نسخه انتشاری را منتشر کنید. - هنگام استفاده از دستگاه های آزمایشی، می توانید یک نوع اضافی را با متادیتا یا قابلیت های ویژه منتشر کنید که به مصرف کننده اجازه می دهد آن را انتخاب کند. این امکان وجود دارد حتی اگر یک نسخه انتشاری را منتشر کنید.
انواع انتشارات را درک کنید
برای درک نحوه عملکرد انواع انتشارات، آشنایی با مراحل اولیه انتشار Gradle مفید است. در اینجا برخی از مفاهیم کلیدی انتشار آورده شده است:
- نوع ساخت : پیکربندی Gradle برای ساخت کتابخانه شما استفاده میکند، که محصول متقابل نوع ساخت و طعم محصول است. برای کسب اطلاعات بیشتر، به واژه نامه ساخت اندروید مراجعه کنید.
- مصنوع : یک فایل یا دایرکتوری که یک بیلد تولید می کند. در زمینه انتشار کتابخانه، یک مصنوع معمولاً یک فایل JAR یا AAR است.
- نوع انتشار : یک مصنوع با ویژگیها، ویژگیها و وابستگیهای مرتبط با آن. توجه داشته باشید که Gradle انواع انتشارات را انواع مختلف می نامد. با این حال، در این اسناد به آنها انواع انتشار می گویند تا آنها را از انواع ساخت متمایز کنند.
- ویژگی : Gradle از ویژگیها برای شناسایی و انتخاب انواع انتشارات در صورت وجود چندین گزینه استفاده میکند. به عنوان مثال،
org.gradle.usage=java-api
وorg.gradle.jvm.version=11
ویژگی های متغیر هستند. - جزء نرم افزار : یک شی Gradle که می تواند یک یا چند نوع انتشار را در خود جای دهد و در یک مجموعه مختصات Maven منتشر می شود (
groupdId:artifactId:version
). در DSL Gradle از طریقProject.getComponents()
در معرض دید قرار می گیرد. - انتشار : آنچه در مخزن منتشر می شود و مصرف کنندگان از آن استفاده می کنند. انتشارات از یک جزء نرم افزاری و فراداده آن - به عنوان مثال، هویت آن (
groupId:artifactId:version
) تشکیل شده است.
افزونه Android Gradle (AGP) 7.1 یک زبان مخصوص دامنه (DSL) را معرفی می کند تا کنترل کند که کدام نوع ساخت در طول انتشار استفاده می شود و کدام نادیده گرفته می شود. DSL به شما امکان می دهد نمونه هایی از SoftwareComponent
ایجاد کنید که حاوی یکی از موارد زیر باشد:
- یک نوع انتشار از یک نسخه ساخت
- چندین نوع انتشار از چندین نوع ساخت
هنگام ایجاد یک مؤلفه نرم افزاری با انواع انتشارات متعدد، AGP ویژگی هایی را برای هر گونه تنظیم می کند که به مصرف کننده اجازه می دهد نوع مناسب مورد نیاز خود را انتخاب کند. این ویژگیها مستقیماً از نوع ساخت و طعمهای مورد استفاده برای ایجاد نوع ساخت ناشی میشوند. ایجاد یک مؤلفه با یک نوع انتشار واحد نیازی به ویژگی ندارد زیرا نیازی به تمایز وجود ندارد.
یک مؤلفه نرم افزاری با یک نوع انتشار واحد ایجاد کنید
قطعه زیر یک مؤلفه نرم افزاری را با یک نسخه انتشاری ایجاد شده از نسخه ساخت release
پیکربندی می کند و منبع JAR را به عنوان یک مصنوع ثانویه اضافه می کند:
کاتلین
android { publishing { singleVariant("release") { withSourcesJar() } } }
شیار
android { publishing { singleVariant('release') { withSourcesJar() } } }
میتوانید چندین مؤلفه ایجاد کنید، هر کدام با یک نسخه انتشاری واحد، و آنها را تحت مختصات Maven مختلف توزیع کنید. در این مورد، ویژگیها روی نوع انتشار تنظیم نمیشوند. شما نمی توانید با نگاه کردن به فراداده انتشارات متوجه شوید که این نوع انتشار از نوع ساخت نسخه release
است. از آنجایی که تنها یک نوع انتشار وجود دارد، نیازی به ابهامزدایی نیست.
یک جزء نرم افزاری با انواع انتشارات متعدد ایجاد کنید
شما می توانید همه یا یک زیر مجموعه از انواع ساخت را برای قرار دادن در یک جزء نرم افزاری انتخاب کنید. AGP به طور خودکار از نام های نوع ساخت، نام طعم محصول و نام ابعاد طعم محصول برای ایجاد ویژگی ها استفاده می کند تا پروژه مصرف کننده بتواند بین آنها تمایز قائل شود.
برای انتشار همه انواع ساخت در یک مؤلفه، allVariants()
در بلوک multipleVariants{}
در فایل build.gradle
سطح ماژول مشخص کنید:
کاتلین
android { publishing { multipleVariants { allVariants() withJavadocJar() } } }
شیار
android { publishing { multipleVariants { allVariants() withJavadocJar() } } }
این یک جزء واحد به نام default
ایجاد می کند. برای نامگذاری مؤلفه خود به شکل دیگری، از multipleVariants( {name} )
استفاده کنید. در این مورد، تمام ابعاد نوع ساخت و طعم محصول به عنوان ویژگی استفاده می شود.
همچنین میتوانید با استفاده از includeBuildTypeValues()
و includeFlavorDimensionAndValues()
انتخاب کنید که کدام گونهها منتشر شوند:
کاتلین
android { publishing { multipleVariants("custom") { includeBuildTypeValues("debug", "release") includeFlavorDimensionAndValues( dimension = "color", values = arrayOf("blue", "pink") ) includeFlavorDimensionAndValues( dimension = "shape", values = arrayOf("square") ) } } }
شیار
android { publishing { multipleVariants('custom') { includeBuildTypeValues('debug', 'release') includeFlavorDimensionAndValues( /*dimension =*/ 'color', /*values =*/ 'blue', 'pink' ) includeFlavorDimensionAndValues( /*dimension =*/ 'shape', /*values =*/ 'square' ) } } }
در این مثال، کامپوننت سفارشی شامل تمام ترکیبات ( debug
، release
) برای نوع ساخت، ( blue
، pink
) برای color
بعد، و ( square
) برای shape
ابعاد است.
همه ابعاد طعم باید فهرست شوند، حتی اگر فقط یک مقدار را از یک بعد منتشر می کنید، بنابراین AGP می داند که از کدام مقدار برای هر بعد استفاده کند.
جدول زیر انواع انتشارات و ویژگی های مرتبط با آنها را فهرست می کند.
نوع | صفات |
---|---|
blueSquareDebug | com.android.build.api.attributes.BuildTypeAttr ="debug" com.android.build.api.attributes.ProductFlavorAttr:color ="blue" |
blueSquareRelease | com.android.build.api.attributes.BuildTypeAttr="release" |
pinkSquareDebug | com.android.build.api.attributes.BuildTypeAttr="debug" |
pinkSquareRelease | com.android.build.api.attributes.BuildTypeAttr="release" |
در عمل، انواع بیشتری منتشر می شود. به عنوان مثال، هر یک از انواع بالا دو بار منتشر می شود، یک بار برای کامپایل و یک بار برای زمان اجرا، با وابستگی های مختلف (بر اساس اینکه وابستگی های اعلام شده از implementation
یا api
استفاده می کنند) و با مقدار متفاوتی برای ویژگی org.gradle.Usage
. با این حال، مصنوعات (فایل AAR) برای این دو نوع یکسان است.
برای اطلاعات بیشتر، به مستندات publishing
API مراجعه کنید.
مشکل سازگاری برای انتشار کتابخانه های چند طعمی
پروژه ای که از AGP 7.0 یا پایین تر استفاده می کند، نمی تواند کتابخانه های چند طعمی منتشر شده با AGP 7.1 یا بالاتر را مصرف کند. این یک مشکل شناخته شده است که به دلیل تغییر نام ویژگی برای بعد طعم محصول از dimensionName
به com.android.build.api.attributes.ProductFlavor:dimensionName
در AGP 7.1 ایجاد می شود. بسته به راهاندازی پروژهتان، میتوانید از missingDimensionStrategy
در نسخه قدیمی API برای حل این مشکل استفاده کنید.
به عنوان مثال، فرض کنید پروژه برنامه شما فقط یک بعد طعم محصول نسخه دارد:
کاتلین
android {
applicationVariants.forEach { variant ->
val flavor = variant.productFlavors[0].name
val attributePrefix = "com.android.build.api.attributes.ProductFlavor"
val dimensionName = "version"
variant.missingDimensionStrategy("$attributePrefix:$dimensionName", flavor)
}
}
شیار
android {
applicationVariants.forEach { variant ->
def flavor = variant.getProductFlavors()[0].name
def attributePrefix = "com.android.build.api.attributes.ProductFlavor"
def dimensionName = "version"
variant.missingDimensionStrategy("$attributePrefix:$dimensionName", flavor)
}
}