نمایه های پایه

نمایه‌های خط پایه سرعت اجرای کد را تا حدود 30 درصد از اولین راه‌اندازی با اجتناب از مراحل تفسیر و کامپایل به‌موقع (JIT) برای مسیرهای کد گنجانده شده بهبود می‌بخشند.

با ارسال نمایه خط پایه در یک برنامه یا کتابخانه، Android Runtime (ART) می تواند مسیرهای کد مشخص شده را از طریق تلفیقی پیش از زمان (AOT) بهینه کند و برای هر کاربر جدید و هر به روز رسانی برنامه، بهبود عملکرد را ارائه دهد. این بهینه‌سازی هدایت‌شده نمایه (PGO) به برنامه‌ها اجازه می‌دهد راه‌اندازی را بهینه کنند، جابجایی تعامل را کاهش دهند و عملکرد کلی زمان اجرا را برای کاربران از اولین راه‌اندازی بهبود بخشند.

این بهبودهای عملکرد مستقیماً منجر به بهبود معیارهای تجاری مانند حفظ کاربر، تراکنش‌ها و رتبه‌بندی می‌شود. می‌توانید در داستان‌های Josh ، Lyft ، TikTok و Zomato درباره نحوه تأثیر عملکرد بر معیارهای کسب‌وکار بیشتر بخوانید.

مزایای پروفایل های پایه

نمایه‌های خط پایه همه تعاملات کاربر - مانند راه‌اندازی برنامه، پیمایش بین صفحه‌ها یا پیمایش در محتوا را از اولین باری که اجرا می‌کنند، راحت‌تر می‌کنند. با افزایش سرعت و پاسخگویی یک برنامه، Baseline Profiles می تواند منجر به کاربران فعال روزانه بیشتر و میانگین نرخ بازدید برگشت بالاتر شود.

نمایه‌های خط پایه با ارائه تعاملات مشترک با کاربر که زمان اجرای برنامه را از اولین راه‌اندازی بهبود می‌بخشد، به بهینه‌سازی فراتر از راه‌اندازی برنامه کمک می‌کند. کامپایل هدایت‌شده AOT به دستگاه‌های کاربر متکی نیست و می‌تواند یک بار در هر نسخه بر روی یک ماشین توسعه به جای دستگاه تلفن همراه انجام شود. با ارسال نسخه‌ها با نمایه خط پایه، بهینه‌سازی برنامه‌ها بسیار سریع‌تر از تکیه بر نمایه‌های ابری به تنهایی در دسترس قرار می‌گیرد.

هنگامی که از نمایه خط پایه استفاده نمی کنید، همه کدهای برنامه یا پس از تفسیر در حافظه با JIT کامپایل می شوند، یا زمانی که دستگاه بیکار است، در یک فایل odex در پس زمینه نوشته می شود. پس از نصب یا به‌روزرسانی یک برنامه، کاربران از اولین باری که آن را اجرا می‌کنند تا زمانی که مسیرهای کد جدید بهینه شوند، تجربه‌ای کمتر از حد مطلوب دارند. بسیاری از برنامه‌ها پس از بهینه‌سازی، افزایش عملکرد را حدود 30 درصد اندازه‌گیری می‌کنند.

پروفایل های راه اندازی

نمایه‌های راه‌اندازی شبیه به پروفایل‌های پایه هستند، اما تفاوت آن‌ها در این است که در زمان کامپایل به‌جای بهینه‌سازی روی دستگاه استفاده می‌شوند. نمایه راه اندازی برای بهینه سازی طرح بندی فایل DEX برای بهبود زمان راه اندازی استفاده می شود. کد شناسایی‌شده در نمایه راه‌اندازی در فایل classes.dex اولیه و کدهای دیگر در فایل‌های DEX جداگانه قرار می‌گیرد. این کار با کاهش تعداد خطاهای صفحه در هنگام راه اندازی برنامه، زمان راه اندازی را بهبود می بخشد. برای کسب اطلاعات بیشتر در مورد اینکه چگونه نمایه‌های راه‌اندازی و بهینه‌سازی طرح‌بندی DEX می‌توانند زمان راه‌اندازی برنامه را بهبود بخشند، به بهینه‌سازی طرح‌بندی DEX و نمایه‌های راه‌اندازی مراجعه کنید.

شروع کنید

برای شروع بهینه سازی عملکرد در برنامه موجود خود، به ایجاد نمایه های خط پایه مراجعه کنید.

