Jetpack Compose توسعه میانای کاربر را تسریع میکند و توسعه Android را بهبود میبخشد. بااینحال، درنظر بگیرید که چگونه افزودن Compose به یک برنامه موجود میتواند بر سنجههایی مانند اندازه APK برنامه، ساخت، و عملکرد زمان اجرا تأثیر بگذارد.
اندازه APK و زمانهای ساخت
این بخش با بررسی برنامه نمونه Sunflower (برنامهای که روالهای مطلوب را برای انتقال برنامه مبتنی بر View به Compose نشان میدهد) تأثیر بر اندازه APK و زمان ساخت را بررسی میکند.
اندازه APK
افزودن کتابخانهها به پروژه اندازه APK آن را افزایش میدهد. نتایج زیر برای APK نسخه پخش کوچکشده هر پروژه با کوچک کردن کد و منبع فعالشده، بااستفاده از حالت کامل R8، و اندازهگیریشده بااستفاده از تحلیلکننده APK است.
| فقط بازدیدها | ترکیب کردن «نماها» و Compose | فقط نوشتن | |
|---|---|---|---|
| اندازه بارگیری | ۲٬۲۵۲ کیلوبایت | ۳٬۰۳۴ کیلوبایت | ۲۹۶۶ کیلوبایت |
وقتی برای اولینبار Compose به Sunflower اضافه شد، اندازه APK از ۲۲۵۲ کیلوبایت به ۳۰۳۴ کیلوبایت افزایش یافت—افزایش ۷۸۲ کیلوبایتی. فایل APK تولیدشده شامل ساختار رابط کاربری با ترکیبی از Views و Compose بود. این افزایش قابلانتظار است زیرا وابستگیهای بیشتری به Sunflower اضافه شده است.
برعکس، وقتی Sunflower به برنامه فقط Compose منتقل شد، اندازه APK
از ۳۰۳۴ کیلوبایت به ۲۹۶۶ کیلوبایت کاهش یافت—کاهش ۶۸ کیلوبایتی. این کاهش بهدلیل حذف وابستگیهای «نمای» استفادهنشده، مثل AppCompat و ConstraintLayout، بود.
زمان ساخت
افزودن Compose زمان ساخت برنامه شما را افزایش میدهد زیرا کامپایلر Compose
ترکیبپذیرها را در برنامه شما پردازش میکند. نتایج زیر بااستفاده از
ابزار مستقل gradle-profiler بهدست آمده است که یک ساخت را چندینبار اجرا میکند تا
میانگین زمان ساخت برای مدتزمان ساخت اشکالزدایی
Sunflower بهدست آید:
gradle-profiler --benchmark --project-dir . :app:assembleDebug
| فقط بازدیدها | ترکیب کردن «نماها» و Compose | فقط نوشتن | |
|---|---|---|---|
| میانگین زمان ساخت | ۲۹۹٫۴۷ میلیثانیه | ۳۹۹٫۰۹ میلیثانیه | ۳۴۲٫۱۶ میلیثانیه |
وقتی برای اولینبار Compose به Sunflower اضافه شد، میانگین زمان ساخت از ۲۹۹ میلیثانیه به ۳۹۹ میلیثانیه افزایش یافت—افزایش ۱۰۰ میلیثانیهای. این مدت بهدلیل انجام کارهای اضافی توسط کامپایلر Compose برای تبدیل کد Compose تعریفشده در پروژه است.
برعکس، وقتی انتقال Sunflower به Compose تکمیل شد، میانگین زمان ساخت به ۳۴۲ میلیثانیه کاهش یافت که کاهشی ۵۷ میلیثانیهای بود. این کاهش را میتوان به عوامل متعددی نسبت داد که درمجموع زمان ساخت را کاهش میدهند، مانند حذف اتصال داده، انتقال وابستگیهایی که از kapt به KSP استفاده میکنند، و بهروزرسانی چندین وابستگی به جدیدترین نسخههایشان.
خلاصه
استفاده از Compose بهطور مؤثری اندازه APK برنامهتان را افزایش میدهد و همچنین بهدلیل فرایند کامپایل کردن کد Compose، عملکرد زمان ساخت برنامهتان را افزایش میدهد. بااینحال، این معاوضهها باید درمقابل مزایای Compose، بهویژه دررابطهبا افزایش بهرهوری توسعهدهنده هنگام استفاده از Compose، سنجیده شوند. برای مثال، تیم «فروشگاه Play» متوجه شد که نوشتن واسط کاربر به کد بسیار کمتری نیاز دارد، گاهی تا ۵۰٪ کمتر، و درنتیجه بهرهوری و قابلیت نگهداری کد افزایش مییابد.
میتوانید مطالعات موردی بیشتری را در Adopt Compose for Teams بخوانید.
عملکرد زمان اجرا
این بخش موضوعات مربوط به عملکرد زمان اجرا در Jetpack Compose را پوشش میدهد تا به درک نحوه مقایسه Jetpack Compose با عملکرد سیستم View و نحوه اندازهگیری آن کمک کند.
بازترکیبهای هوشمند
وقتی بخشهایی از میانای کاربری نامعتبر است، Compose سعی میکند فقط بخشهایی را که باید بهروزرسانی شوند دوباره ترکیببندی کند. در سند چرخه حیات ترکیبپذیرها و مراحل Jetpack Compose درباره این موضوع بیشتر بخوانید.
نمایههای مبنا
نمایههای مبنا روشی عالی برای سرعت بخشیدن به مسیرهای کاربر رایج است. گنجاندن Baseline Profile در برنامه میتواند سرعت اجرای کد را از اولین راهاندازی حدود ۳۰٪ بهبود بخشد، زیرا از مراحل تفسیر و ترجمه درجا (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 بازترکیببندیهای هوشمند ارائه میدهد، و اگر نیازی به ایجاد تغییرات نداشته باشید، نتیجه قبلاً ترسیمشده را بازپخش میکند.
چندین گذر چیدمان
ViewGroups سنتی در APIهای اندازهگیری و چیدمان خود بیانگری زیادی دارند که آنها را مستعد چندین گذر چیدمان میکند. این گذرهای چیدمان چندگانه میتوانند درصورت انجام در نقاط تودرتو خاص در سلسلهمراتب نما، باعث کار نمایی شوند.
Jetpack Compose ازطریق قرارداد میانای برنامهسازی کاربردی خود، یک گذر طرحبندی واحد را برای همه ترکیبشدنیهای طرحبندی اعمال میکند. این کار به Compose اجازه میدهد تا درختهای عمیق میانای کاربر را بهطور مؤثر مدیریت کند. اگر به چند اندازهگیری نیاز باشد، Compose اندازهگیریهای ذاتی دارد.
مشاهده عملکرد راهاندازی
سیستم View باید هنگام نمایش چیدمان خاصی برای اولینبار، چیدمانهای XML را گسترش دهد. این هزینه در Jetpack Compose ذخیره میشود زیرا چیدمانها به زبان Kotlin نوشته شدهاند و مانند بقیه برنامه شما کامپایل میشوند.
محکزنی Compose
در Jetpack Compose، تفاوتهای قابلتوجهی بین عملکرد برنامه در حالتهای debug و release وجود دارد. برای زمانبندیهای نماینده، همیشه
هنگام نمایهسازی برنامهتان، از ساخت release بهجای debug استفاده کنید.
برای بررسی عملکرد کد Jetpack Compose، میتوانید از کتابخانه Jetpack Macrobenchmark استفاده کنید. برای آشنایی با نحوه استفاده از آن با Jetpack Compose، به پروژه MacrobenchmarkSample مراجعه کنید.
تیم Jetpack Compose نیز از Macrobenchmark برای ردیابی پسرفتها و اعتبارسنجی عملکرد دربرابر «نماها» در نسخههای مختلف استفاده میکند. برای معیارهای دقیق راهاندازی و پیمایش که Compose و Views را در برنامه متنباز Pokedex مقایسه میکنند، معیارهای Hero را ببینید.
نصب نمایه Compose
ازآنجاییکه Jetpack Compose یک کتابخانه غیربستهای است، از Zygote که کلاسها و ترسیمپذیرهای UI Toolkit سیستم View را پیشبارگذاری میکند، بهرهمند نمیشود. Jetpack Compose از نصب نمایه برای ساختهای نسخه پخش استفاده میکند. نصبکنندههای نمایه به برنامهها اجازه میدهند کد بحرانی را برای کامپایل شدن پیشاز موعد (AOT) در زمان نصب مشخص کنند. Compose قوانین نصب نمایه را ارسال میکند که زمان راهاندازی و لرزش را در برنامههای Compose کاهش میدهد.
توصیهشده برای شما
- توجه: وقتی جاوا اسکریپت خاموش باشد، نوشتار پیوند نمایش داده میشود
- معیارهای قهرمان
- ملاحظات دیگر
- استفاده از Compose در «نماها»
- پیمایش کردن