نشر عدة مكتبات Android كمكتبة واحدة باستخدام "المكتبة المدمجة"

في المشاريع التي تتضمّن العديد من الوحدات، قد يكون من الصعب توزيع مكتبات Android على المستخدمين مع محاولة الحفاظ على بنية واضحة للمشروع. في كثير من الحالات، يجب نشر عدد أكبر بكثير من المكتبات مقارنةً بالعدد المطلوب.

يساعد المكوّن الإضافي "المكتبة المدمجة" المضمّن في "المكوّن الإضافي لنظام Gradle المتوافق مع Android" في تجميع وحدات متعددة من "مكتبة Android" في "مكتبة Android" واحدة قابلة للنشر. يتيح لك ذلك تقسيم رمز المصدر والموارد الخاصة بمكتبتك إلى وحدات نمطية ضمن الإصدار بالطريقة التي تناسبك، مع تجنُّب الكشف عن بنية مشروعك بعد توزيعه.

يمكن أن يؤدي التوزيع كمكتبة واحدة إلى تحقيق المزايا التالية:

  • التبعيات المبسّطة: استبدال تبعيات المكتبات المتعددة بملف AAR واحد، ما يسهّل عملية إعداد المشاريع وإدارة الإصدارات للمستخدمين
  • تقليل حجم المكتبة: قد يؤدي إلى تحسين عملية تخفيض حجم الرموز، ما يؤدي إلى الحصول على ملفات AAR أصغر
  • تحسين الأمان: يمكن أن يوفّر تحكّمًا أفضل في تفاصيل التنفيذ الداخلية للمكتبات المنشورة

إنشاء مكتبة مدمجة

لإنشاء مكتبة مدمجة، عليك إنشاء وحدة Android جديدة وإضافة التبعيات ثم نشر المكتبة المدمجة.

إضافة وحدة مكتبة مدمجة جديدة

لاستخدام المكوّن الإضافي، يجب إضافة وحدة Android جديدة إلى مشروعك:

في هذا المثال، سيتم تسمية وحدة المكتبة المدمجة myFusedLibrary.

  1. فعِّل إمكانية استخدام المكتبة المدمجة من خلال إضافة android.experimental.fusedLibrarySupport=true إلى ملف gradle.properties.
  2. أضِف include(":myFusedLibrary") إلى الملف settings.gradle.kts.
  3. أضِف android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } ضمن القسم [plugins] في الملف gradle/libs.versions.toml.
  4. أضِف alias(libs.plugins.android.fusedlibrary) apply false في قسم المكوّنات الإضافية ضمن ملف build.gradle.kts ذي المستوى الأعلى.
  5. لإنشاء الوحدة myFusedLibrary، أنشئ دليلاً جديدًا باسم myFusedLibrary (انقر بزر الماوس الأيمن على "تطبيقي" (My Application) > جديد (New) > دليل (Directory)).
  6. أنشئ ملف build.gradle.kts في وحدة myFusedLibrary (انقر بزر الماوس الأيمن على وحدة myFusedLibrary > جديد > ملف).
  7. الصِق ما يلي في ملف myFusedLibrary/build.gradle.kts:

Kotlin

plugins {
    alias(libs.plugins.android.fusedlibrary)
    `maven-publish`
}

androidFusedLibrary {
    namespace = "com.example.myFusedLibrary"
    minSdk = 21
}

dependencies { }

Groovy

plugins {
    id 'fused-library'
}

androidFusedLibrary {
    namespace 'com.example.myFusedLibrary'
    minSdk 21
}

dependencies {

}

إضافة عناصر تابعة

تتمثّل الوظيفة الأساسية للمكتبة المدمجة في تجميع الموارد التابعة. تتيح الإضافة إمكانية إضافة تبعيات المشاريع المحلية والمكتبات الخارجية. لتحديد التبعيات المطلوب تجميعها، استخدِم إعدادات include. لا يتم تضمين التبعيات الانتقالية في الحزمة.

مثلاً:

Kotlin

dependencies {
    include(project(":image-rendering"))
    include("mycoolfonts:font-wingdings:5.0")
}

Groovy

dependencies {
    include project(':image-rendering')
    include 'mycoolfonts:font-wingdings:5.0'
}
.

نشر مكتبتك المدمجة

يجب الاطّلاع على كيفية نشر مكتبة Android قبل نشر مكتبة مدمجة. إنّ نشر مكتبة مدمجة يشبه نشر مكتبة Android، ولكن هناك بعض الاختلافات الأساسية التي يجب مراعاتها لنشر المكتبة المدمجة بشكل صحيح:

  • يجب أيضًا تطبيق المكوّن الإضافي Maven Publish على أي وحدة تم تطبيق المكوّن الإضافي Fused Library عليها.
  • يجب أن يرث الإصدار من fusedLibraryComponent لأنّ ذلك يوفّر التبعيات المطلوبة لتجميع عنصر مكتبة مدمجة.

