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

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

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

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

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

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

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

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

پروفایل‌های استارتاپ

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

شروع کنید

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

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

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

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

نسخه AGP ویژگی‌ها
۸.۴ نصب برنامه‌های محلی از نسخه‌های غیرقابل اشکال‌زدایی با استفاده از ابزار خط فرمان Gradle wrapper یا اندروید استودیو، پروفایل‌های پایه را نصب می‌کند، تا عملکرد نسخه محلی شما با نسخه اصلی مطابقت بیشتری داشته باشد. این به‌روزرسانی بر عملکرد نسخه اصلی پروفایل‌های پایه تأثیری نمی‌گذارد.
۸.۳
  • پشتیبانی کامل از دایرکتوری مجموعه سورس (ماژول‌های کتابخانه): چندین فایل سورس Baseline Profile تعریف کنید و از دایرکتوری‌های آگاه از نوع داده، مانند src/free/generated/baselineProfiles/baseline-prof1.txt ، هم اکنون برای ماژول‌های کتابخانه و هم برای ماژول‌های برنامه استفاده کنید.
  • پروفایل‌های پایه شامل کلاس‌های بدون قند هستند.
۸.۲
  • بازنویسی قوانین R8: D8 و R8 می‌توانند قوانین Baseline و Startup Profile که برای انسان قابل خواندن هستند را تغییر دهند تا تمام قوانینی را که برای بهینه‌سازی عملکرد برنامه نیاز دارید، به طور کامل در بر بگیرند. پوشش Baseline Profile از روش‌ها را حدود 30٪ و عملکرد برنامه را حدود 15٪ افزایش می‌دهد.
  • پروفایل‌های راه‌اندازی: این نوع جدید از پروفایل پایه را برای اطلاع‌رسانی در مورد طرح‌بندی کد در DEX تولید می‌کند. عملکرد راه‌اندازی را حدود ۱۵٪ یا برای برنامه‌های بزرگ به طور قابل توجهی بیشتر افزایش می‌دهد.
۸.۰ حداقل نسخه پیشنهادی: از افزونه Baseline Profile Gradle برای تولید Baseline Profiles با یک وظیفه Gradle واحد استفاده کنید.
  • پشتیبانی کامل از دایرکتوری مجموعه سورس (ماژول‌های برنامه): چندین فایل سورس Baseline Profile تعریف کنید و از دایرکتوری‌های آگاه از انواع مختلف، مانند src/free/generated/baselineProfiles/baseline-prof1.txt استفاده کنید.
۷.۴ حداقل نسخه پشتیبانی‌شده: برنامه‌ها می‌توانند از پروفایل‌های پایه (Baseline Profiles) کتابخانه‌ها استفاده کنند و پروفایل پایه (Baseline Profile) خود را در فایل 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. گوگل پلی پروفایل را پردازش می‌کند و آن را مستقیماً به همراه APK برای کاربران ارسال می‌کند. در حین نصب، ART کامپایل AOT متدهای موجود در پروفایل را انجام می‌دهد که منجر به اجرای سریع‌تر آن متدها می‌شود. اگر پروفایل شامل متدهایی باشد که در راه‌اندازی برنامه یا در طول رندر فریم استفاده می‌شوند، کاربر ممکن است زمان راه‌اندازی سریع‌تر و jank کمتری را تجربه کند.

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

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

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

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

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

رفتار کامپایل در نسخه‌های مختلف اندروید

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

نسخه اندروید روش گردآوری رویکرد بهینه‌سازی
۵ تا ۶ (سطح API ۲۱ تا ۲۳) AOT کامل کل برنامه در حین نصب بهینه می‌شود، که منجر به زمان انتظار طولانی برای استفاده از برنامه، افزایش استفاده از رم و فضای دیسک و زمان طولانی‌تر برای بارگذاری کد از دیسک می‌شود و به طور بالقوه زمان راه‌اندازی سرد را افزایش می‌دهد.
۷ تا ۸.۱ (سطح API 24 تا ۲۷) AOT جزئی (مشخصات پایه) پروفایل‌های پایه توسط androidx.profileinstaller در اولین اجرا، زمانی که ماژول برنامه این وابستگی را تعریف می‌کند، نصب می‌شوند. ART می‌تواند با اضافه کردن قوانین پروفایل اضافی در طول استفاده از برنامه و کامپایل کردن آنها در زمانی که دستگاه بیکار است، این را بیشتر بهبود بخشد. این کار فضای دیسک و زمان بارگذاری کد از دیسک را بهینه می‌کند و در نتیجه زمان انتظار برای برنامه را کاهش می‌دهد.
۹ (سطح API 28) و بالاتر AOT جزئی (مبنا + مشخصات ابر) پلی در حین نصب برنامه از پروفایل‌های پایه برای بهینه‌سازی APK و پروفایل‌های ابری - در صورت وجود - استفاده می‌کند. پس از نصب، پروفایل‌های ART در پلی آپلود، تجمیع و سپس به عنوان پروفایل‌های ابری در هنگام نصب یا به‌روزرسانی برنامه در اختیار سایر کاربران قرار می‌گیرند.

مشکلات شناخته شده

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

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

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

  • برای ارائه موفقیت‌آمیز پروفایل‌های پایه برای کتابخانه‌ها، حداقل از افزونه Gradle پروفایل پایه ۱.۲.۳ یا AGP 8.3 ( شماره #۳۱۳۹۹۲۰۹۹ ) استفاده کنید.

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

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

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

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

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

منابع اضافی

{% کلمه به کلمه %} {% فعل کمکی %} {% کلمه به کلمه %} {% فعل کمکی %}