ردیابی ترکیب‌بندی

ردگیری‌ها اغلب بهترین منبع اطلاعاتی هنگام بررسی اولیه مشکل عملکرد هستند. این گزارش‌ها به شما امکان می‌دهند فرضیه‌ای درباره مشکل و اینکه از کجا باید جستجو را شروع کنید شکل دهید.

دو سطح ردیابی در Android پشتیبانی می‌شود: ردیابی سیستم و ردیابی روش.

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

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

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

ردیابی ترکیب‌بندی توابع ترکیب‌پذیر را در ردگیری‌های سیستم نشان می‌دهد. این ویژگی مزیت ردیابی سیستم با حداقل مزاحمت را به‌همراه جزئیات ردیابی روش‌ها در ترکیب‌بندی به شما ارائه می‌دهد.

راه‌اندازی ردیابی ترکیب‌بندی

برای امتحان کردن ردیابی ترکیب‌بندی در پروژه‌تان، باید حداقل به نسخه‌های زیر به‌روزرسانی کنید:

  • استودیو Android فلامینگو
  • Compose UI: 1.3.0
  • Compose Compiler: 1.3.0

دستگاه یا شبیه‌سازی که ردیابی را در آن اجرا می‌کنید باید حداقل سطح API‏ ۳۰ داشته باشد.

علاوه‌براین، باید وابستگی جدیدی به Compose Runtime Tracing اضافه کنید:

implementation("androidx.compose.runtime:runtime-tracing:1.12.1")

اگر از Compose BOM استفاده می‌کنید، لازم نیست نسخه را مشخص کنید:

val composeBom = platform("androidx.compose:compose-bom:2026.09.00")
implementation(composeBom)
// ...

// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")

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

ردیابی سیستم

برای ردیابی سیستم و دیدن ردیابی ترکیب‌بندی جدید در عمل، این مراحل را دنبال کنید:

  1. نمایه‌ساز را باز کنید:

    استودیو Android - شروع نمایه‌سازی
    شکل ۲. استودیو Android - شروع نمایه‌سازی
  2. روی خط زمان CPU کلیک کنید

    نمایه‌ساز «استودیو Android» - خط زمان واحد پردازش مرکزی
    شکل ۳. نمایه‌ساز «استودیو Android» - خط زمان CPU
  3. برنامه را به واسط کاربری‌ای که می‌خواهید ردیابی کنید هدایت کنید و سپس ردیابی سیستم و ضبط را انتخاب کنید

    گزینه‌های ردیابی - ردیابی سیستم
    شکل ۴. گزینه‌های ردیابی - ردیابی سیستم
  4. از برنامه‌تان برای ایجاد بازترکیب و توقف ضبط استفاده کنید. وقتی ردیابی پردازش شد و نمایش داده شد، اکنون باید بتوانید composable را در ردیابی ترکیب‌بندی ببینید. می‌توانید از صفحه‌کلید و موشواره برای بزرگ‌نمایی و حرکت در اطراف ردیابی استفاده کنید؛ اگر با پیمایش ردیابی آشنا نیستید، به سند ردیابی‌های ضبط مراجعه کنید.

    نمونه‌ای از دیداری‌سازی ردیابی سیستم در «استودیو Android».
    شکل ۵. ردیابی سیستم

    با دوکلیک کردن روی یک ترکیب‌پذیر در نمودار، به کد منبع آن هدایت می‌شوید.

  5. همچنین می‌توانید composable را در «نمودار شعله‌ای» به‌همراه فایل و شماره خط ببینید:

    نمونه‌ای از نمودار شعله‌ای که توابع ترکیب‌پذیر را نمایش می‌دهد.
    شکل ۶. نمودار شعله‌ای

هشدارها

هنگام استفاده از ردیابی ترکیب‌بندی، هشدارهای زیر را درباره اندازه APK و عملکرد درنظر بگیرید.

سربار اندازه APK

درحالی‌که هدف ما این بود که سربار این ویژگی را تا حد امکان به حداقل برسانیم، اندازه APK برای برنامه‌های Compose که از رشته‌های ردیابی جاسازی‌شده در APK توسط کامپایلر Compose می‌آیند افزایش می‌یابد. اگر برنامه‌تان از Compose زیاد استفاده نمی‌کند، این افزایش اندازه می‌تواند نسبتاً کوچک باشد، اما برای برنامه‌هایی که کاملاً از Compose استفاده می‌کنند، این افزایش اندازه بیشتر خواهد بود. این رشته‌های ردیابی علاوه‌براین مبهم‌سازی نشده‌اند تا بتوانند در ابزارهای ردیابی نشان داده شوند، همان‌طور که قبلاً نشان داده شد. کامپایلر Compose آن‌ها را از نسخه ۱.۳.۰ به بعد در همه برنامه‌ها تزریق می‌کند.

رشته‌های ردیابی را می‌توان با افزودن قانون Proguard زیر در ساخت تولید حذف کرد:

-assumenosideeffects public class androidx.compose.runtime.ComposerKt {

   boolean isTraceInProgress();

   void traceEventStart(int,int,int,java.lang.String);

   void traceEventStart(int,java.lang.String);

   void traceEventEnd();

}

این توابع ممکن است در آینده تغییر کنند، اما هرگونه تغییر در یادداشت‌های انتشار Compose ذکر خواهد شد.

توجه داشته باشید که نگه داشتن توابع، درحالی‌که مقداری هزینه اندازه APK را به‌همراه دارد، تضمین می‌کند که APK نمایه‌شده همان APK است که کاربران برنامه اجرا می‌کنند.

زمان‌بندی دقیق بود

