در پروژههایی که ماژولهای زیادی دارند، توزیع کتابخانههای اندروید بین کاربران و در عین حال حفظ ساختار واضح پروژه میتواند چالشبرانگیز باشد. در بسیاری از موارد، کتابخانههای بسیار بیشتری از آنچه در نظر گرفته شده است، باید منتشر شوند.
افزونه Fused Library که به همراه افزونه Android Gradle ارائه میشود، به بستهبندی چندین ماژول کتابخانه اندروید در یک کتابخانه اندروید قابل انتشار کمک میکند. این به شما امکان میدهد کد منبع و منابع کتابخانه خود را در ساخت خود به دلخواه ماژولار کنید، در حالی که از افشای ساختار پروژه خود پس از توزیع جلوگیری میکنید.
توزیع به عنوان یک کتابخانه واحد میتواند مزایای زیر را داشته باشد:
- وابستگیهای سادهشده: وابستگیهای کتابخانههای متعدد را با یک AAR واحد جایگزین میکند و راهاندازی پروژه و مدیریت نسخه را برای کاربران شما ساده میکند.
- کاهش اندازه کتابخانه: ممکن است فشردهسازی کد را بهبود بخشد و منجر به AARهای کوچکتر شود.
- امنیت بهبود یافته: میتواند کنترل بهتری بر جزئیات پیادهسازی داخلی کتابخانههای منتشر شده ارائه دهد.
ایجاد یک کتابخانه ترکیبی
برای ساخت یک کتابخانهی ترکیبی، باید یک ماژول اندروید جدید ایجاد کنید، وابستگیها را اضافه کنید و سپس کتابخانهی ترکیبی را منتشر کنید.
یک ماژول کتابخانه ترکیبی جدید اضافه کنید
برای استفاده از افزونه، باید یک ماژول اندروید جدید به پروژه خود اضافه کنید:
در این مثال، ماژول کتابخانهی ترکیبی، myFusedLibrary نامیده خواهد شد.
- با اضافه کردن
android.experimental.fusedLibrarySupport=trueبه فایلgradle.propertiesپشتیبانی از کتابخانههای ترکیبی را فعال کنید. - عبارت
include(":myFusedLibrary")به فایلsettings.gradle.ktsاضافه کنید. - در فایل
gradle/libs.versions.toml، زیر بخش[plugins]android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }را اضافه کنید. - در بلوک plugins در فایل
build.gradle.ktsسطح بالا،alias(libs.plugins.android.fusedlibrary) apply falseاضافه کنید. - برای ایجاد ماژول
myFusedLibrary، یک دایرکتوری جدید به نامmyFusedLibraryایجاد کنید (روی 'My Application' > New > Directory کلیک راست کنید). - یک فایل
build.gradle.ktsدر ماژولmyFusedLibraryایجاد کنید (روی ماژولmyFusedLibraryکلیک راست کرده و سپس New > File را انتخاب کنید). - کد زیر را در فایل
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' }
کتابخانهی ادغامشدهی خود را منتشر کنید
قبل از انتشار یک کتابخانه فیوزد، باید با انتشار یک کتابخانه اندروید آشنا شوید. انتشار یک کتابخانه فیوزد مشابه انتشار یک کتابخانه اندروید است، با این حال، تفاوتهای کلیدی وجود دارد که برای انتشار صحیح کتابخانه فیوزد باید در نظر بگیرید:
- افزونه Maven Publish همچنین باید روی هر ماژولی که افزونه Fused Library روی آن اعمال شده است، اعمال شود.
- این انتشار باید از
fusedLibraryComponentارثبری کند، زیرا این امر وابستگیهای مورد نیاز برای کامپایل مصنوع کتابخانه fused را فراهم میکند.
در اینجا مثالی از پیکربندی انتشارات آورده شده است:
کاتلین
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 } } }
کتابخانه ترکیبی خود را برای آزمایش منتشر کنید
شما باید بسته به یک کتابخانه فیوز منتشر شده از یک برنامه اندروید یا کتابخانه اندروید، تست را انجام دهید. روش پیشنهادی، انتشار در کتابخانه فیوز و وابستگیهای پروژه آن در یک مخزن محلی 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') } }
کتابخانه فیوز شده خود را آپلود کنید
برای توزیع کتابخانهی ترکیبشدهی خود، به «بارگذاری کتابخانه» مراجعه کنید.
رفتار و اقدامات حفاظتی
ترکیب کتابخانههای اندروید پیچیدگیهایی دارد که میتواند استدلال در مورد اولویتها را برای افزونه چالشبرانگیز کند. برای مثال، دو کتابخانه با مسیر کلاس یکسان هنگام ترکیب کتابخانه باعث خرابی ساخت میشوند. ادغام منابع، ترتیب وابستگیهای مشخص شده هنگام انتخاب منبعی با نام یکسان در کتابخانههای مختلف را در نظر میگیرد.
- کتابخانههای ترکیبی فقط میتوانند به عنوان یک مصنوع کتابخانه اندروید AAR منتشر شوند تا به عنوان یک وابستگی اضافه شوند.
- ادغام کتابخانههایی که از اتصال داده استفاده میکنند پشتیبانی نمیشود.
- شما نمیتوانید چندین نوع ساخت و طعم محصول را در یک کتابخانه ترکیبی (fused library) ادغام کنید. برای انواع مختلف، کتابخانههای ترکیبی جداگانه ایجاد کنید.
برای ایجاد تعادل بین میزان پیکربندی مورد نیاز و سهولت استفاده، افزونه یا در صورت وجود تداخلهای مبهم، ساخت را با شکست مواجه میکند یا هنگام ترکیب مصنوعات از روشهای اکتشافی استفاده میکند. جزئیات نحوه ترکیب مصنوعات در جدول زیر آمده است:
| نوع | رفتار |
|---|---|
| کلاسها | کتابخانههایی که classpath یکسانی دارند، هنگام ادغام کتابخانه، باعث خرابی در ساخت میشوند. |
| منابع اندروید | ادغام منابع، ترتیب وابستگیهای مشخصشده هنگام انتخاب منبعی با نام یکسان در منابع مختلف را در نظر میگیرد. |
| فراداده AAR | نسخههای متادیتای AAR با اولویتبندی بالاترین مقدار از هر کتابخانه وابستگی ادغام میشوند. یک DSL برای لغو این مقادیر ارائه شده است. کاتلین androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
| منابع جاوا | فایلهای منبع جاوا در چندین کتابخانه با مسیرهای یکسان مجاز نیستند و منجر به خرابی در ساخت میشوند. |
مشکلات شناخته شده
کتابخانهی Fused یک افزونهی جدید است و مشکلات شناختهشدهای دارد که در حال کار روی آنها هستیم تا تمام موارد استفاده را پوشش دهیم.
- فایلهای JAR منبع قابل تولید نیستند
- افزودن وابستگیهای فایل به سایر فایلهای .aar
- عدم پشتیبانی از ترکیب مصنوعات RenderScript و Prefab
وابستگیهای یک کتابخانهی ترکیبی را درک کنید
کتابخانه fused هیچ منبعی ندارد و عملاً از کتابخانههای اندروید به عنوان تنها منبع خود استفاده میکند، بنابراین مهم است که بفهمیم چه چیزی از کجا میآید. برای فهرست کردن وابستگیهایی که در مصنوع حاصل ادغام شدهاند و وابستگیهای مورد نیاز برای ساخت مصنوع، وظیفه gradle :report روی کتابخانه fused اجرا کنید. این وظایف یک گزارش JSON تولید میکنند که در دایرکتوری build/reports کتابخانه fused ذخیره میشود.
برای اطلاعات بیشتر در مورد وابستگیهای داخلی افزونه، دستور gradle :dependencies را اجرا کنید تا وضعیت پیکربندیهای افزونه را مشاهده کنید.