زنجیره وابستگی نسخه‌های انتشار پایدار و توسعه‌یافته را ارائه می‌کند. برای ایجاد و نصب نمایه خط پایه، از نسخه های پشتیبانی شده زیر یا بالاتر از افزونه Android Gradle، کتابخانه Macrobenchmark و Profile Installer استفاده کنید. این وابستگی ها در زمان های مختلف مورد نیاز هستند و با هم به عنوان یک زنجیره ابزار کار می کنند تا نمایه خط پایه بهینه را فعال کنند.

  • افزونه اندروید Gradle: com.android.tools.build:8.0.0
  • کتابخانه Macrobenchmark: androidx.benchmark:benchmark-macro-junit4:1.3.1
  • نصب کننده پروفایل: androidx.profileinstaller:profileinstaller:1.4.0

توصیه می کنیم از آخرین نسخه AGP برای ایجاد و مدیریت پروفایل های پایه استفاده کنید. در اینجا عملکردهای اصلی ارائه شده با نسخه های مختلف AGP آورده شده است:

نسخه AGP ویژگی ها
8.4 نصب برنامه‌های محلی ساخت‌های غیرقابل اشکال‌زدایی با استفاده از ابزار خط فرمان Gradle wrapper یا Android Studio نصب نمایه‌های پایه، بنابراین عملکرد ساخت نسخه محلی شما بیشتر با تولید مطابقت دارد. این به‌روزرسانی بر عملکرد تولید نمایه‌های پایه تأثیری نمی‌گذارد.
8.3
  • پشتیبانی کامل از فهرست راهنمای مجموعه منبع (ماژول های کتابخانه): چندین فایل مبدأ نمایه پایه را اعلام کنید، و از دایرکتوری های آگاه از انواع مختلف، مانند src/free/generated/baselineProfiles/baseline-prof1.txt ، اکنون برای ماژول های کتابخانه و همچنین ماژول های برنامه استفاده کنید.
  • نمایه‌های پایه شامل کلاس‌های قندزدایی می‌شوند.
8.2
  • بازنویسی قوانین R8: D8 و R8 می‌توانند قوانین پایه و نمایه راه‌اندازی قابل خواندن برای انسان را تغییر دهند تا تمام قوانینی را که برای بهینه‌سازی عملکرد برنامه نیاز دارید، به‌طور کامل دربرگیرد. پوشش نمایه پایه روش ها را تا 30٪ افزایش می دهد و عملکرد برنامه را تا 15٪ افزایش می دهد.
  • نمایه های راه اندازی: این نوع جدید از نمایه خط پایه را برای اطلاع رسانی طرح بندی کد در DEX ایجاد کنید. عملکرد راه‌اندازی را تا 15% اضافی یا به میزان قابل توجهی برای برنامه‌های بزرگ افزایش می‌دهد.
8.0 حداقل نسخه پیشنهادی: از پلاگین Baseline Profile Gradle برای تولید نمایه های پایه با یک کار Gradle استفاده کنید.
  • پشتیبانی کامل از فهرست راهنمای مجموعه منبع (ماژول های برنامه): چندین فایل مبدأ نمایه پایه را اعلام کنید و از دایرکتوری های آگاه از انواع مختلف مانند src/free/generated/baselineProfiles/baseline-prof1.txt استفاده کنید.
7.4 حداقل نسخه پشتیبانی شده: برنامه ها می توانند نمایه های خط پایه را از کتابخانه ها مصرف کنند و نمایه خط پایه خود را در فایل src/main/baseline-prof.txt ارائه دهند.
  • هنگام ساختن APK از یک بسته برنامه، نمایه‌های خط پایه به درستی بسته‌بندی می‌شوند ( مساله شماره 230361284 ).
  • برای برنامه‌هایی که بیش از یک فایل .dex دارند، نمایه‌های پایه به درستی برای فایل .dex اولیه بسته‌بندی می‌شوند.

نمونه تولید پروفایل

در زیر یک کلاس مثال برای ایجاد یک نمایه پایه برای راه اندازی برنامه، و همچنین چندین رویداد پیمایش و پیمایش با استفاده از کتابخانه Macrobenchmark توصیه شده است:

@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            // App startup journey.
            startActivityAndWait()

            device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
            device.findObject(By.res("myLazyColumn")).also {
                it.fling(Direction.DOWN)
                it.fling(Direction.UP)
            }
            device.pressBack()
        }
    }
}