برای نمایه‌سازی دقیق، مانند هر آزمایش عملکردی، باید برنامه را طبق برنامه‌های قابل‌نمایه‌سازی profileable و non-debuggable کنید.

ضبط کردن ردیابی از پایانه

می‌توان رد ترکیب‌بندی را از پایانه ضبط کرد. برای انجام این کار، باید مراحلی را که Android Studio معمولاً به‌طور خودکار برای شما انجام می‌دهد، خودتان انجام دهید.

افزودن وابستگی‌ها

ابتدا وابستگی‌های اضافی را به برنامه‌تان اضافه کنید.

implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")

تولید فرمان ضبط

  1. فرمان ضبط را بااستفاده از Perfetto تولید کنید.
  2. بخش منبع داده track_event را به‌صورت دستی طبق نمونه زیر اضافه کنید:

    adb shell perfetto \
      -c - --txt \
      -o /data/misc/perfetto-traces/trace \
    <<EOF
    buffers: {
        size_kb: 63488
        fill_policy: RING_BUFFER
    }
    buffers: {
        size_kb: 2048
        fill_policy: RING_BUFFER
    }
    data_sources: {
        config {
            name: "track_event"
        }
    }
    duration_ms: 10000
    flush_period_ms: 30000
    incremental_state_config {
        clear_period_ms: 5000
    }
    EOF

ضبط ردگیری

  1. برنامه را راه‌اندازی کنید و بخشی را که می‌خواهید ردیابی شود آماده کنید.
  2. با صدور یک پخش، ردیابی را در برنامه فعال کنید.

    # set app package variable, e.g. com.google.samples.apps.nowinandroid.debug
    # can be found through `adb shell ps -ef` or `adb shell cmd package list packages`
    package=<your app process>
    
    # issue a broadcast to enable tracing
    adb shell am broadcast \
    -a androidx.tracing.perfetto.action.ENABLE_TRACING \
    $package/androidx.tracing.perfetto.TracingReceiver
    
  3. فرمان شروع ضبط را که قبلاً ایجاد کرده‌اید بگویید.

باز کردن ردگیری

  1. adb pull <location> ردیابی از دستگاه (مکان مشخص‌شده در فرمان ضبط).

  2. در Perfetto باز کنید.

ردگیری کردن با Jetpack Macrobenchmark

می‌توانید عملکرد را با Jetpack Macrobenchmark اندازه‌گیری کنید، که ردیابی‌ها را به‌عنوان نتایج ارائه می‌دهد. برای فعال کردن ردیابی ترکیب‌بندی با macrobenchmarks، باید:

  1. این وابستگی‌های اضافی را به واحد آزمایشی Macrobenchmark اضافه کنید:

    implementation("androidx.tracing:tracing-perfetto:1.0.0")
    implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
    
  2. قبل‌از اجرای محک‌ها، آرگومان ابزارسازی androidx.benchmark.fullTracing.enable=true را اضافه کنید. برای اطلاعات بیشتر درباره آرگومان‌های ابزار Macrobenchmark، آرگومان‌های ابزار Macrobenchmark را بررسی کنید.

ردیابی بازترکیب‌بندی

ردگیری بازترکیب‌بندی، خواندن و نوشتن وضعیت را که باعث می‌شود توابع ترکیب‌پذیر در ردگیری بازترکیب‌بندی شوند، علاوه‌بر توابع ترکیب‌پذیر از ردگیری ترکیب‌بندی، به ردگیری اضافه می‌کند. این کار به شما کمک می‌کند تا متوجه شوید کدام تغییر وضعیت باعث راه‌اندازی بازترکیب شده است.

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

راه‌اندازی ردیابی بازترکیب

وابستگی به Compose Runtime Tracing نسخه ۱.۱۳.۰ یا بالاتر را به واحد برنامه خود اضافه کنید:

// Compose BOM 2026.11.00+ (runtime-tracing 1.13.0+)
implementation("androidx.compose.runtime:runtime-tracing")

دستگاه یا شبیه‌سازی که ردیابی را در آن اجرا می‌کنید باید در سطح میانای برنامه‌سازی کاربردی ۲۹ یا بالاتر باشد.

ضبط ردگیری بازترکیب

از دستورگان record_recomposition_trace.py برای ضبط رد بازترکیب از پایانه استفاده کنید.

  1. برنامه را راه‌اندازی کنید و بخشی را که می‌خواهید ردیابی شود آماده کنید.
  2. شروع ضبط:

    ./record_recomposition_trace.py -p <your app package>
  3. از برنامه‌تان برای ایجاد بازترکیب استفاده کنید، سپس Control+C را فشار دهید تا ضبط متوقف شود. برای ضبط کردن به‌مدت ثابت، مدت‌زمان را برحسب ثانیه با -t، برای مثال -t 10، ارسال کنید.

این اسکریپت ردیابی ترکیب‌بندی و ترکیب‌بندی مجدد را در برنامه فعال می‌کند، یک ردیابی سیستم را ضبط می‌کند، و سپس ردیابی را غیرفعال می‌کند و همه ردیابی‌ها را در یک فایل <package>-recompose-<timestamp>.zip در دایرکتوری فعلی ذخیره می‌کند. فایل را در Perfetto باز کنید.

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

ردیابی بازترکیب در Perfetto با نوشتن حالت انتخاب‌شده، پشته فراخوانی آن، و پیکان جریان به بازترکیبی که ایجاد کرده است.
شکل ۷. ردیابی بازترکیب در Perfetto

اسکریپت را با --help اجرا کنید تا همه گزینه‌ها را ببینید، مثلاً پیکربندی سفارشی Perfetto یا اندازه میان‌گیر ردیابی.

بازخورد

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