مقارنة مقاييس "الإنشاء" و"العرض"

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

حجم حزمة APK ووقت إنشائها

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

حجم حزمة APK

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

المشاهدات فقط مزيج من المشاهدات والتأليف إنشاء الرسائل فقط
حجم التنزيل 2,252 كيلوبايت 3,034 كيلوبايت 2,966 كيلوبايت

عند إضافة ميزة "الإنشاء" إلى تطبيق Sunflower لأول مرة، زاد حجم حزمة APK من 2,252 كيلوبايت إلى 3,034 كيلوبايت، أي زيادة قدرها 782 كيلوبايت. يتألف حِزمة APK التي تم إنشاؤها من حِزمة واجهة المستخدم التي تتضمّن مزيجًا من مكونات Views وCompose. من المتوقّع حدوث هذه الزيادة بسبب إضافة مزيد من التبعيات إلى Sunflower.

في المقابل، عندما تم نقل Sunflower إلى تطبيق مكوّن فقط، انخفض حجم حزمة APK من 3,034 كيلوبايت إلى 2,966 كيلوبايت، أي انخفاضًا قدره 68 كيلوبايت. يرجع هذا الانخفاض إلى إزالة اعتماديات View غير المستخدمة، مثل AppCompat وConstraintLayout.

مدّة التصميم

تؤدي إضافة "إنشاء" إلى زيادة وقت تصميم تطبيقك لأنّ أداة التجميع في Compose (الإنشاء) تزيد من وقت إنشاء تطبيقك. gradle-profiler

gradle-profiler --benchmark --project-dir . :app:assembleDebug
المشاهدات فقط مزيج من المشاهدات والتأليف إنشاء الرسائل فقط
متوسّط مدّة التصميم 299.47 ملي ثانية 399.09 ملي ثانية 342.16 ملي ثانية

عند إضافة Compose إلى Sunflower لأول مرة، زاد متوسط وقت التصميم من 299 ملي ثانية إلى 399 ملي ثانية، أي زيادة قدرها 100 ملي ثانية. ترجع هذه المدة إلى أنّ مُجمِّع Composeيقوم بأداء مهام إضافية لتحويل رمز Compose المحدَّد في المشروع.

في المقابل، انخفض متوسّط وقت الإنشاء إلى 342 ملي ثانية، أي انخفاضًا بمقدار 57 ملي ثانية، عند اكتمال نقل بيانات Sunflower إلى Compose. ويمكن أن يُعزى هذا الانخفاض إلى عوامل متعدّدة تؤدي مجتمعةً إلى تقليل وقت الإصدار، مثل إزالة ربط البيانات ونقل التبعيات التي تستخدم kapt إلى KSP وتعديل العديد من التبعيات إلى أحدث إصداراتها.

ملخّص

سيؤدي استخدام Compose إلى زيادة حجم حزمة APK لتطبيقك بشكل فعّال، كما سيؤدي إلى زيادة أداء وقت إنشاء تطبيقك بسبب عملية تجميع код Compose. ومع ذلك، يجب موازنة هذه المفاضلات مع مزايا أداة Compose، خاصةً في ما يتعلق بزيادة إنتاجية المطوّرين عند استخدام Compose. على سبيل المثال، تبيّن لفريق "متجر Play" أنّ كتابة واجهة المستخدم تتطلّب قدرًا أقل بكثير من الرموز البرمجية، يصل أحيانًا إلى%50، ما يؤدي بدوره إلى زيادة الإنتاجية وسهولة صيانة الرموز البرمجية.

يمكنك الاطّلاع على مزيد من دراسات الحالة في مقالة استخدام تطبيق Compose for Teams.

أداء وقت التشغيل

يتناول هذا القسم مواضيع ذات صلة بأداء وقت التشغيل في Jetpack Compose بهدف المساعدة في فهم مستوى أداء Jetpack Compose مقارنةً بأداء نظام View، وكيفية قياسه.

عمليات إعادة التركيب الذكية

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

الملفات الشخصية الأساسية