شما می توانید این کد را به صورت کامل و با جزئیات بیشتر به عنوان بخشی از نمونه عملکرد ما در GitHub مشاهده کنید.

چه چیزی را شامل شود

هنگام استفاده از نمایه‌های خط پایه در یک برنامه، می‌توانید کد راه‌اندازی برنامه و تعاملات رایج کاربر مانند پیمایش بین صفحه‌ها یا پیمایش را در برنامه قرار دهید. همچنین می توانید کل جریان ها مانند ثبت نام، ورود به سیستم یا پرداخت را جمع آوری کنید. هر سفر کاربر که به نظر شما حیاتی است، می‌تواند با بهبود عملکرد زمان اجرا، از نمایه‌های پایه استفاده کند.

اگر روش‌های مختلفی را برای بهبود عملکرد آزمایش می‌کنید، نمایه‌های پایه را برای هر دو بخش آزمایش خود در نظر بگیرید. با انجام این کار، می توانید با اطمینان از اینکه همه کاربران شما به طور مداوم کد کامپایل شده را اجرا می کنند، تفسیر نتایج را آسان تر کنید.

کتابخانه‌ها می‌توانند نمایه‌های پایه خود را ارائه کنند و برای بهبود عملکرد برنامه، نسخه‌های منتشر شده را به آنها ارسال کنند. برای مثال، بخش استفاده از نمایه خط پایه را در عملکرد Jetpack Compose ببینید.

نمایه های پایه چگونه کار می کنند

هنگام توسعه برنامه یا کتابخانه خود، تعریف نمایه های خط پایه را در نظر بگیرید تا تعاملات رایج کاربر را در جایی که زمان رندر یا تأخیر مهم هستند پوشش دهید. در اینجا نحوه کار آنها آمده است:

  1. قوانین نمایه قابل خواندن توسط انسان برای برنامه شما ایجاد می شود و به شکل باینری در برنامه کامپایل می شود. می توانید آنها را در assets/dexopt/baseline.prof پیدا کنید. سپس می‌توانید AAB را طبق معمول در Google Play آپلود کنید.

  2. Google Play نمایه را پردازش کرده و مستقیماً همراه با APK برای کاربران ارسال می کند. در حین نصب، ART کامپایل AOT متدهای موجود در نمایه را انجام می دهد که در نتیجه آن روش ها سریعتر اجرا می شوند. اگر نمایه حاوی روش‌هایی باشد که در راه‌اندازی برنامه یا در حین رندر فریم استفاده می‌شوند، کاربر ممکن است زمان راه‌اندازی سریع‌تر و کاهش jank را تجربه کند.

  3. این جریان برای تنظیم دقیق عملکرد بر اساس استفاده واقعی از برنامه در طول زمان، با تجمع نمایه‌های ابری همکاری می‌کند.

شکل 1. این نمودار گردش کار نمایه پایه را از بارگذاری تا تحویل کاربر نهایی نشان می دهد، و نحوه ارتباط آن گردش کار با پروفایل های ابری را نشان می دهد.

پروفایل های ابری

Cloud Profiles یک فرم اضافی از PGO را ارائه می‌کند - که توسط Google Play Store جمع‌آوری شده و برای جمع‌آوری زمان نصب توزیع شده است - همراه با Baseline Profiles.

در حالی که نمایه‌های ابری توسط تعاملات کاربر در دنیای واقعی با برنامه هدایت می‌شوند، چند ساعت تا چند روز پس از توزیع به‌روزرسانی طول می‌کشد و در دسترس بودن آن‌ها را محدود می‌کند. تا زمانی که نمایه‌ها به طور کامل توزیع نشده باشند، عملکرد برنامه برای کاربران برنامه‌های جدید یا به‌روزرسانی شده کمتر از حد مطلوب است. علاوه بر این، Cloud Profiles فقط از دستگاه‌های Android دارای Android 9 (سطح API 28) یا بالاتر پشتیبانی می‌کند و فقط برای برنامه‌هایی که پایگاه کاربر به اندازه کافی بزرگ دارند، به خوبی مقیاس می‌شوند.

رفتار جمع‌آوری در نسخه‌های اندروید

نسخه‌های پلتفرم Android از روش‌های تلفیقی برنامه‌های متفاوتی استفاده می‌کنند که هرکدام دارای یک مبادله عملکرد مربوطه هستند. نمایه های خط پایه با ارائه نمایه ای برای همه نصب ها نسبت به روش های کامپایل قبلی بهبود می یابند.