في ما يلي مثال على إعدادات المنشورات:

Kotlin

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"])
        }
    }
}

Groovy

plugins {
    id '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 محلي.

لنشر عناصر مكتبة مدمجة في مستودع محلي، حدِّد إعدادًا مشابهًا لما يلي:

Kotlin

plugins {
    alias(libs.plugins.android.fusedlibrary)
    `maven-publish`
}

repositories {
    maven {
        name = "myLocalRepo"
        url = uri(layout.buildDirectory.dir("myLocalRepo"))
    }
}

Groovy

plugins {
    id 'fused-library'
    id 'maven-publish'
}

repositories {
    maven {
        name 'myLocalRepo'
        url layout.buildDirectory.dir('myLocalRepo')
    }
}

تحميل مكتبتك المدمجة

لتوزيع مكتبتك المدمجة، يُرجى الاطّلاع على تحميل مكتبتك.

السلوك وإجراءات الوقاية

تتضمّن عملية دمج مكتبات Android تعقيدات قد تجعل من الصعب على المكوّن الإضافي تحديد الأولويات. على سبيل المثال، سيؤدي وجود مكتبتَين لهما مسار فئة نفسه إلى حدوث خطأ في الإنشاء عند دمج المكتبة. عند دمج الموارد، سيتم أخذ ترتيب العناصر التابعة المحدّد في الاعتبار عند اختيار مورد بالاسم نفسه في مكتبات مختلفة.

  • لا يمكن نشر المكتبات المدمجة إلا كعنصر Android لمكتبة AAR من أجل إضافتها كعنصر يَعتمد عليه تشغيل التطبيق.
  • لا يمكن دمج المكتبات التي تستخدم ربط البيانات.
  • لا يمكنك دمج أنواع إصدارات وأصناف منتجات متعددة في مكتبة واحدة مدمجة. أنشِئ مكتبات مدمجة منفصلة لكل صيغة.

لتحقيق التوازن بين مقدار الإعداد المطلوب وسهولة الاستخدام، سيتعذّر على المكوّن الإضافي إنشاء إصدار عند حدوث تعارضات غير واضحة، أو سيستخدم طرقًا تجريبية عند دمج العناصر. يمكنك الاطّلاع على تفاصيل حول كيفية دمج العناصر في الجدول التالي:

النوع السُلوك
صفوف ستؤدي المكتبات التي لها مسار الفئة نفسه إلى حدوث خطأ في الإنشاء عند دمج المكتبة.
موارد لنظام التشغيل Android سيراعي دمج الموارد ترتيب العناصر التابعة المحدَّد عند اختيار مورد بالاسم نفسه في حزم مختلفة.
AAR Metadata يتم دمج إصدارات بيانات AAR الوصفية من خلال منح الأولوية لأعلى قيمة من كل مكتبة تابعة. يتوفّر DSL لإلغاء هذه القيم.

Kotlin

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
مراجع Java لا يُسمح بملفات موارد Java في مكتبات متعددة ذات مسارات متطابقة، وسيؤدي ذلك إلى تعذُّر إنشاء التطبيق.

المشاكل المعروفة

‫Fused Library هي إضافة جديدة، وهناك مشاكل معروفة نعمل على حلّها لتلبية جميع حالات الاستخدام.

  • يتعذّر إنشاء ملفات JAR المصدر
  • إضافة تبعيات الملفات على ملفات .aar أخرى
  • لا تتوفّر إمكانية دمج عناصر RenderScript وPrefab

فهم العناصر التابعة لمكتبة مدمجة

لا تحتوي المكتبة المدمجة على مصادر وتستخدم مكتبات Android بشكل فعّال كمصدر وحيد لها، لذا من المهم معرفة مصدر كل عنصر. لعرض قائمة بالحِزم التابعة التي تم دمجها في العنصر الناتج والحِزم التابعة المطلوبة لإنشاء العنصر، شغِّل مهمة gradle :report على المكتبة المدمجة. تنشئ المهام تقرير JSON يتم حفظه في الدليل build/reports الخاص بالمكتبة المدمجة.

للحصول على معلومات إضافية ذات صلة بتبعيات المكوّنات الإضافية الداخلية، شغِّل المهمة gradle :dependencies لعرض حالة إعدادات المكوّنات الإضافية.