انتشار چند کتابخانه Android به‌عنوان یک کتابخانه با Fused Library

در پروژه‌هایی که ماژول‌های زیادی دارند، توزیع «کتابخانه‌های Android» برای کاربران درحالی‌که سعی می‌کنید ساختار پروژه واضحی داشته باشید می‌تواند چالش‌برانگیز باشد. در بسیاری از موارد، کتابخانه‌های بسیار بیشتری نسبت‌به آنچه درنظر گرفته شده است باید منتشر شوند.

افزونه Fused Library که با افزونه Android Gradle همراه است، به بسته‌بندی چندین ماژول Android Library در یک Android Library قابل‌انتشار کمک می‌کند. این کار به شما امکان می‌دهد کد منبع و منابع کتابخانه‌تان را در ساخت خود به‌صورت ماژولار درآورید، درحالی‌که از افشای ساختار پروژه‌تان پس‌از توزیع جلوگیری می‌کند.

توزیع به‌عنوان یک کتابخانه واحد می‌تواند مزایای زیر را داشته باشد:

  • وابستگی‌های ساده‌شده: وابستگی‌های چند کتابخانه‌ای را با یک AAR جایگزین می‌کند و راه‌اندازی پروژه و مدیریت نسخه را برای کاربران شما ساده می‌کند
  • کاهش اندازه کتابخانه: ممکن است کوچک کردن کد را بهبود بخشد و منجر به AARهای کوچک‌تر شود
  • امنیت بهبودیافته: می‌تواند کنترل بهتری بر جزئیات پیاده‌سازی داخلی کتابخانه‌های منتشرشده ارائه دهد

ایجاد کتابخانه ادغام‌شده

برای ساختن کتابخانه ادغام‌شده، باید ماژول Android جدیدی ایجاد کنید، وابستگی‌ها را اضافه کنید، و سپس کتابخانه ادغام‌شده را منتشر کنید.

پیش‌نیازها

برای استفاده از افزایه Fused Library، از AGP نسخه ۹.۰ یا بالاتر استفاده کنید. نسخه‌های قبلی افزایه Fused Library رفتار و مشکلات متفاوتی دارند که در AGP 9.0 برطرف شده‌اند.

افزودن ماژول کتابخانه ادغام‌شده جدید

برای استفاده از افزونه، باید یک ماژول Android جدید به پروژه خود اضافه کنید:

در این مثال، ماژول کتابخانه ادغام‌شده myFusedLibrary نامیده می‌شود.

  1. ‫include(":myFusedLibrary") را به فایل settings.gradle.kts اضافه کن.
  2. android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } را در بخش [plugins] در فایل gradle/libs.versions.toml اضافه کنید.
  3. alias(libs.plugins.android.fusedlibrary) apply false را در بلوک افزونه‌ها در فایل سطح بالای build.gradle.kts اضافه کنید.
  4. برای ایجاد کردن ماژول myFusedLibrary، دایرکتوری جدیدی به‌نام myFusedLibrary ایجاد کنید (روی «برنامه من» کلیک راست کنید > جدید > دایرکتوری).
  5. فایل build.gradle.kts را در واحد myFusedLibrary ایجاد کنید (روی واحد myFusedLibrary کلیک راست کنید > جدید > فایل).
  6. موارد زیر را در فایل 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 افزایه جدیدی است و مشکلات شناخته‌شده‌ای وجود دارد که برای برآورده کردن همه موارد استفاده درحال برطرف شدن هستند. می‌توانید برای هر مشکلی که با آن مواجه می‌شوید اشکال‌ها را گزارش کنید.

با افزودن android.experimental.fusedLibrarySupport.publicationOnly=false به فایل gradle.properties، می‌توانید محدودیت فقط انتشار را غیرفعال کنید.

آشنایی با وابستگی‌های کتابخانه ادغام‌شده

کتابخانه ادغام‌شده هیچ منبعی ندارد و به‌طور مؤثر از کتابخانه‌های Android به‌عنوان تنها منبع خود استفاده می‌کند، مهم است که بدانید چه چیزی از کجا می‌آید. برای فهرست کردن وابستگی‌هایی که در محصول نهایی ادغام شده‌اند و وابستگی‌های موردنیاز برای ساخت محصول، تکلیف gradle :report را در کتابخانه ادغام‌شده اجرا کنید. این تکلیف گزارش JSON تولید می‌کند که در دایرکتوری build/reports کتابخانه ادغام‌شده ذخیره می‌شود.

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