Jetpack Compose توسعه رابط کاربری را تسریع میکند و توسعه اندروید را بهبود میبخشد . با این حال، در نظر داشته باشید که اضافه کردن Compose به یک برنامه موجود چگونه میتواند بر معیارهایی مانند اندازه APK، ساخت و عملکرد زمان اجرا تأثیر بگذارد.
حجم APK و زمان ساخت
این بخش با بررسی برنامه نمونه Sunflower - برنامهای که بهترین شیوههای مهاجرت یک برنامه مبتنی بر View به Compose را نشان میدهد - به بررسی تأثیر اندازه APK و زمان ساخت میپردازد.
اندازه APK
افزودن کتابخانهها به پروژه شما، حجم APK آن را افزایش میدهد. نتایج زیر برای نسخه کوچکشده APK هر پروژه با فعال بودن قابلیت کوچکسازی منابع و کد ، استفاده از حالت کامل R8 و اندازهگیری با استفاده از APK Analyzer است.
| فقط بازدیدها | نماهای مختلط و ترکیببندی | فقط نوشتن | |
|---|---|---|---|
| حجم دانلود | ۲,۲۵۲ کیلوبایت | ۳,۰۳۴ کیلوبایت | ۲,۹۶۶ کیلوبایت |
هنگام اولین اضافه شدن Compose به Sunflower، اندازه APK از ۲۲۵۲ کیلوبایت به ۳۰۳۴ کیلوبایت افزایش یافت - افزایشی ۷۸۲ کیلوبایتی . APK تولید شده شامل ساخت رابط کاربری با ترکیبی از Views و Compose بود. این افزایش با توجه به اضافه شدن وابستگیهای اضافی به Sunflower قابل پیشبینی بود.
برعکس، وقتی Sunflower به یک برنامه فقط-کامپوزیشن مهاجرت کرد، اندازه APK از ۳۰۳۴ کیلوبایت به ۲۹۶۶ کیلوبایت کاهش یافت - کاهشی ۶۸ کیلوبایتی . این کاهش به دلیل حذف وابستگیهای View استفاده نشده، مانند AppCompat و ConstraintLayout بود.
زمان ساخت
اضافه کردن Compose زمان ساخت برنامه شما را افزایش میدهد، زیرا کامپایلر Compose، composableها را در برنامه شما پردازش میکند. نتایج زیر با استفاده از ابزار مستقل gradle-profiler به دست آمده است که یک build را چندین بار اجرا میکند تا بتوان یک زمان ساخت میانگین برای مدت زمان ساخت اشکالزدایی Sunflower به دست آورد:
gradle-profiler --benchmark --project-dir . :app:assembleDebug
| فقط بازدیدها | نماهای مختلط و ترکیببندی | فقط نوشتن | |
|---|---|---|---|
| میانگین زمان ساخت | ۲۹۹.۴۷ میلیثانیه | ۳۹۹.۰۹ میلیثانیه | ۳۴۲.۱۶ میلیثانیه |
هنگام اولین اضافه شدن Compose به Sunflower، میانگین زمان ساخت از ۲۹۹ میلیثانیه به ۳۹۹ میلیثانیه افزایش یافت - افزایشی ۱۰۰ میلیثانیهای . این مدت زمان به دلیل انجام وظایف اضافی توسط کامپایلر Compose برای تبدیل کد Compose تعریف شده در پروژه است.
برعکس، میانگین زمان ساخت به ۳۴۲ میلیثانیه کاهش یافت که کاهشی ۵۷ میلیثانیهای را نشان میدهد ، زمانی که مهاجرت Sunflower به Compose تکمیل شد. این کاهش را میتوان به عوامل متعددی نسبت داد که در مجموع زمان ساخت را کاهش میدهند، مانند حذف اتصال داده ، انتقال وابستگیهایی که از kapt به KSP استفاده میکنند و بهروزرسانی چندین وابستگی به آخرین نسخههای آنها.
خلاصه
استفاده از Compose به طور موثری حجم APK برنامه شما را افزایش میدهد و همچنین به دلیل فرآیند کامپایل کد Compose، عملکرد زمان ساخت برنامه شما را افزایش میدهد. با این حال، این مزایا باید در مقابل مزایای Compose سنجیده شوند، به خصوص در مورد افزایش بهرهوری توسعهدهندگان هنگام استفاده از Compose. به عنوان مثال، تیم Play Store دریافت که نوشتن رابط کاربری به کد بسیار کمتری، گاهی تا 50٪، نیاز دارد و در نتیجه بهرهوری و قابلیت نگهداری کد را افزایش میدهد.
میتوانید مطالعات موردی بیشتر را در Adopt Compose for Teams مطالعه کنید.
عملکرد زمان اجرا
این بخش مباحث مربوط به عملکرد زمان اجرا در Jetpack Compose را پوشش میدهد تا به درک چگونگی مقایسه عملکرد Jetpack Compose با عملکرد سیستم View و نحوه اندازهگیری آن کمک کند.
ترکیببندیهای هوشمند
وقتی بخشهایی از رابط کاربری نامعتبر باشند، Compose سعی میکند فقط بخشهایی را که نیاز به بهروزرسانی دارند، دوباره ترکیب کند. برای اطلاعات بیشتر در این مورد، به مستندات Lifecycle of composables و Jetpack Compose مراجعه کنید.
پروفایلهای پایه
پروفایلهای پایه (Baseline Profiles) راهی عالی برای سرعت بخشیدن به سفرهای مشترک کاربر هستند. گنجاندن یک پروفایل پایه در برنامه شما میتواند با جلوگیری از تفسیر و مراحل کامپایل درجا (JIT) برای مسیرهای کد گنجانده شده، سرعت اجرای کد را از اولین راهاندازی حدود 30٪ بهبود بخشد.
کتابخانه Jetpack Compose شامل Baseline Profile مخصوص به خود است و شما به طور خودکار این بهینهسازیها را هنگام استفاده از Compose در برنامه خود دریافت میکنید. با این حال، این بهینهسازیها فقط بر مسیرهای کد درون کتابخانه Compose تأثیر میگذارند، بنابراین توصیه میکنیم یک Baseline Profile به برنامه خود اضافه کنید تا مسیرهای کد خارج از Compose را پوشش دهد.
مقایسه با سیستم View
Jetpack Compose نسبت به سیستم View پیشرفتهای زیادی داشته است. این پیشرفتها در بخشهای بعدی توضیح داده شدهاند.
همه چیز نمای را گسترش میدهد
هر View که روی صفحه نمایش رسم میشود، مانند TextView ، Button یا ImageView ، برای پشتیبانی از همه موارد استفاده، نیاز به تخصیص حافظه، ردیابی صریح وضعیت و فراخوانیهای مختلف دارد. علاوه بر این، مالک View سفارشی باید منطق صریحی را پیادهسازی کند تا از رسم مجدد در مواقع غیرضروری - مثلاً برای پردازش دادههای تکراری - جلوگیری کند.
Jetpack Compose این مشکل را از چند طریق حل میکند. Compose اشیاء قابل بهروزرسانی صریحی برای ترسیم نماها ندارد. عناصر رابط کاربری، توابع قابل ترکیب سادهای هستند که اطلاعات آنها به روشی قابل پخش مجدد در ترکیب نوشته میشود. این امر به کاهش ردیابی صریح حالت، تخصیص حافظه و فراخوانیهای مجدد فقط به ترکیبهایی که به ویژگیهای مذکور نیاز دارند، کمک میکند، به جای اینکه همه افزونههای یک نوع View خاص، آنها را الزامی کنند.
علاوه بر این، Compose ترکیببندیهای هوشمند را ارائه میدهد و در صورتی که نیازی به ایجاد تغییرات نداشته باشید، نتیجه ترسیم شده قبلی را دوباره نمایش میدهد.
چندین مرحله طرحبندی
گروههای نمایشی سنتی، در APIهای اندازهگیری و طرحبندی خود، صراحت زیادی دارند که آنها را مستعد عبور از چندین مرحله طرحبندی میکند. این مراحل طرحبندی چندگانه، اگر در نقاط تو در تو خاصی در سلسله مراتب نمایش انجام شوند، میتوانند باعث کار نمایی شوند.
Jetpack Compose از طریق قرارداد API خود، یک مرحلهی طرحبندی واحد را برای تمام layout composableها اعمال میکند. این امر به Compose اجازه میدهد تا به طور موثر درختهای رابط کاربری عمیق را مدیریت کند. اگر به چندین اندازهگیری نیاز باشد، Compose دارای اندازهگیریهای ذاتی است.
مشاهده عملکرد راهاندازی
سیستم View هنگام نمایش یک طرحبندی خاص برای اولین بار، نیاز به inflate کردن طرحبندیهای XML دارد. این هزینه در Jetpack Compose صرفهجویی میشود زیرا طرحبندیها با Kotlin نوشته شده و مانند بقیه برنامه شما کامپایل میشوند.
معیار نوشتن
در Jetpack Compose 1.0، تفاوتهای قابل توجهی بین عملکرد یک برنامه در حالت debug و release وجود دارد. برای زمانبندیهای نمایشی، همیشه هنگام پروفایل کردن برنامه خود از release (release build) به جای debug استفاده کنید.
برای بررسی عملکرد کد Jetpack Compose خود، میتوانید از کتابخانه Jetpack Macrobenchmark استفاده کنید. برای یادگیری نحوه استفاده از آن با Jetpack Compose، به پروژه MacrobenchmarkSample مراجعه کنید.
تیم Jetpack Compose همچنین از Macrobenchmark برای شناسایی هرگونه رگرسیونی که ممکن است رخ دهد استفاده میکند. برای مثال، به معیار ستون تنبل و داشبورد آن برای ردیابی رگرسیونها مراجعه کنید.
نصب پروفایل را بنویسید
از آنجایی که Jetpack Compose یک کتابخانهی بدون نیاز به نصب است، از Zygote که کلاسها و drawableهای UI Toolkit سیستم View را از قبل بارگذاری میکند، بهرهمند نیست. Jetpack Compose 1.0 از نصب پروفایل برای نسخههای آزمایشی استفاده میکند. نصبکنندههای پروفایل به برنامهها اجازه میدهند کدهای حیاتی را که باید در زمان نصب کامپایل شوند، مشخص کنند. Compose قوانین نصب پروفایل را ارائه میدهد که زمان راهاندازی و سرعت برنامههای Compose را کاهش میدهد.
{% کلمه به کلمه %}برای شما توصیه میشود
- توجه: متن لینک زمانی نمایش داده میشود که جاوا اسکریپت غیرفعال باشد.
- ملاحظات دیگر
- استفاده از Compose در Views
- اسکرول