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

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

حجم حزمة APK وأوقات الإنشاء

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

حجم حزمة APK

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

للعرض فقط طرق العرض المختلطة وCompose وضع "إنشاء فقط"
حجم التنزيل ‫2,252 كيلوبايت ‫3,034 كيلوبايت ‫2,966 كيلوبايت

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

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

مدّة التصميم

تؤدي إضافة Compose إلى زيادة وقت إنشاء تطبيقك لأنّ برنامج الترجمة البرمجية في Compose يعالج العناصر القابلة للإنشاء في تطبيقك. تم الحصول على النتائج التالية باستخدام أداة gradle-profiler المستقلة التي تنفّذ عملية إنشاء عدة مرات حتى يمكن الحصول على متوسط وقت الإنشاء لمدة إنشاء تصحيح الأخطاء في Sunflower:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
للعرض فقط طرق العرض المختلطة وCompose وضع "إنشاء فقط"
متوسط مدة التصميم ‫299.47 مللي ثانية ‫399.09 ملّي ثانية ‫342.16 مللي ثانية

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

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

ملخّص

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

يمكنك قراءة المزيد من دراسات الحالة في استخدام Compose for Teams.

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

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

عمليات إعادة التكوين الذكية

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

ملفات Baseline

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

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

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

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

كل شيء يمتدّ من View

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

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

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

عمليات عرض متعددة للتصميم

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

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

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

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

Benchmark Compose

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

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

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

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

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