المكوّن الإضافي 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 ومرتبطة بشكل وثيق بنظام View في 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
- إضافة Kotlin Gradle (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. ضبط أدلة المصادر والموارد المخصّصة
إذا كانت لديك ملفات مصدر أو موارد في أدلة غير عادية، سبق لك ضبطها باستخدام الحظر sourceSets. باستخدام المكوّن الإضافي الجديد، استخدِم
الإضافة androidComponents لإضافة أدلة مصدر ثابتة إلى صيغة التطبيق.
يُرجى العِلم أنّه باستخدام المكوّن الإضافي الجديد، تضيف الطريقة addStaticSourceDirectory الدليل إلى القائمة الحالية لأدلة المصادر، بينما تستبدل الطريقة setSrcDirs القائمة باستخدام المكوّن الإضافي القديم، وتضيف الطريقة srcDir إلى القائمة.
Android-KMP
باستخدام المكوّن الإضافي الجديد، استخدِم الحظر onVariants للتفاعل مع مصادر المنتج المتغير.
// build.gradle.kts
androidComponents {
onVariants { variant ->
// Add a directory for Kotlin sources
variant.sources.kotlin?.addStaticSourceDirectory("other/kotlin")
// Add a directory for Android assets
variant.sources.assets?.addStaticSourceDirectory("other/assets")
}
}
المكوّن الإضافي القديم
باستخدام المكوّن الإضافي com.android.library، تم استخدام الحزمة sourceSets لضبط أو إضافة أدلة المصدر.
// build.gradle.kts
android {
sourceSets {
getByName("main") {
// Replaces the directory for Kotlin sources.
kotlin.setSrcDirs(listOf("other/kotlin"))
// Appends a directory for assets.
assets.srcDir("other/assets")
}
}
}
3- تحديد الاعتماديات
من المهام الشائعة تحديد التبعيات لمجموعات المصادر الخاصة بنظام 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")
}
4. تفعيل موارد 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
5. ضبط اختبارات المضيف والجهاز
يؤدي المكوّن الإضافي الجديد تلقائيًا إلى إيقاف الاختبارات على الجهاز (الاختبارات المزوّدة بأدوات) والاختبارات على المضيف (اختبارات الوحدات) في 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 الخاصة بالنطاق.
// 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
6. تفعيل تجميع مصدر 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"
}
}
}
7. التفاعل مع تصاميم متنوعة باستخدام 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 ->
// ...
}
}
8. اختيار صيغ تبعيات مكتبة 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 داخل صيغة معيّنة لتحديد ترتيب البحث.
يُرجى الاطّلاع على حلّ أخطاء المطابقة للحصول على مزيد من المعلومات التفصيلية حول استخدام واجهة برمجة التطبيقات.
9. إضافة تبعيات معاينة Compose
عادةً، نريد أن تكون نطاقات المكتبات محدّدة في بيئة التطوير المحلية لمنع تسريب الأدوات الداخلية إلى العنصر النهائي المنشور. ويصبح ذلك تحديًا مع المكوّن الإضافي المتوافق مع Android الجديد في KMP لأنّه يزيل بنية نوع التصميم المستخدَمة لفصل اعتماديات التطوير عن رمز الإصدار.
Android-KMP
لإضافة عنصر تابع للتطوير والاختبار على الجهاز المحلي فقط، أضِف العنصر التابع مباشرةً إلى إعدادات مسار فئة وقت التشغيل (في الحظر dependencies ذي المستوى الأعلى) لعملية تجميع Android الرئيسية. يساعد ذلك في ضمان توفُّر العنصر التابع في وقت التشغيل (على سبيل المثال، للأدوات مثل معاينة Compose)، ولكنّه ليس جزءًا من مسار فئة التجميع أو واجهة برمجة التطبيقات المنشورة للمكتبة.
// 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)
}
10. ضبط إصدار 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 لـ JVM 11، ما يوفّر تحكّمًا دقيقًا.
المكوّن الإضافي القديم
في مشروع 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"
}
}
11. نشر قواعد الاحتفاظ بالبيانات الخاصة بالمستهلكين
إذا كانت مكتبة 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")
}
}
12. نشر مكتبتك على 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 إلى مشروع