الملفات الشخصية الأساسية هي طريقة ممتازة لتسريع تجارب المستخدِمين الشائعة. يمكن أن يؤدي تضمين ملف تعريف "الأداء الأساسي" في تطبيقك إلى تحسين سرعة تنفيذ الرمز البرمجي بنسبة% 30 تقريبًا عن الإطلاق الأول من خلال تجنُّب خطوات التفسير والتجميع أثناء التنفيذ (JIT) لمسارَي الرمز البرمجي المضمّنين.

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

المقارنة مع نظام View

يتضمّن نظام Jetpack Compose العديد من التحسينات مقارنةً بنظام "العرض". يتم توضيح هذه التحسينات في الأقسام التالية.

كل شيء يمتد إلى العرض

كل View يتم رسمه على الشاشة، مثل TextView أو Button أو ImageView، يتطلب تخصيص ذاكرة وتتبُّع الحالة الصريح ومختلف الطلبات المُعاد الاتصال بها لتلبية جميع حالات الاستخدام. علاوةً على ذلك، يحتاج مالك View المخصّص إلى تنفيذ منطق صريح لمنع إعادة الرسم عندما لا يكون ذلك ضروريًا، مثلاً، لمعالجة البيانات المتكرّرة.

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

بالإضافة إلى ذلك، توفر ميزة Compose إعادة ابتكار ذكية وإعادة تشغيل النتيجة المرسومة سابقًا إذا لم تكن بحاجة إلى إجراء تغييرات.

عمليات تمرير تنسيقات متعددة

تتمتع مجموعات ViewGroups التقليدية بالكثير من التعبير في واجهات برمجة التطبيقات المتعلقة بالقياس والتنسيق، ما يجعلها عرضة لتذاكر تنسيقات متعددة. يمكن أن تتسبب ممرات التخطيط المتعددة هذه في عمل أسي إذا تم إجراؤها في نقاط متداخلة محددة في التسلسل الهرمي للعرض.

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

عرض أداء بدء التشغيل

يحتاج نظام العرض إلى تضخيم تنسيقات XML عند عرض تنسيق معيّن للمرة الأولى. يتم حفظ هذه التكلفة في Jetpack Compose لأنّ التنسيقات مكتوبة باستخدام Kotlin ويتم تجميعها مثل بقية أجزاء تطبيقك.

Benchmark Compose

في الإصدار 1.0 من Jetpack Compose، هناك اختلافات ملحوظة بين أداء تطبيق في الوضعَين debug وrelease. للحصول على أوقات تمثيلية، استخدِم دائمًاrelease بدلاً من debug عند إنشاء ملف تعريف لتطبيقك.

للتحقّق من مستوى أداء رمز Jetpack Compose، يمكنك استخدام مكتبة Jetpack Macrobenchmark. للتعرّف على طريقة استخدام هذه الأداة مع Jetpack Compose، يمكنك الاطّلاع على مشروع SurfacebenchmarkSample.

يستخدم فريق Jetpack Compose أيضًا أداة Macrobenchmark لرصد أي تراجعات قد تحدث. على سبيل المثال، اطّلِع على مقياس الأداء الخاص بالعمود البطيء ولوحة البيانات لتتبُّع حالات التراجع.

إنشاء عملية تثبيت الملف الشخصي

بما أنّ Jetpack Compose هي مكتبة غير مجمّعة، لا تستفيد من Zygote الذي يحمِّل مسبقًا فئات أدوات برمجة واجهة المستخدم وعناصر الرسم في نظام العرض. يستخدم Jetpack Compose 1.0 تثبيت الملف الشخصي في إصدارات الإصدار. تتيح أدوات تثبيت الملف الشخصي للتطبيقات تحديد الرموز المُهمة ليتم تجميعها مسبقًا (AOT) أثناء التثبيت. تُرسِل ميزة "الإنشاء" قواعد التثبيت الخاصة بالملف الشخصي التي تقلِّل من وقت بدء التشغيل والارتباك في تطبيقات "الإنشاء".