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

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

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

These performance enhancements directly result in improved business metrics such as user retention, transactions, and ratings. You can read more about how performance impacts business metrics in stories from Josh , Lyft , TikTok , and Zomato .

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

Baseline Profiles make all user interactions—such as app startup, navigating between screens, or scrolling through content—smoother from the first time they run. By increasing the speed and responsiveness of an app, Baseline Profiles can lead to more daily active users and a higher average return visit rate.

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

When not using a Baseline Profile, all app code is either JIT-compiled in memory after being interpreted, or written to an odex file in the background when the device is idle. After installing or updating an app, users have a suboptimal experience from the first time they run it until new code paths are optimized. Many apps measure performance boosts of about 30% after optimizing.

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

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

شروع کنید

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

تولید پروفایل در مقابل نسخه‌های منتشر شده

It is important to understand the difference in build configurations required when generating Baseline and startup profile files (for example, baseline-prof.txt and startup-prof.txt ) versus when building your final release APK that consumes these profiles.

هنگام تولید فایل‌های پروفایل (مثلاً benchmark ):

برای اطمینان از اینکه قوانین پروفایل تولید شده به طور دقیق با امضاهای متد کد شما مطابقت دارند، باید مبهم‌سازی و بهینه‌سازی (R8) را برای نوع ساخت مورد استفاده برای تولید پروفایل غیرفعال کنید. این نوع باید با نوع ساخت نسخه آزمایشی شما که مبهم‌سازی و بهینه‌سازی در آن فعال است، متفاوت باشد. شما با تنظیم isMinifyEnabled = false برای نوع ساخت تولید پروفایل به این هدف دست می‌یابید. اگر از افزونه Baseline Profile Gradle استفاده نمی‌کنید، باید مطمئن شوید که -dontobfuscate و -dontoptimize اعمال شده‌اند. افزونه Baseline Profile Gradle به طور خودکار این پیکربندی را برای شما انجام می‌دهد.

هنگام ساخت نسخه نهایی APK خود:

برای بهره‌مندی از مبهم‌سازی، کوچک‌سازی و بهینه‌سازی، نسخه آزمایشی شما باید همیشه دارای isMinifyEnabled = true باشد. R8 به طور خودکار قوانین فایل‌های پروفایل مبهم‌سازی نشده شما را بازنویسی می‌کند تا با کد مبهم‌سازی و بهینه‌سازی شده در APK نسخه شما مطابقت داشته باشد. برای اینکه بهینه‌سازی طرح‌بندی DEX (که توسط Startup Profiles هدایت می‌شود) مؤثر باشد، برنامه آزمایشی شما باید مبهم‌سازی شده و از R8 با تمام بهینه‌سازی‌های فعال استفاده کند.

The dependency chain provides stable and developmental release versions. To generate and install a Baseline Profile, use the following supported versions or higher of Android Gradle plugin, Macrobenchmark library, and Profile Installer. These dependencies are required at different times and work together as a toolchain to enable an optimal Baseline Profile.

  • افزونه‌ی گریدل اندروید: 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 ویژگی‌ها
۸.۴ Local app installations of non-debuggable builds using the Gradle wrapper command line tool or Android Studio install Baseline Profiles, so the performance of your local release build more closely matches production. This update doesn't affect production performance of Baseline Profiles.
۸.۳
  • Full source set directory support (library modules): declare multiple Baseline Profile source files, and use variant-aware directories, such as src/free/generated/baselineProfiles/baseline-prof1.txt , now for library modules as well as app modules.
  • پروفایل‌های پایه شامل کلاس‌های بدون قند هستند.
۸.۲
  • R8 rewriting of rules: D8 and R8 can transform the human-readable Baseline and Startup Profile rules to fully capture all the rules you need to optimize app performance. This lets you generate profiles from an unminified build and apply them to a minified release build. Increases Baseline Profile coverage of methods by ~30% and increases app performance by ~15%.
  • پروفایل‌های راه‌اندازی: این نوع جدید از پروفایل پایه را برای اطلاع‌رسانی در مورد طرح‌بندی کد در DEX تولید می‌کند. عملکرد راه‌اندازی را حدود ۱۵٪ یا برای برنامه‌های بزرگ به طور قابل توجهی بیشتر افزایش می‌دهد.