نسخه اندروید روش تالیف رویکرد بهینه سازی
5 تا 6 (سطح API 21 تا 23) AOT کامل کل برنامه در حین نصب بهینه می‌شود، در نتیجه زمان انتظار طولانی برای استفاده از برنامه، افزایش استفاده از رم و فضای دیسک، و زمان‌های طولانی‌تر برای بارگیری کد از دیسک، به طور بالقوه افزایش زمان راه‌اندازی سرد می‌شود.
7 تا 8.1 (سطح API 24 تا 27) AOT جزئی (نمایه پایه) نمایه های خط پایه توسط androidx.profileinstaller در اولین اجرا نصب می شوند که ماژول برنامه این وابستگی را تعریف می کند. ART می‌تواند با افزودن قوانین نمایه اضافی در حین استفاده از برنامه، و کامپایل آنها در زمانی که دستگاه بی‌حرکت است، این را بیشتر بهبود بخشد. این کار فضای دیسک و زمان بارگیری کد از دیسک را بهینه می کند و در نتیجه زمان انتظار برای برنامه را کاهش می دهد.
9 (سطح API 28) و بالاتر AOT جزئی (پایه + نمایه ابری) Play هنگام نصب برنامه از نمایه‌های خط پایه برای بهینه‌سازی نمایه‌های APK و Cloud—در صورت موجود بودن، استفاده می‌کند. پس از نصب، نمایه‌های ART در Play آپلود می‌شوند، جمع‌آوری می‌شوند و پس از نصب یا به‌روزرسانی برنامه، به‌عنوان نمایه‌های ابری در اختیار سایر کاربران قرار می‌گیرند.

مسائل شناخته شده

موارد زیر مسائل و راه‌حل‌های احتمالی یا مسائلی هستند که پیشرفت‌های مداومی برای راه‌حل‌ها برای آنها وجود دارد:

  • ممکن است به دلیل تنظیمات مجوز در برخی دستگاه‌ها، از جمله دستگاه‌های OnePlus، تولید نمایه خط پایه ناموفق باشد. برای حل این مشکل، گزینه Disable permission monitoring را در تنظیمات Developer Options خاموش کنید.

  • تولید نمایه خط پایه در دستگاه‌های Firebase Test Lab، از جمله دستگاه‌های Test Lab با مدیریت Gradle ( نسخه #285187547 ) پشتیبانی نمی‌شود.

  • برای ارائه موفقیت آمیز نمایه های خط پایه برای کتابخانه ها، حداقل از پلاگین Baseline Profile Gradle 1.2.3 یا AGP 8.3 استفاده کنید ( شماره 313992099 ).

  • اگر نمایه‌های خط پایه را با دستور ./gradlew app:generateBaselineProfile ایجاد کنید، معیارهای ماژول آزمایشی نیز اجرا می‌شوند و نتایج نادیده گرفته می‌شوند. اگر این اتفاق بیفتد، با اجرای دستور با -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile . این مشکل در AGP 8.2 رفع شده است.

  • دستور ایجاد نمایه های خط پایه برای همه انواع ساخت ./gradlew app:generateBaselineProfile - فقط پروفایل های خط پایه را برای نوع ساخت نسخه تولید می کند. این مشکل در AGP 8.1 رفع شده است.

  • ممکن است کانال‌های توزیع برنامه غیر Google Play از استفاده از نمایه‌های خط پایه در هنگام نصب پشتیبانی نکنند. کاربران برنامه‌هایی که از طریق این کانال‌ها نصب می‌شوند تا زمانی که dexopt پس‌زمینه اجرا نشود، مزایایی را مشاهده نمی‌کنند - که احتمالاً یک شبه است.

  • اشتراک‌گذاری داخلی برنامه فروشگاه Play از نمایه‌های پایه پشتیبانی نمی‌کند. با این حال، مسیر تست داخلی انجام می دهد.

  • بهینه سازی باتری در برخی از دستگاه ها، مانند دستگاه های Huawei، می تواند در نصب پروفایل اختلال ایجاد کند. برای اطمینان از اینکه نمایه های شما به طور موثر نصب می شوند، هر گونه بهینه سازی باتری را در دستگاه های معیار خود غیرفعال کنید.

منابع اضافی

{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% آخر کلمه %}