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

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

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

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

  • العناصر التابعة المبسّطة: يتم استبدال العناصر التابعة المتعددة للمكتبة بملف 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 في مقتطف plugins في ملف build.gradle.kts في المستوى الأعلى.
  5. لإنشاء وحدة myFusedLibrary، أنشئ دليلاً جديدًا باسم myFusedLibrary (انقر بزر الماوس الأيمن على "تطبيقي" > جديد > دليل).
  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 { }

رائع

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

رائع

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

رائع

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

رائع

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

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

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

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

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

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

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

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

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

Kotlin

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

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

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

  • عدم تضمين ملفات lint.jar في حزمة AAR المدمجة
  • إضافة ملفات تابعة لملف .aar آخر
  • لا تتوفّر إمكانية دمج عناصر RenderScript وPrefab.

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

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

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