أصبح إصدار ديسمبر 2025 من Jetpack Compose مستقرًا اليوم. ويحتوي هذا الإصدار على الإصدار 1.10 من وحدات Compose الأساسية والإصدار 1.4 من Material 3 (يمكنك الاطّلاع على عملية الربط الكاملة بين BOM)، ما يضيف ميزات جديدة ويحسّن الأداء بشكل كبير.
لاستخدام إصدار اليوم، عليك ترقية إصدار Compose BOM إلى 2025.12.00:
implementation(platform("androidx.compose:compose-bom:2025.12.00"))
تحسينات الأداء
ندرك أنّ أداء وقت تشغيل تطبيقك مهم جدًا لك وللمستخدمين، لذا كان الأداء من الأولويات الرئيسية لفريق Compose. ويقدّم هذا الإصدار عددًا من التحسينات، ويمكنك الحصول عليها جميعًا من خلال الترقية إلى أحدث إصدار فقط. توضّح المقاييس الداخلية التي أجريناها على التمرير أنّ أداء Compose يطابق الآن الأداء الذي كنت ستحصل عليه إذا استخدمت طريقة العرض:
مقياس أداء التمرير الذي يقارن بين طريقة العرض وJetpack Compose في إصدارات مختلفة من Compose
الإنشاء القابل للإيقاف المؤقت في عملية الجلب المسبق الكسول
تم تفعيل ميزة الإنشاء القابل للإيقاف المؤقت في عملية الجلب المسبق الكسول تلقائيًا. وهذا تغيير أساسي في طريقة جدولة وقت تشغيل Compose للعمل، وهو مصمّم للحدّ بشكل كبير من إيقاف مؤقت لعرض واجهة المستخدم أثناء أحمال العمل الكبيرة.
في السابق، كان يجب إكمال عملية الإنشاء بعد بدئها. وإذا كان التكوين معقّدًا، قد يؤدي ذلك إلى حظر سلسلة التعليمات الرئيسية لفترة أطول من إطار واحد، ما يؤدي إلى تجميد واجهة المستخدم. باستخدام ميزة الإنشاء القابل للإيقاف المؤقت، يمكن لوقت التشغيل الآن "إيقاف" عمله مؤقتًا إذا كان الوقت ينفد واستئناف العمل في الإطار التالي. ويكون ذلك فعالاً بشكل خاص عند استخدامه مع ميزة الجلب المسبق للتنسيق الكسول لإعداد الإطارات مسبقًا. تُعدّ واجهات برمجة التطبيقات Lazy layout CacheWindow التي تم طرحها في Compose 1.9 طريقة رائعة لجلب المزيد من المحتوى مسبقًا والاستفادة من ميزة الإنشاء القابل للإيقاف المؤقت لإنتاج أداء أكثر سلاسة في واجهة المستخدم.
يساعد التكوين القابل للإيقاف المؤقت مع ميزة الجلب المسبق الكسول في الحدّ من إيقاف مؤقت لعرض واجهة المستخدم
لقد حسّنّا الأداء أيضًا في أماكن أخرى، من خلال إجراء تحسينات على Modifier.onPlaced وModifier.onVisibilityChanged وعمليات تنفيذ المعدِّلات الأخرى. وسنواصل الاستثمار في تحسين أداء Compose.
الميزات الجديدة
الاحتفاظ
يوفّر Compose عددًا من واجهات برمجة التطبيقات للاحتفاظ بالحالة وإدارتها خلال دورات حياة مختلفة، مثلاً، remember تحتفظ بالحالة خلال عمليات الإنشاء، وrememberSavable/rememberSerializable للاحتفاظ بالحالة خلال إعادة إنشاء النشاط أو العملية.retain هي واجهة برمجة تطبيقات جديدة تقع بين واجهات برمجة التطبيقات هذه، ما يتيح لك الاحتفاظ بالقيم خلال تغييرات الإعدادات بدون تسلسلها، ولكن ليس خلال إيقاف العملية نهائيًا. بما أنّ الدالة retain لا تسلسل حالتك، يمكنك الاحتفاظ بعناصر مثل تعابير لامدا والتدفقات والعناصر الكبيرة مثل الصور النقطية التي لا يمكن تسلسلها بسهولة. على سبيل المثال، يمكنك استخدام retain لإدارة مشغّل وسائط (مثل ExoPlayer) لضمان عدم انقطاع تشغيل الوسائط بسبب تغيير الإعدادات.
@Composable
fun MediaPlayer() {
val applicationContext = LocalContext.current.applicationContext
val exoPlayer = retain { ExoPlayer.Builder(applicationContext).apply { ... }.build() }
...
}
نريد أن نقدّم شكرنا لمجموعة AndroidDev (خاصةً فريق Circuit) الذين أثّروا في تصميم هذه الميزة وساهموا فيه.
Material 1.4
يضيف الإصدار 1.4.0 من مكتبة material3 عددًا من المكوّنات والتحسينات الجديدة:
TextFieldيوفّر الآن إصدارًا تجريبيًا يستند إلىTextFieldState، ما يوفّر طريقة أكثر فعالية لإدارة حالة النص. بالإضافة إلى ذلك، يتم الآن توفير متغيرات جديدة منSecureTextFieldوOutlinedSecureTextField. تتوافق الدالة الإنشائيةTextفي Material الآن مع سلوك `autoSize`.- يوفّر مكوّن "الصور الدوّارة" الآن متغيرًا جديدًا هو
HorizontalCenteredHeroCarouselvariant. TimePickerيتيح الآن التبديل بين وضعَي أداة الاختيار والإدخال.- يساعد مقبض السحب العمودي المستخدمين في تغيير حجم و/أو موضع لوحة تكيفية.
الصور الدوّارة الأفقية التي تعرض صورًا رئيسية في المنتصف
يُرجى العِلم أنّه يتم مواصلة تطوير واجهات برمجة التطبيقات Material 3 Expressive في الإصدارات التجريبية من مكتبة material3. لمزيد من المعلومات، يمكنك الاطّلاع على هذا الحديث الأخير:
ميزات جديدة للرسوم المتحركة
نواصل توسيع نطاق واجهات برمجة التطبيقات للرسوم المتحركة، بما في ذلك التعديلات اللازمة لتخصيص الرسوم المتحركة للعناصر المشترَكة.
العناصر المشترَكة الديناميكية
تحاول الرسوم المتحركة sharedElement() وsharedBounds() تلقائيًا تحريك
تغييرات التنسيق كلما تم العثور على مفتاح مطابق في الحالة المستهدَفة. ومع ذلك، قد تحتاج إلى إيقاف هذه الرسوم المتحركة ديناميكيًا استنادًا إلى شروط معيّنة، مثل اتجاه التنقّل أو حالة واجهة المستخدم الحالية.
للتحكّم في ما إذا كان انتقال العنصر المشترَك يحدث أم لا، يمكنك الآن تخصيص SharedContentConfig الذي يتم تمريره إلى rememberSharedContentState(). تحدّد السمة isEnabled ما إذا كان العنصر المشترَك نشطًا أم لا.
SharedTransitionLayout {
val transition = updateTransition(currentState)
transition.AnimatedContent { targetState ->
// Create the configuration that depends on state changing.
fun animationConfig() : SharedTransitionScope.SharedContentConfig {
return object : SharedTransitionScope.SharedContentConfig {
override val SharedTransitionScope.SharedContentState.isEnabled: Boolean
get() =
// determine whether to perform a shared element transition
}
}
}
يمكنك الاطّلاع على المستندات لمزيد من المعلومات.
Modifier.skipToLookaheadPosition()
تمت إضافة معدِّل جديد، هو Modifier.skipToLookaheadPosition()، في هذا الإصدار، ويحتفظ هذا المعدِّل بالموضع النهائي للدالة الإنشائية عند تنفيذ الرسوم المتحركة للعناصر المشترَكة. ويتيح ذلك تنفيذ تأثيرات انتقالية مثل الرسوم المتحركة من نوع "الكشف"، كما هو موضّح في نموذج Androidify مع الكشف التدريجي عن الكاميرا. يمكنك الاطّلاع على نصيحة الفيديو هنا لمزيد من المعلومات:
السرعة الأولية في عمليات نقل العناصر المشترَكة
يضيف هذا الإصدار واجهة برمجة تطبيقات جديدة لنقل العناصر المشترَكة، هي prepareTransitionWithInitialVelocity، ما يتيح لك تمرير سرعة أولية (مثل سرعة الإيماءة) إلى عملية نقل عنصر مشترَك:
Modifier.fillMaxSize()
.draggable2D(
rememberDraggable2DState { offset += it },
onDragStopped = { velocity ->
// Set up the initial velocity for the upcoming shared element
// transition.
sharedContentStateForDraggableCat
?.prepareTransitionWithInitialVelocity(velocity)
showDetails = false
},
)
عملية انتقال عنصر مشترَك تبدأ بسرعة أولية من إيماءة
التأثيرات الانتقالية المحجوبة
EnterTransition وExitTransition تحدّدان كيفية ظهور أو اختفاء الدالة المركّبة AnimatedVisibility/AnimatedContent. يتيح لك خيار الحجاب التجريبي الجديد تحديد لون لحجب المحتوى أو إخفائه، مثلاً، عرض طبقة سوداء شبه شفافة تدريجيًا فوق المحتوى أو إخفاؤها تدريجيًا:
محتوى متحرك محجوب: يُرجى العِلم بالحجاب (أو الشاشة) شبه الشفاف فوق محتوى الشبكة أثناء الرسوم المتحركة
AnimatedContent(
targetState = page,
modifier = Modifier.fillMaxSize().weight(1f),
transitionSpec = {
if (targetState > initialState) {
(slideInHorizontally { it } togetherWith
slideOutHorizontally { -it / 2 } + veilOut(targetColor = veilColor))
} else {
slideInHorizontally { -it / 2 } +
unveilIn(initialColor = veilColor) togetherWith slideOutHorizontally { it }
}
},
) { targetPage ->
...
}
التغييرات القادمة
إيقاف `Modifier.onFirstVisible` نهائيًا
طرح الإصدار 1.9 من Compose Modifier.onVisibilityChanged وModifier.onFirstVisible. بعد مراجعة ملاحظاتك، تبيّن أنّه لا يمكن الالتزام بشكل حتمي بعقد Modifier.onFirstVisible، تحديدًا عندما يصبح أحد العناصر مرئيًا لأول مرة. على سبيل المثال، قد يتخلّص التنسيق الكسول من العناصر التي يتم تمريرها خارج إطار العرض، ثم يعيد إنشاءها إذا تم تمريرها مرة أخرى إلى إطار العرض. في هذه الحالة، سيتم تشغيل معاودة الاتصال onFirstVisible مرة أخرى، لأنّه عنصر تم إنشاؤه حديثًا. سيحدث سلوك مماثل أيضًا عند الرجوع إلى شاشة تمت زيارتها سابقًا تحتوي على onFirstVisible. وعليه، قرّرنا إيقاف هذا المعدِّل نهائيًا في إصدار Compose التالي (1.11) وننصحك بالانتقال إلى onVisibilityChanged. يمكنك الاطّلاع على المستندات لمزيد من المعلومات.
إرسال الروتين الفرعي في الاختبارات
نخطّط لتغيير عملية إرسال الروتين الفرعي في الاختبارات لتحسين موثوقية الاختبارات ورصد المزيد من المشاكل. تستخدم الاختبارات حاليًا UnconfinedTestDispatcher، الذي يختلف عن سلوك الإنتاج، مثلاً، قد يتم تشغيل التأثيرات على الفور بدلاً من وضعها في قائمة الانتظار. في إصدار مستقبلي، نخطّط لطرح واجهة برمجة تطبيقات جديدة تستخدم StandardTestDispatcher تلقائيًا لمطابقة سلوك الإنتاج. يمكنك تجربة السلوك الجديد الآن في الإصدار 1.10:
@get:Rule // also createAndroidComposeRule, createEmptyComposeRule val rule = createComposeRule(effectContext = StandardTestDispatcher())
سيؤدي استخدام StandardTestDispatcher إلى وضع المهام في قائمة الانتظار، لذا عليك استخدام آليات المزامنة مثل composeTestRule.waitForIdle() أو composeTestRule.runOnIdle(). إذا كان اختبارك يستخدم runTest، عليك التأكّد من أنّ runTest وقاعدة Compose تشتركان في مثيل StandardTestDispatcher نفسه للمزامنة.
// 1. Create a SINGLE dispatcher instance
val testDispatcher = StandardTestDispatcher()
// 2. Pass it to your Compose rule
@get:Rule
val composeRule = createComposeRule(effectContext = testDispatcher)
@Test
// 3. Pass the *SAME INSTANCE* to runTest
fun myTest() = runTest(testDispatcher) {
composeRule.setContent { /* ... */ }
}
الأدوات
تستحق واجهات برمجة التطبيقات الرائعة أدوات رائعة، ويحتوي استوديو Android على عدد من الإضافات الأخيرة لمطوّري Compose:
- تحويل واجهة المستخدم: يمكنك تكرار عمليات التصميم من خلال النقر بزر الماوس الأيمن على
@Previewواختيار **تحويل واجهة المستخدم**، ثم وصف التغيير باللغة الطبيعية. - إنشاء
@Preview: انقر بزر الماوس الأيمن على دالة مركّبة واختَر Gemini > إنشاء معاينة [اسم الدالة المركّبة] . - تخصيص رموز Material من خلال توفير دعم جديد لمتغيرات الرموز في معالج مواد العرض المتجهة.
- إنشاء رمز من لقطة شاشة أو اطلب من Gemini مطابقة واجهة المستخدم الحالية مع صورة مستهدَفة. يمكن دمج ذلك مع دعم MCP عن بُعد، مثلاً للاتصال بملف Figma وإنشاء واجهة مستخدم Compose من التصاميم.
- إصلاح مشاكل جودة واجهة المستخدم: تجري هذه الميزة تدقيقًا على واجهة المستخدم بحثًا عن المشاكل الشائعة، مثل مشاكل تسهيل الاستخدام، ثم تقترح حلولاً.
لمشاهدة هذه الأدوات قيد التنفيذ، يمكنك مشاهدة هذا العرض التوضيحي الأخير:
نتمنى لك تجربة إنشاء ممتعة
نواصل الاستثمار في Jetpack Compose لتزويدك بواجهات برمجة التطبيقات والأدوات التي تحتاج إليها لإنشاء واجهات مستخدم جميلة وغنية. نقدّر ملاحظاتك، لذا يُرجى مشاركة ملاحظاتك حول هذه التغييرات أو ما تريد رؤيته بعد ذلك في أداة تتبُّع المشاكل.
متابعة القراءة
-
أخبار المنتجات
في السنوات الخمس تقريبًا منذ إطلاق Jetpack Compose، استثمرنا في تزويدك بجميع الميزات والأداء والأدوات التي تحتاج إليها لإنشاء واجهات مستخدم رائعة على مجموعة متنوعة من أجهزة Android.
Nick Butcher • مدة القراءة: دقيقتان
-
أخبار المنتجات
في مؤتمر Google I/O لهذا العام، تحدّثنا عن نموذج أعمالنا المتطوّر الذي يوفّر المزيد من الخيارات والطرق الجديدة لاكتشاف تطبيقاتك ومحتواك داخل المتجر وخارجه. كشفنا أيضًا عن أدوات وإحصاءات متقدّمة ستساعدك في توسيع نطاق أعمالك بأقل قدر من التعقيد.
Paul Feng • قراءة لمدة 6 دقائق
-
أخبار المنتجات
يسرّنا الإعلان عن توفّر الدعم الرسمي لـ Unreal Engine وGodot على Android XR. نطرح أيضًا أدوات جديدة مصمّمة لتعزيز إنتاجيتك وإتاحة إمكانات XR جديدة، وهي Android XR Engine Hub وAndroid XR Interaction Framework.
Luke Hopkins • مدة القراءة: 4 دقائق
البقاء على اطّلاع على آخر التحديثات
يمكنك تلقّي أحدث الإحصاءات حول تطوير تطبيقات Android في بريدك الوارد أسبوعيًا.