در پروژههایی که ماژولهای زیادی دارند، توزیع «کتابخانههای Android» برای کاربران درحالیکه سعی میکنید ساختار پروژه واضحی داشته باشید میتواند چالشبرانگیز باشد. در بسیاری از موارد، کتابخانههای بسیار بیشتری نسبتبه آنچه درنظر گرفته شده است باید منتشر شوند.
افزونه Fused Library که با افزونه Android Gradle همراه است، به بستهبندی چندین ماژول Android Library در یک Android Library قابلانتشار کمک میکند. این کار به شما امکان میدهد کد منبع و منابع کتابخانهتان را در ساخت خود بهصورت ماژولار درآورید، درحالیکه از افشای ساختار پروژهتان پساز توزیع جلوگیری میکند.
توزیع بهعنوان یک کتابخانه واحد میتواند مزایای زیر را داشته باشد:
- وابستگیهای سادهشده: وابستگیهای چند کتابخانهای را با یک AAR جایگزین میکند و راهاندازی پروژه و مدیریت نسخه را برای کاربران شما ساده میکند
- کاهش اندازه کتابخانه: ممکن است کوچک کردن کد را بهبود بخشد و منجر به AARهای کوچکتر شود
- امنیت بهبودیافته: میتواند کنترل بهتری بر جزئیات پیادهسازی داخلی کتابخانههای منتشرشده ارائه دهد
ایجاد کتابخانه ادغامشده
برای ساختن کتابخانه ادغامشده، باید ماژول Android جدیدی ایجاد کنید، وابستگیها را اضافه کنید، و سپس کتابخانه ادغامشده را منتشر کنید.
پیشنیازها
برای استفاده از افزایه Fused Library، از AGP نسخه ۹.۰ یا بالاتر استفاده کنید. نسخههای قبلی افزایه Fused Library رفتار و مشکلات متفاوتی دارند که در AGP 9.0 برطرف شدهاند.
افزودن ماژول کتابخانه ادغامشده جدید
برای استفاده از افزونه، باید یک ماژول Android جدید به پروژه خود اضافه کنید:
در این مثال، ماژول کتابخانه ادغامشده myFusedLibrary نامیده میشود.
-
include(":myFusedLibrary")را به فایلsettings.gradle.ktsاضافه کن. android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }را در بخش[plugins]در فایلgradle/libs.versions.tomlاضافه کنید.alias(libs.plugins.android.fusedlibrary) apply falseرا در بلوک افزونهها در فایل سطح بالایbuild.gradle.ktsاضافه کنید.- برای ایجاد کردن ماژول
myFusedLibrary، دایرکتوری جدیدی بهنامmyFusedLibraryایجاد کنید (روی «برنامه من» کلیک راست کنید > جدید > دایرکتوری). - فایل
build.gradle.ktsرا در واحدmyFusedLibraryایجاد کنید (روی واحدmyFusedLibraryکلیک راست کنید > جدید > فایل). - موارد زیر را در فایل
myFusedLibrary/build.gradle.ktsجایگذاری کنید:
کاتلین
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { namespace = "com.example.myFusedLibrary" minSdk = 21 } dependencies { }
شیک
plugins { id 'com.android.fused-library' } androidFusedLibrary { namespace 'com.example.myFusedLibrary' minSdk 21 } dependencies { }
افزودن وابستگیها
عملکرد اصلی کتابخانه ادغامشده، بستهبندی وابستگیها است. افزونه
از افزودن وابستگیهای پروژه محلی و کتابخانههای خارجی پشتیبانی میکند.
برای مشخص کردن وابستگیهایی که باید بستهبندی شوند، از پیکربندی include استفاده کنید.
وابستگیهای انتقالی بستهبندی نشدهاند.
برای مثال:
کاتلین
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
شیک
dependencies { include project(':image-rendering') include 'mycoolfonts:font-wingdings:5.0' }
کتابخانه ادغامشدهتان را منتشر کنید
باید قبلاز انتشار کتابخانه ادغامشده، با انتشار کتابخانه Android آشنا شوید. انتشار کتابخانه ادغامشده مشابه انتشار کتابخانه Android است، اما تفاوتهای کلیدی وجود دارد که باید برای انتشار صحیح کتابخانه ادغامشده درنظر بگیرید:
- «افزونه Maven Publish» باید بر هر واحدی که «افزونه کتابخانه Fused» بر آن اعمال شده است نیز اعمال شود.
- انتشار باید از
fusedLibraryComponentارثبری کند زیرا این کار وابستگیهای لازم برای کامپایل کردن مصنوع کتابخانه ادغامشده را فراهم میکند.
در اینجا نمونهای از پیکربندی انتشارات آورده شده است:
کاتلین
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { … } dependencies { … } publishing { publications { register<MavenPublication>("release") { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" from(components["fusedLibraryComponent"]) } } }
شیک
plugins { id 'com.android.fused-library' id 'maven-publish' } androidFusedLibrary { … } dependencies { … } publishing { publications { release(MavenPublication) { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" afterEvaluate { from components.fusedLibraryComponent } } }
کتابخانه ادغامشدهتان را برای آزمایش منتشر کنید
باید بسته به کتابخانه ادغامشده منتشرشده از برنامه Android یا کتابخانه Android آزمایش کنید. روش توصیهشده این است که در کتابخانه ادغامشده و وابستگیهای پروژه آن در مخزن Maven محلی منتشر کنید.
برای انتشار مصنوعات کتابخانه ادغامشده در مخزن محلی، پیکربندیای مشابه زیر تعریف کنید:
کاتلین
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } repositories { maven { name = "myLocalRepo" url = uri(layout.buildDirectory.dir("myLocalRepo")) } }
شیک
plugins { id 'com.android.fused-library' id 'maven-publish' } repositories { maven { name 'myLocalRepo' url layout.buildDirectory.dir('myLocalRepo') } }
بارگذاری کتابخانه ادغامشده
برای توزیع کتابخانه ادغامشده، به بارگذاری کتابخانه مراجعه کنید.
رفتار و اقدامات حفاظتی
ترکیب کردن کتابخانههای Android پیچیدگیهایی دارد که میتواند استدلال درباره اولویتها را برای افزونه چالشبرانگیز کند. برای مثال، دو کتابخانه با مسیر کلاس یکسان هنگام ادغام کتابخانه باعث شکست ساخت میشوند. ادغام منابع ترتیب وابستگیهای مشخصشده را هنگام انتخاب منبعی با نام یکسان در کتابخانههای مختلف درنظر میگیرد.
- کتابخانههای ادغامشده فقط میتوانند بهعنوان یک مصنوع کتابخانه Android (AAR) منتشر شوند تا بهعنوان یک وابستگی اضافه شوند.
- ادغام کتابخانههایی که از اتصال داده استفاده میکنند پشتیبانی نمیشود.
- نمیتوانید چند نوع ساخت و نسخه ویژه محصول را در یک کتابخانه ادغامشده ادغام کنید. کتابخانههای ادغامشده جداگانهای برای انواع مختلف ایجاد کنید.
برای ایجاد تعادل بین میزان پیکربندی موردنیاز و سهولت استفاده، افزونه یا ساخت را در تداخلهای مبهم ناموفق میکند یا هنگام ادغام کردن آرتیفکتها از اکتشاف استفاده میکند. جزئیات نحوه ادغام خروجیهای ساختاریافته در جدول زیر آمده است:
| نوع | رفتار |
|---|---|
| کلاسها | کتابخانههایی که مسیر کلاس یکسانی دارند، هنگام ادغام کتابخانه باعث شکست ساخت میشوند. |
| منابع Android | ادغام منبع ترتیب وابستگیهای مشخصشده را هنگام انتخاب منبعی با نام یکسان در موارد مختلف درنظر میگیرد. |
| فراداده AAR | نسخههای فراداده AAR با اولویتبندی بالاترین مقدار از هر کتابخانه وابستگی ادغام میشوند. یک DSL برای لغو این مقادیر ارائه شده است. کاتلین androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
| منابع جاوا | فایلهای منبع Java در چندین کتابخانه با مسیرهای یکسان مجاز نیستند و منجر به شکست ساخت میشوند. |
مشکلات شناختهشده
Fused Library افزایه جدیدی است و مشکلات شناختهشدهای وجود دارد که برای برآورده کردن همه موارد استفاده درحال برطرف شدن هستند. میتوانید برای هر مشکلی که با آن مواجه میشوید اشکالها را گزارش کنید.
- مشکل شماره ۴۵۴۳۰۵۴۴۴: کتابخانههای حاوی قوانین proguard مصرفکننده که «proguard.txt» نامیده نمیشوند، منجر به شکست ساخت میشوند. در AGP نسخه ۹.۱ و بالاتر برطرف شده است.
- مشکل شماره ۳۷۴۹۸۲۷۳۹: افزودن وابستگیهای فایل به دیگر فایلهای .aar
- مشکل شماره ۲۳۱۴۳۳۲۲۵: عدم پشتیبانی از ادغام RenderScript و آرتیفکتهای Prefab
android.experimental.fusedLibrarySupport.publicationOnly=false به فایل gradle.properties، میتوانید محدودیت فقط انتشار را غیرفعال کنید.
آشنایی با وابستگیهای کتابخانه ادغامشده
کتابخانه ادغامشده هیچ منبعی ندارد و بهطور مؤثر از کتابخانههای Android
بهعنوان تنها منبع خود استفاده میکند، مهم است که بدانید چه چیزی از کجا میآید. برای فهرست کردن وابستگیهایی که در محصول نهایی ادغام شدهاند و وابستگیهای موردنیاز برای ساخت محصول، تکلیف gradle :report را در کتابخانه ادغامشده اجرا کنید. این تکلیف گزارش JSON تولید میکند که در
دایرکتوری build/reports کتابخانه ادغامشده ذخیره میشود.
برای اطلاعات بیشتر مربوط به وابستگیهای افزایه داخلی، تکلیف
gradle :dependencies را اجرا کنید تا وضعیت پیکربندیهای افزایه را مشاهده کنید.