۸.۰ حداقل نسخه پیشنهادی: از افزونه Baseline Profile Gradle برای تولید Baseline Profiles با یک وظیفه Gradle واحد استفاده کنید.
  • Full source set directory support (app modules): declare multiple Baseline Profile source files, and use variant-aware directories, such as src/free/generated/baselineProfiles/baseline-prof1.txt .
۷.۴ حداقل نسخه پشتیبانی‌شده: برنامه‌ها می‌توانند از پروفایل‌های پایه (Baseline Profiles) کتابخانه‌ها استفاده کنند و پروفایل پایه (Baseline Profile) خود را در فایل src/main/baseline-prof.txt ارائه دهند.
  • پروفایل‌های پایه هنگام ساخت APK از یک بسته برنامه ( شماره #230361284 ) به درستی بسته‌بندی می‌شوند.
  • برای برنامه‌هایی که بیش از یک فایل .dex دارند، پروفایل‌های پایه به درستی برای فایل .dex اصلی بسته‌بندی شده‌اند.
  • D8 و R8 از تولید پروفایل‌های راه‌اندازی از ساختاری که در آن isMinifyEnabled روی false تنظیم شده است، پشتیبانی می‌کنند.

مثال تولید پروفایل

در ادامه یک کلاس نمونه برای ایجاد یک نمایه پایه برای شروع برنامه و همچنین چندین رویداد ناوبری و پیمایش با استفاده از کتابخانه پیشنهادی 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 مشاهده کنید.

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

When using Baseline Profiles in an app, you can include app startup code and common user interactions like navigation between screens or scrolling. You can also gather entire flows such as registration, login, or payment. Any user journeys that you deem critical can benefit from Baseline Profiles by improving their runtime performance.

If you are experimenting with different approaches to improve performance, consider including Baseline Profiles for both arms of your experiment. By doing this, you can make your results easier to interpret by ensuring all of your users are consistently running compiled code.

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

نحوه عملکرد پروفایل‌های پایه

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

  1. Human-readable profile rules are generated for your app and compiled into binary form in the app. You can find them in assets/dexopt/baseline.prof . You can then upload the AAB to Google Play as usual.

  2. Google Play processes the profile and ships it directly to users along with the APK. During installation, ART performs AOT compilation of the methods in the profile, resulting in those methods executing faster. If the profile contains methods used in app launch or during frame rendering, the user might experience faster launch times and reduced jank.

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

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

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

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

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

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

Android Platform versions use different app compilation approaches, each with a corresponding performance tradeoff. Baseline Profiles improve upon the previous compilation methods by providing a profile for all installs.

نسخه اندروید روش گردآوری رویکرد بهینه‌سازی
۵ تا ۶ (سطح API ۲۱ تا ۲۳) AOT کامل The entire app is optimized during install, resulting in long wait times to use the app, increased RAM and disk space usage, and longer times to load code from disk, potentially increasing cold startup times.
۷ تا ۸.۱ (سطح API 24 تا ۲۷) AOT جزئی (مشخصات پایه) Baseline Profiles are installed by androidx.profileinstaller on the first run when the app module defines this dependency. ART can improve this further by adding additional profile rules during the app's use, and compiling them when the device is idle. This optimizes for disk space and time to load code from the disk, thereby reducing wait time for the app.
۹ (سطح API 28) و بالاتر AOT جزئی (مبنا + مشخصات ابر) Play uses Baseline Profiles during app installs to optimize the APK and Cloud profiles—if available. After installation, ART profiles are uploaded to Play, aggregated, and then provided as Cloud Profiles to other users when they install or update the app.

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

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

  • Baseline Profile generation might fail due to permission settings on some devices, including OnePlus devices. To work around this, turn off the Disable permission monitoring option in the Developer Options settings.

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

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

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

  • The command to generate Baseline Profiles for all build types— ./gradlew app:generateBaselineProfile —only generates Baseline Profiles for the release build type. This issue has been fixed in AGP 8.1.

  • Non-Google-Play-Store app distribution channels might not support using Baseline Profiles at installation. Users of apps installed through these channels don't see the benefits until background dexopt runs—which is likely overnight.

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

  • Battery optimizations on some devices, such as Huawei devices, can interfere with profile installation. To help ensure that your profiles are installed effectively, disable any battery optimizations in your benchmark devices.

منابع اضافی

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