المكوّن الإضافي com.android.kotlin.multiplatform.library لنظام Gradle هو الأداة المتوافقة رسميًا لإضافة هدف Android إلى وحدة مكتبة في Kotlin Multiplatform (KMP). ويسهّل هذا النظام عملية إعداد المشاريع، ويحسِّن أداء الإصدار، ويتيح إمكانية الدمج بشكل أفضل مع "استوديو Android".
يعتمد استخدام المكوّن الإضافي com.android.library لتطوير KMP على واجهات برمجة التطبيقات الخاصة بالمكوّن الإضافي لنظام Gradle المتوافق مع Android والتي تم إيقافها نهائيًا وتتطلّب الموافقة في الإصدار 9.0 والإصدارات الأحدث من المكوّن الإضافي لنظام Gradle المتوافق مع Android (الربع الرابع من عام 2025). من المتوقّع أن تتم إزالة واجهات برمجة التطبيقات هذه في الإصدار 10.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android (النصف الثاني من عام 2026).
لتطبيق هذا المكوّن الإضافي، يُرجى الرجوع إلى قسم تطبيق المكوّن الإضافي Android-KMP. إذا كنت بحاجة إلى نقل البيانات من واجهات برمجة التطبيقات القديمة، يُرجى الاطّلاع على دليل نقل البيانات.
للحصول على مساعدة بشأن نقل البيانات إلى الإصدار 9.0 أو الإصدارات الأحدث من المكوّن الإضافي لنظام Android Gradle، يمكنك استخدام مهارة الوكيل التي أنشأتها JetBrains لتطبيقات KMP. لمزيد من المعلومات حول استخدام المهارات في "استوديو Android"، يُرجى الاطّلاع على توسيع "وضع الوكيل" باستخدام المهارات. يُرجى العِلم أنّ نتائج الذكاء الاصطناعي ليست قابلة للتوقّع بشكل كامل.
الميزات والاختلافات الرئيسية
تم تصميم المكوّن الإضافي Android-KMP خصيصًا لمشاريع KMP، ويختلف عن المكوّن الإضافي com.android.library العادي في عدة جوانب رئيسية:
بنية الإصدار الفردي: تستخدم الإضافة إصدارًا واحدًا، ما يؤدي إلى إزالة إمكانية استخدام نكهات المنتجات وأنواع الإصدارات، وبالتالي تبسيط عملية الإعداد وتحسين أداء الإصدار.
محسَّن لـ KMP: تم تصميم المكوّن الإضافي لمكتبات KMP، مع التركيز على رموز Kotlin المشترَكة وإمكانية التشغيل التفاعلي، مع إغفال إمكانية استخدام الإصدارات الأصلية الخاصة بنظام Android وAIDL وRenderScript.
الاختبارات غير مفعَّلة تلقائيًا: يتم إيقاف كل من اختبارات الوحدات والاختبارات على الأجهزة (اختبارات قياس حالة التطبيق) تلقائيًا لتحسين سرعة الإنشاء. يمكنك تفعيلها إذا لزم الأمر.
لا توجد إضافة Android على المستوى الأعلى: تتم معالجة الإعدادات باستخدام كتلة
androidضمن لغة DSL الخاصة بمنصة KMP في Gradle، ما يحافظ على اتساق بنية مشروع KMP. ما مِن حظر على مستوىandroid.تفعيل تجميع Java: يتم إيقاف تجميع Java تلقائيًا. استخدِم
withJava()في حظرandroidلتفعيله. يؤدي ذلك إلى تحسين أوقات الإنشاء عندما لا يكون تجميع Java ضروريًا.
مزايا إضافة Android-KMP
يوفّر مكوّن Android الإضافي لـ KMP المزايا التالية لمشاريع KMP:
تحسين أداء الإصدار وثباته: تم تصميم هذا الإصدار لتحسين سرعات الإنشاء وتعزيز الثبات في مشاريع KMP. يساهم التركيز على سير عمل KMP في توفير عملية التصميم أكثر كفاءة وموثوقية.
تكامل محسّن مع بيئة التطوير المتكاملة (IDE): يوفّر هذا التكامل إمكانات أفضل لإكمال الرموز البرمجية والتنقّل وتصحيح الأخطاء وتحسين تجربة المطوّرين بشكل عام عند استخدام مكتبات KMP على Android.
تبسيط إعدادات المشروع: يسهّل المكوّن الإضافي عملية إعداد مشاريع KMP من خلال إزالة التعقيدات الخاصة بنظام Android، مثل صيغ الإنشاء. يؤدي ذلك إلى إنشاء ملفات تصميم أكثر نظافة وأسهل في الصيانة. في السابق، كان استخدام المكوّن الإضافي
com.android.libraryفي مشروع KMP يؤدي إلى إنشاء أسماء مربكة لمجموعات رموز المصدر، مثلandroidAndroidTest. لم يكن أسلوب التسمية هذا بديهيًا للمطوّرين الذين يعرفون بنى مشاريع KMP العادية.
حلول بديلة للميزات غير المتوافقة
عند مقارنة دمج KMP مع المكوّن الإضافي com.android.library، نجد أنّ بعض الميزات غير متوفّرة في المكوّن الإضافي com.android.kotlin.multiplatform.library. في ما يلي الحلول البديلة للميزات غير المتوافقة:
تنويعات التصميم
أنواع التصميم وصيغ المنتجات غير متاحة. ويرجع ذلك إلى أنّ المكوّن الإضافي الجديد يستخدم بنية متغيرة واحدة، ما يسهّل عملية الإعداد ويحسّن أداء الإصدار.
إذا كنت بحاجة إلى تنويعات تصميم، ننصحك بإنشاء وحدة مكتبة Android مستقلة باستخدام مكوّن
com.android.libraryالإضافي، وإعداد أنواع التصميم وصيغ المنتجات داخل هذه الوحدة، ثم استهلاكها كعنصر اعتمادية عادي للمشروع من مجموعة رموز المصدرandroidMainفي مكتبة Kotlin Multiplatform. لمزيد من التفاصيل، يُرجى الاطّلاع على إنشاء مكتبة Android وإعداد تنويعات الإصدارات.ربط البيانات وربط العرض
وهي ميزات خاصة بإطار عمل واجهة المستخدم في Android ومرتبطة بشكل وثيق بنظام العرض في Android وتنسيقات XML. في المكوّن الإضافي الجديد لمكتبة Android-KMP، ننصحك بالتعامل مع واجهة المستخدم باستخدام إطار عمل متعدد المنصات، مثل Compose Multiplatform. يُعدّ ربط البيانات وربط العرض من تفاصيل التنفيذ في تطبيق Android نهائي، وليس مكتبة قابلة للمشاركة.
إتاحة إنشاء التطبيقات
يركّز المكوّن الإضافي الجديد على إنشاء ملف AAR عادي لنظام التشغيل Android. تتولّى أهداف KMP الأصلية (مثل
androidNativeArm64وandroidNativeX86) وإمكانات التوافق مع لغة C عملية دمج الرمز البرمجي الأصلي في Kotlin Multiplatform مباشرةً. إذا كنت بحاجة إلى تضمين رمز C/C++ أصلي، عليك تعريفه كجزء من مجموعة رموز المصدر المشتركة أو الأصلية وضبط إمكانية التشغيل التفاعلي لـ C ضمن الحظرkotlin، بدلاً من استخدام آليةexternalNativeBuildالخاصة بنظام Android.بدلاً من ذلك، إذا كنت بحاجة إلى دعم الإصدار الأصلي من خلال
externalNativeBuild، ننصحك بإنشاء وحدةcom.android.libraryمستقلة ومنفصلة يمكنك من خلالها دمج الرموز البرمجية الأصلية واستخدام هذه المكتبة المستقلة من مجموعة رموز المصدرandroidMainلمشروع مكتبة Kotlin Multiplatform. لمزيد من التفاصيل، يُرجى الاطّلاع على إنشاء مكتبة Android وإضافة رمز C وC++ إلى مشروعك.BuildConfigclassتكون ميزة
BuildConfigمفيدة جدًا في البيئات التي تتضمّن عدة متغيرات. بما أنّ المكوّن الإضافي الجديد لمكتبة Kotlin Multiplatform لا يعتمد على صيغة معيّنة ولا يتوافق مع أنواع الإصدارات ونكهات المنتجات، لم يتم تنفيذ هذه الميزة. ننصحك كبديل باستخدام إضافةBuildKonfigأو حلول مشابهة من المنتدى لإنشاء بيانات وصفية لجميع الاستهدافات.
المتطلبات الأساسية
لاستخدام المكوّن الإضافي com.android.kotlin.multiplatform.library، يجب ضبط مشروعك على الحد الأدنى من الإصدارات التالية أو إصدارات أحدث:
- المكوّن الإضافي لنظام Gradle المتوافق مع Android (AGP): الإصدار 8.10.0
- المكوّن الإضافي لنظام Gradle المتوافق مع Kotlin (KGP): الإصدار 2.0.0
تطبيق المكوّن الإضافي Android-KMP على وحدة حالية
لتطبيق المكوّن الإضافي Android-KMP على وحدة مكتبة KMP حالية، اتّبِع الخطوات التالية:
تعريف المكوّنات الإضافية في كتالوج الإصدارات افتح ملف TOML الخاص بكتالوج الإصدارات (عادةً
gradle/libs.versions.toml) وأضِف قسم تعريفات المكوّن الإضافي:# To check the version number of the latest Kotlin release, go to # https://kotlinlang.org/docs/releases.html [versions] androidGradlePlugin = "9.2.0" kotlin = "KOTLIN_VERSION" [plugins] kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } android-kotlin-multiplatform-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "androidGradlePlugin" }تطبيق بيان المكوّن الإضافي في ملف الإصدار الجذر: افتح ملف
build.gradle.ktsالموجود في الدليل الجذري لمشروعك. أضِف أسماء المكوّنات الإضافية البديلة إلى الحظرpluginsباستخدامapply false. ويتيح ذلك استخدام أسماء مستعارة للمكوّن الإضافي في جميع المشاريع الفرعية بدون تطبيق منطق المكوّن الإضافي على المشروع الرئيسي نفسه.Kotlin
// Root build.gradle.kts file plugins { alias(libs.plugins.kotlin.multiplatform) apply false // Add the following alias(libs.plugins.android.kotlin.multiplatform.library) apply false }
أنيق
// Root build.gradle file plugins { alias(libs.plugins.kotlin.multiplatform) apply false // Add the following alias(libs.plugins.android.kotlin.multiplatform.library) apply false }
تطبيق المكوّن الإضافي في ملف إنشاء وحدة مكتبة KMP افتح ملف
build.gradle.ktsفي وحدة مكتبة KMP وطبِّق المكوّن الإضافي في أعلى الملف ضمن الحزمةplugins:Kotlin
// Module-specific build.gradle.kts file plugins { alias(libs.plugins.kotlin.multiplatform) // Add the following alias(libs.plugins.android.kotlin.multiplatform.library) }
أنيق
// Module-specific build.gradle file plugins { alias(libs.plugins.kotlin.multiplatform) // Add the following alias(libs.plugins.android.kotlin.multiplatform.library) }
ضبط هدف KMP لنظام التشغيل Android اضبط حزمة Kotlin Multiplatform (
kotlin) لتحديد هدف Android. ضِمن كتلةkotlin، حدِّد هدف Android باستخدامandroid:Kotlin
kotlin { android { namespace = "com.example.kmpfirstlib" compileSdk = 33 minSdk = 24 withJava() // enable java compilation support withHostTestBuilder {}.configure {} withDeviceTestBuilder { sourceSetTreeName = "test" } compilerOptions.configure { jvmTarget.set( org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8 ) } } sourceSets { androidMain { dependencies { // Add Android-specific dependencies here } } getByName("androidHostTest") { dependencies { } } getByName("androidDeviceTest") { dependencies { } } } // ... other targets (JVM, iOS, etc.) ... }
أنيق
kotlin { android { namespace = "com.example.kmpfirstlib" compileSdk = 33 minSdk = 24 withJava() // enable java compilation support withHostTestBuilder {}.configure {} withDeviceTestBuilder { it.sourceSetTreeName = "test" } compilerOptions.options.jvmTarget.set( org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8 ) } sourceSets { androidMain { dependencies { } } androidHostTest { dependencies { } } androidDeviceTest { dependencies { } } } // ... other targets (JVM, iOS, etc.) ... }
تطبيق التغييرات بعد تطبيق المكوّن الإضافي وضبط إعدادات الحظر
kotlin، عليك مزامنة مشروع Gradle لتطبيق التغييرات.
نقل البيانات من المكوّن الإضافي القديم
يساعدك هذا الدليل في نقل البيانات من المكوّن الإضافي القديم com.android.library إلى المكوّن الإضافي com.android.kotlin.multiplatform.library.
1. مصادر النقل
كان المكوّن الإضافي القديم يتيح لك استخدام مجموعات مصادر src/main وsrc/test وsrc/androidTest، بالإضافة إلى src/androidMain وsrc/androidHostTest وsrc/androidDeviceTest. يستخدم المكوّن الإضافي الجديد أدلة المصادر الأخيرة فقط، لذا عليك نقل المصادر من src/main إلى src/androidMain ومن src/test إلى src/androidHostTest ومن src/androidTest إلى src/androidDeviceTest.
2. تحديد الاعتماديات
تتمثّل إحدى المهام الشائعة في تعريف التبعيات لمجموعات المصادر الخاصة بنظام Android. يتطلّب المكوّن الإضافي الجديد وضع هذه العناصر بشكل صريح ضمن الحظر sourceSets، على عكس الحظر العام dependencies الذي كان يُستخدَم سابقًا.
Android-KMP
تعمل الإضافة الجديدة على تعزيز بنية أكثر تنظيمًا من خلال تجميع تبعيات Android ضمن مجموعة رموز المصدر androidMain. بالإضافة إلى مجموعة رموز المصدر الرئيسية، هناك مجموعتان من مجموعات رموز المصدر الاختبارية يتم إنشاؤهما عند الطلب، وهما androidDeviceTest وandroidHostTest (راجِع إعداد اختبارات المضيف والأجهزة لمزيد من المعلومات).
// build.gradle.kts
kotlin {
android {}
//... other targets
sourceSets {
commonMain.dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
}
// Dependencies are now scoped to the specific Android source set
androidMain.dependencies {
implementation("androidx.appcompat:appcompat:1.7.0")
implementation("com.google.android.material:material:1.11.0")
}
}
}
تحتوي مجموعات رموز المصدر على عمليات تجميع متوافقة مع Kotlin تحمل الأسماء main وdeviceTest وhostTest. يمكن ضبط مجموعات رموز المصدر وعمليات التجميع في نص البرمجة الخاص بالإنشاء على النحو التالي:
// build.gradle.kts
kotlin {
android {
compilations.getByName("deviceTest") {
kotlinOptions.languageVersion = "2.0"
}
}
}
المكوّن الإضافي القديم
باستخدام المكوّن الإضافي القديم، كان بإمكانك تعريف الاعتماديات الخاصة بنظام Android في حزمة الاعتماديات ذات المستوى الأعلى، ما كان يؤدي أحيانًا إلى حدوث التباس في وحدة متعددة المنصات.
// build.gradle.kts
kotlin {
androidTarget()
//... other targets
}
// Dependencies for all source sets were often mixed in one block
dependencies {
// Common dependencies
commonMainImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
// Android-specific dependencies
implementation("androidx.appcompat:appcompat:1.7.0")
implementation("com.google.android.material:material:1.11.0")
}
3- تفعيل "موارد Android"
لا تتوفّر إمكانية استخدام "موارد Android" (المجلدات res) تلقائيًا في المكوّن الإضافي الجديد لتحسين أداء الإصدار. يجب الموافقة على استخدامها. يساعد هذا التغيير في ضمان عدم تحميل المشاريع التي لا تتطلّب موارد خاصة بنظام Android بأي تكاليف إضافية مرتبطة بعملية الإنشاء.
Android-KMP
يجب تفعيل معالجة موارد Android بشكل صريح. يجب وضع الموارد في src/androidMain/res.
// build.gradle.kts
kotlin {
android {
// ...
// Enable Android resource processing
androidResources {
enable = true
}
}
}
// Project Structure
// └── src
// └── androidMain
// └── res
// ├── values
// │ └── strings.xml
// └── drawable
// └── icon.xml
المكوّن الإضافي القديم
تم تفعيل معالجة الموارد تلقائيًا. يمكنك على الفور إضافة دليل
res في src/main والبدء في إضافة رسومات XML قابلة للرسم وقيم وما إلى ذلك.
// build.gradle.kts
android {
namespace = "com.example.library"
compileSdk = 34
// No extra configuration was needed to enable resources.
}
// Project Structure
// └── src
// └── main
// └── res
// ├── values
// │ └── strings.xml
// └── drawable
// └── icon.xml
4. ضبط اختبارات المضيف والجهاز
من التغييرات المهمة في المكوّن الإضافي الجديد أنّه يتم إيقاف الاختبارات على مستوى الجهاز (التي تتضمّن أدوات) وعلى مستوى المضيف (الوحدة) في Android تلقائيًا. يجب الموافقة صراحةً على إنشاء مجموعات ومَراجع اختبارية للمصدر، بينما كان الإصدار القديم من المكوّن الإضافي ينشئها تلقائيًا.
يساعد نموذج التفعيل هذا في التأكّد من أنّ مشروعك يظل بسيطًا ولا يتضمّن سوى منطق الإنشاء ومجموعات المصادر التي تستخدمها بشكل نشط.
Android-KMP
في المكوّن الإضافي الجديد، يمكنك تفعيل الاختبارات وضبطها داخل الحظر kotlin.android. ويجعل ذلك عملية الإعداد أكثر وضوحًا ويتجنّب إنشاء مكوّنات اختبار غير مستخدَمة. تصبح مجموعة رموز المصدر androidUnitTest هي androidHostTest (يتغير دليل الاختبار من src/androidUnitTest إلى src/androidHostTest)، وتصبح androidInstrumentedTest هي androidDeviceTest (يتغير دليل الاختبار من src/androidInstrumentedTest إلى src/androidDeviceTest).
// build.gradle.kts
kotlin {
android {
// ...
// Opt-in to enable and configure host-side (unit) tests
withHostTest {
isIncludeAndroidResources = true
}
// Opt-in to enable and configure device-side (instrumented) tests
withDeviceTest {
instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
execution = "HOST"
}
}
}
// Project Structure (After Opt-in)
// └── src
// ├── androidHostTest
// └── androidDeviceTest
المكوّن الإضافي القديم
باستخدام المكوّن الإضافي com.android.library، يتم إنشاء مجموعتَي رموز المصدر androidUnitTest وandroidInstrumentedTest تلقائيًا. يمكنك ضبط سلوكها داخل الحظر android، وعادةً ما يتم ذلك باستخدام testOptions DSL.
// build.gradle.kts
android {
defaultConfig {
// Runner was configured in defaultConfig
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
testOptions {
// Configure unit tests (for the 'test' source set)
unitTests.isIncludeAndroidResources = true
// Configure device tests (for the 'androidTest' source set)
execution = "HOST"
}
}
// Project Structure (Defaults)
// └── src
// ├── test
// └── androidTest
5. تفعيل تجميع مصدر Java
إذا كانت مكتبة KMP تحتاج إلى تجميع مصادر Java لاستهداف Android، يجب تفعيل هذه الوظيفة بشكل صريح باستخدام المكوّن الإضافي الجديد. يُرجى العِلم أنّ هذا الخيار يتيح تجميع ملفات Java الموجودة مباشرةً في مشروعك، وليس التجميع لملفات التبعية. تتغيّر أيضًا طريقة ضبط إصدار JVM المستهدف لمترجم Java وKotlin.
Android-KMP
يجب الموافقة على تجميع Java من خلال استدعاء withJava(). يتم الآن ضبط هدف JVM مباشرةً داخل الحظر kotlin { android {} }
لإعداد أكثر توحيدًا. ينطبق الإعداد jvmTarget هنا على كل من تجميع Kotlin وJava لنظام التشغيل Android.
// build.gradle.kts
kotlin {
android {
// Opt-in to enable Java source compilation
withJava()
// Configure the JVM target for both Kotlin and Java sources
compilerOptions {
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8)
}
}
// ...
}
// Project Structure:
// └── src
// └── androidMain
// ├── kotlin
// │ └── com/example/MyKotlinClass.kt
// └── java
// └── com.example/MyJavaClass.java
المكوّن الإضافي القديم
تم تفعيل تجميع Java تلقائيًا. تم ضبط هدف JVM لكل من مصادر Java وKotlin في حزمة Android باستخدام compileOptions.
// build.gradle.kts
android {
// ...
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
kotlin {
androidTarget {
compilations.all {
kotlinOptions.jvmTarget = "1.8"
}
}
}
6. التفاعل مع تصاميم متنوعة باستخدام androidComponents
لا تزال إضافة androidComponents متاحة للتفاعل مع عناصر إنشاء التطبيق آليًا. على الرغم من أنّ معظم وظائف واجهة برمجة التطبيقات Variant لم تتغيّر،
إلا أنّ واجهة AndroidKotlinMultiplatformVariant الجديدة أكثر محدودية لأنّ
المكوّن الإضافي ينتج خيارًا واحدًا فقط.
وبالتالي، لم تعُد الخصائص المرتبطة بأنواع الإصدارات وصيغ المنتجات متوفّرة في عنصر المتغير.
Android-KMP
تكرّر الكتلة onVariants الآن صيغة واحدة. سيظل بإمكانك الوصول إلى الخصائص الشائعة، مثل name وartifacts، ولكن لن تتمكّن من الوصول إلى الخصائص الخاصة بنوع الإصدار.
// build.gradle.kts
androidComponents {
onVariants { variant ->
val artifacts = variant.artifacts
}
}
المكوّن الإضافي القديم
باستخدام متغيرات متعددة، يمكنك الوصول إلى خصائص خاصة بنوع الإصدار لتحديد إعدادات المهام.
// build.gradle.kts
androidComponents {
onVariants(selector().withBuildType("release")) { variant ->
// ...
}
}
7. اختيار صيغ تبعيات مكتبة Android
تنتج مكتبة KMP صيغة واحدة لنظام Android. ومع ذلك، قد تعتمد على مكتبة Android عادية (com.android.library) تتضمّن عدة صيغ (مثل نكهات المنتج free/paid). يُعدّ التحكّم في طريقة اختيار مشروعك لمتغير من تلك التبعية من المتطلبات الشائعة.
Android-KMP
تجمع الإضافة الجديدة هذه المنطق وتوضّحه ضمن كتلة kotlin.android.localDependencySelection. ويجعل ذلك من الواضح جدًا أي صيغ من التبعيات الخارجية سيتم اختيارها لمكتبة KMP ذات الصيغة الواحدة.
// build.gradle.kts
kotlin {
android {
localDependencySelection {
// For dependencies with multiple build types, select 'debug' first, and 'release' in case 'debug' is missing
selectBuildTypeFrom.set(listOf("debug", "release"))
// For dependencies with a 'type' flavor dimension...
productFlavorDimension("type") {
// ...select the 'typeone' flavor.
selectFrom.set(listOf("typeone"))
}
}
}
}
المكوّن الإضافي القديم
لقد أعددت استراتيجيات اختيار العناصر التابعة داخل مربّعات buildTypes and
productFlavors. كان ذلك يتضمّن غالبًا استخدام missingDimensionStrategy
لتوفير صيغة تلقائية لسمة لا تتضمّنها مكتبتك،
أو matchingFallbacks ضمن صيغة معيّنة لتحديد ترتيب البحث.
يُرجى الاطّلاع على حلّ أخطاء المطابقة للحصول على مزيد من المعلومات التفصيلية حول استخدام واجهة برمجة التطبيقات.
8. التبعيات في إنشاء المعاينة
عادةً، نريد أن تكون المكتبات محدّدة النطاق في بيئة التطوير المحلية لمنع تسريب الأدوات الداخلية إلى المنتج النهائي المنشور. ويصبح ذلك تحديًا مع المكوّن الإضافي المتوافق مع Android الجديد في KMP، لأنّه يزيل بنية نوع التصميم المستخدَمة لفصل تبعيات التطوير عن رمز الإصدار.
Android-KMP
لإضافة اعتمادية فقط لأغراض التطوير والاختبار على الجهاز المحلي، أضِف الاعتمادية مباشرةً إلى إعدادات مسار فئة وقت التشغيل (في الحظر dependencies ذي المستوى الأعلى) لعملية تجميع Android الرئيسية. يساعد ذلك في ضمان توفُّر الاعتمادية في وقت التشغيل (على سبيل المثال، للأدوات مثل Compose Preview)، ولكنها ليست جزءًا من مسار فئة التجميع أو واجهة برمجة التطبيقات المنشورة لمكتبتك.
// build.gradle.kts
dependencies {
"androidRuntimeClasspath"(libs.androidx.compose.ui.tooling)
}
المكوّن الإضافي القديم
يجب أن تستخدم مشاريع Kotlin Multiplatform التي تستخدم المكوّن الإضافي com.android.library لاستهداف Android الإعداد debugImplementation، الذي يحدّد نطاق الاعتمادية لنوع التصميم المخصّص لتصحيح الأخطاء ويمنع تضمينه في صيغة الإصدار من المكتبة التي يستخدمها المستهلكون.
// build.gradle.kts
dependencies {
debugImplementation(libs.androidx.compose.ui.tooling)
}
9. ضبط إصدار JVM المستهدف لنظام التشغيل Android في KMP
يضبط المكوّن الإضافي المتوافق مع Android في KMP إصدار JVM المستهدف باستخدام android.compilerOptions.jvmTarget، وينطبق ذلك على كل من Java وKotlin، ما يؤدي إلى تبسيط عملية الإعداد مقارنةً بالكتلتين المنفصلتين compileOptions وkotlinOptions في مشاريع Android البحتة.
Android-KMP
عند العمل على مشروع Kotlin Multiplatform (KMP) يتضمّن هدفًا لنظام التشغيل Android، تتوفّر لك عدة طرق لضبط إصدار هدف JVM لكل من برنامج التجميع الخاص بلغة Kotlin وبرنامج التجميع الخاص بلغة Java. إنّ فهم نطاق هذه الإعدادات وتسلسلها الهرمي أمر أساسي لإدارة توافق الرمز الثانوي لمشروعك.
في ما يلي الطرق الأساسية الثلاث لضبط إصدار JVM المستهدف، مرتّبة من الأولوية الأدنى إلى الأعلى. تنطبق قيم استهداف JVM التي لها الأولوية على مجموعة فرعية أصغر من الأهداف التي تم ضبطها، وتتجاوز القيم التي لها أولوية أقل، ما يعني أنّه يمكنك ضبط إصدارات مختلفة من JVM لأهداف وعمليات تجميع مختلفة ضمن الأهداف في مشروعك.
استخدام مجموعة أدوات Kotlin (الأولوية الأقل)
إنّ الطريقة الأكثر عمومية لضبط إصدار JVM المستهدف هي تحديد سلسلة الأدوات في حزمة kotlin ضمن ملف build.gradle.kts. يحدّد هذا الأسلوب هدفًا لكل من مهام تجميع Kotlin وJava على مستوى جميع الاستهدافات المستندة إلى JVM في مشروعك، بما في ذلك Android.
// build.gradle.kts
kotlin {
jvmToolchain(21)
}
يؤدي هذا الإعداد إلى استهداف كل من kotlinc وjavac الإصدار 21 من JVM. إنّها طريقة رائعة لتحديد أساس متسق لمشروعك بأكمله.
استخدام خيارات برنامج التجميع على مستوى الإصدار المستهدف من Android (الأولوية المتوسطة)
يمكنك تحديد هدف JVM خصيصًا لهدف Android KMP
داخل الحظر android. يلغي هذا الإعداد إعدادات jvmToolchain على مستوى المشروع وينطبق على جميع عمليات تجميع Android.
// build.gradle.kts
kotlin {
android {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_11)
}
}
}
في هذه الحالة، حتى إذا تم ضبط jvmToolchain على إصدار مختلف، سيتم تجميع رمز Kotlin وJava الخاصين بإصدار Android المستهدف إلى الإصدار 11 من JVM.
استخدام خيارات المحول البرمجي على مستوى التجميع (الأولوية الأعلى)
للحصول على أدق مستوى من التحكّم، يمكنك ضبط خيارات المحول البرمجي على أساس كل عملية تجميع (على سبيل المثال، على androidMain أو androidHostTest فقط). ويكون ذلك مفيدًا إذا كان يجب أن يستهدف تجميع معيّن إصدارًا مختلفًا من JVM. يلغي هذا الإعداد كلاً من سلسلة أدوات Kotlin وخيارات مستوى استهداف Android.
// build.gradle.kts
kotlin {
android {
compilations.all {
compileTaskProvider.configure {
compilerOptions.jvmTarget.set(JvmTarget.JVM_11)
}
}
}
}
تساعد عملية الضبط هذه في ضمان استخدام جميع عمليات الترجمة البرمجية ضمن هدف Android الإصدار 11 من JVM، ما يوفّر تحكّمًا دقيقًا.
المكوّن الإضافي القديم
في مشروع KMP يستخدم المكوّن الإضافي لمكتبة Android العادية (com.android.library)، يختلف الإعداد قليلاً عن الإعداد عند استخدام المكوّن الإضافي المتوافق مع Android KMP (ولكنه مشابه من الناحية المفاهيمية).
استخدام مجموعة أدوات Kotlin
تعمل الطريقة kotlin.jvmToolchain() بشكل مماثل، حيث يتم ضبط sourceCompatibility وtargetCompatibility للغة Java وjvmTarget للغة Kotlin. ننصحك باتّباع هذا النهج.
// build.gradle.kts
kotlin {
jvmToolchain(21)
}
compileOptions وkotlinOptions
إذا كنت لا تستخدم مجموعة أدوات Kotlin، عليك ضبط أهداف JVM باستخدام حِزم منفصلة لكل من Java وKotlin.
// build.gradle.kts
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = "11"
}
}
10. نشر قواعد الاحتفاظ بالبيانات الخاصة بالمستهلكين
إذا كانت مكتبة KMP تتطلّب إرسال قواعد الاحتفاظ الخاصة بالمستهلكين (مثل قواعد ProGuard الخاصة بـ R8) إلى المستهلكين، عليك تفعيل النشر بشكل صريح في المكوّن الإضافي الجديد. في السابق، كانت قواعد الاحتفاظ بالبيانات الخاصة بالمستهلك تُنشَر تلقائيًا في حال تحديدها.
Android-KMP
باستخدام المكوّن الإضافي الجديد، عليك ضبط
optimization.consumerKeepRules.publish = true وتحديد ملفات القواعد
ضمن كتلة consumerKeepRules لنشر قواعد الاحتفاظ بالمستهلكين.
// build.gradle.kts
kotlin {
android {
optimization {
consumerKeepRules.apply {
publish = true
file("consumer-proguard-rules.pro")
}
}
}
}
المكوّن الإضافي القديم
باستخدام com.android.library، يتم تلقائيًا نشر أي ملفات قواعد محددة باستخدام consumerProguardFiles في android.defaultConfig ضمن عناصر مكتبة البيانات.
// build.gradle.kts
android {
defaultConfig {
consumerProguardFiles("consumer-proguard-rules.pro")
}
}
11. نشر مكتبتك على Maven
إذا كنت تخطّط لنشر مكتبة KMP على Maven ليتم استخدامها في مشاريع أخرى، تختلف العملية حسب ما إذا كنت تستخدم المكوّن الإضافي الجديد Android-KMP أو المكوّن الإضافي القديم.
Android-KMP
يتكامل المكوّن الإضافي com.android.kotlin.multiplatform.library مع آليات النشر العادية في Kotlin Multiplatform. لا تتطلّب عملية نشر مكتبة KMP العادية أي خطوات خاصة بنظام Android.
لنشر مكتبتك، اتّبِع مستندات JetBrains الرسمية: إعداد عملية النشر لمكتبة متوافقة مع أجهزة متعددة.
المكوّن الإضافي القديم
عند استخدام com.android.library لاستهداف Android في مشروع KMP،
عليك اتّباع دليل نشر مكتبة Android العادي
لإعداد ونشر العنصر الخاص بنظام Android (.aar).
للحصول على تعليمات تفصيلية، يُرجى الاطّلاع على إعداد مكتبتك لإصدارها.
مرجع واجهة برمجة التطبيقات الخاصة بالمكوّن الإضافي
يحتوي المكوّن الإضافي الجديد على مساحة مختلفة لواجهة برمجة التطبيقات عن com.android.library. للحصول على معلومات تفصيلية حول لغة DSL والواجهات الجديدة، يُرجى الاطّلاع على مراجع واجهة برمجة التطبيقات:
KotlinMultiplatformAndroidLibraryExtensionKotlinMultiplatformAndroidLibraryTargetKotlinMultiplatformAndroidDeviceTestKotlinMultiplatformAndroidHostTestKotlinMultiplatformAndroidVariant
المشاكل المعروفة في المكوّن الإضافي لمكتبة Android-KMP
في ما يلي المشاكل المعروفة التي قد تحدث عند تطبيق الإضافة الجديدة
com.android.kotlin.multiplatform.library:
يتعذّر عرض معاينة الإنشاء عند استخدام المكوّن الإضافي الجديد android-KMP
- تم إصلاح المشكلة في
Android Studio Otter 2 Feature Drop | 2025.2.2 Canary 3وAndroid Gradle Plugin 9.0.0-alpha13
- تم إصلاح المشكلة في
-
- تم إصلاح المشكلة في
Android Studio Otter 2 Feature Drop | 2025.2.2 Canary 3وAndroid Gradle Plugin 9.0.0-alpha13
- تم إصلاح المشكلة في
-
- تم حلّ المشكلة في
Kotlin Gradle Plugin 2.3.0-Beta2
- تم حلّ المشكلة في
إتاحة استخدام sourceSetTree الذي يتضمّن أدوات لاستهداف androidLibrary
- تم إصلاح المشكلة في
Android Studio Otter 2 Feature Drop | 2025.2.2 Canary 3وAndroid Gradle Plugin 9.0.0-alpha13
- تم إصلاح المشكلة في
مُقترَحة لك
- ملاحظة: يتم عرض نص الرابط عندما تكون JavaScript غير مفعّلة.
- إعداد البيئة
- إضافة وحدة KMP إلى مشروع