Theo dấu đối tượng kết hợp

Thông thường, dấu vết là nguồn thông tin hữu ích nhất trong bước đầu xem xét vấn đề về hiệu suất. Thông qua các dấu vết, bạn có thể xây dựng giả thuyết xem vấn đề đó là gì và nên bắt đầu xem xét ở đâu.

Có 2 cấp độ theo dấu được hỗ trợ trên Android: theo dấu hệ thống và theo dấu phương thức.

Do chỉ theo dõi các vùng được đánh dấu cụ thể để theo dấu, nên hoạt động theo dõi hệ thống có mức hao tổn thấp và sẽ không ảnh hưởng nhiều đến hiệu suất của ứng dụng. Theo dấu hệ thống là công cụ tuyệt vời để biết các phần cụ thể trong mã của bạn mất bao lâu để chạy.

Tính năng theo dõi phương thức theo dõi mọi lệnh gọi hàm trong ứng dụng của bạn. Tính năng này gây hao tổn lớn nên sẽ ảnh hưởng đáng kể đến hiệu suất của ứng dụng, nhưng cũng cho bạn biết hiện trạng tổng thể, các hàm được gọi và tần suất gọi.

Theo mặc định, dấu vết hệ thống không bao gồm các hàm có khả năng kết hợp riêng lẻ. Các hàm này chỉ có trong dấu vết phương thức.

Chúng tôi hiện đang thử nghiệm chức năng theo dấu hệ thống mới để hiển thị các hàm có khả năng kết hợp bên trong dấu vết hệ thống. Chức năng này mang lại cho bạn mức độ xâm nhập thấp của cấp độ theo dấu hệ thống, cùng với mức độ chi tiết cao của cấp độ theo dấu phương thức trong đối tượng kết hợp.

Thiết lập để theo dấu đối tượng kết hợp

Để dùng thử tính năng theo dấu đối tượng kết hợp lại, bạn cần cập nhật tối thiểu lên các phiên bản sau:

  • Android Studio Flamingo
  • Giao diện người dùng Compose: 1.3.0
  • Trình biên dịch Compose: 1.3.0

Thiết bị hoặc trình mô phỏng bạn dùng để chạy giả lập cũng phải có cấp độ API tối thiểu là 30.

Ngoài ra, bạn cần thêm một phần phụ thuộc mới trên tính năng Theo dõi thời gian chạy trong Compose:

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

Nếu đang sử dụng BOM Compose, bạn không cần chỉ định phiên bản:

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

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

Với phần phụ thuộc này, khi lấy một dấu vết hệ thống có chứa đối tượng kết hợp lại, bạn có thể tự động nhìn thấy các hàm có khả năng kết hợp.

Lấy dấu vết hệ thống

Để lấy dấu vết hệ thống và xem hoạt động theo dấu đối tượng kết hợp lại mới, hãy làm theo các bước sau:

  1. Mở trình phân tích tài nguyên:

    Android Studio – Bắt đầu phân tích tài nguyên
    Hình 2. Android Studio – Bắt đầu phân tích tài nguyên
  2. Nhấp vào CPU timeline (Tiến trình CPU)

    Trình phân tích tài nguyên trong Android Studio – tiến trình CPU
    Hình 3. Trình phân tích tài nguyên trong Android Studio – tiến trình CPU
  3. Điều hướng ứng dụng của bạn đến giao diện người dùng mà bạn muốn theo dấu, sau đó chọn System Trace (Dấu vết hệ thống) và Record (Ghi)

    Các tuỳ chọn về dấu vết – Dấu vết hệ thống
    Hình 4. Các tuỳ chọn về dấu vết – Dấu vết hệ thống
  4. Hãy dùng ứng dụng của bạn để kích hoạt quá trình kết hợp lại và dừng ghi. Sau khi dấu vết được xử lý và xuất hiện, bạn có thể nhìn thấy các thành phần kết hợp trong dấu vết kết hợp lại. Bạn có thể sử dụng bàn phím và chuột để thu phóng và kéo xung quanh dấu vết. Nếu bạn chưa quen với cách điều hướng dấu vết, hãy xem tài liệu Ghi dấu vết.

    Theo dấu hệ thống
    Hình 5. Theo dấu hệ thống

    Nhấp đúp vào một thành phần kết hợp trong biểu đồ để chuyển đến mã nguồn của thành phần đó.

  5. Bạn cũng có thể xem các thành phần kết hợp trong Biểu đồ hình ngọn lửa cùng với tệp và số dòng:

    Biểu đồ hình ngọn lửa
    Hình 6. Biểu đồ hình ngọn lửa

Chú ý

Mức hao tổn kích thước APK

Tuy chúng tôi muốn giảm tối đa có thể mức hao tổn của tính năng này, nhưng kích thước tệp APK sẽ tăng lên đối với các ứng dụng trong Compose xuất phát từ các chuỗi theo dấu mà trình biên dịch Compose nhúng vào tệp APK. Mức tăng kích thước này có thể tương đối nhỏ nếu ứng dụng của bạn không sử dụng nhiều Compose hoặc lớn hơn đối với các ứng dụng nằm hoàn toàn trong Compose. Ngoài ra, các chuỗi theo dấu này cũng không bị xáo trộn để có thể xuất hiện trong các công cụ theo dấu, như trình bày ở trên. Kể từ phiên bản 1.3.0, trình biên dịch Compose sẽ chèn các chuỗi này vào tất cả ứng dụng.

Bạn có thể xoá các chuỗi theo dấu trong bản dựng chính thức bằng cách thêm quy tắc Proguard sau:

-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();

}

Các hàm này có thể thay đổi trong tương lai, nhưng mọi thay đổi sẽ được đề cập trong ghi chú phát hành của Compose.

Hãy lưu ý rằng việc giữ lại các hàm đó làm tiêu tốn kích thước tệp APK, nhưng giúp đảm bảo rằng tệp APK đang được phân tích tài nguyên sẽ giống với tệp APK mà người dùng ứng dụng chạy.

Căn thời gian chính xác

Cũng giống như với mọi thử nghiệm về hiệu suất, để phân tích tài nguyên chính xác, bạn phải làm cho ứng dụng profileablenon-debuggable theo Các ứng dụng có thể phân tích tài nguyên.

Ghi lại dấu vết từ thiết bị đầu cuối

Bạn có thể ghi lại dấu vết đối tượng kết hợp qua thiết bị đầu cuối. Để làm như vậy, bạn phải thực hiện các bước mà Android Studio thường thực hiện cho bạn một cách tự động.

Thêm phần phụ thuộc

Trước tiên, hãy thêm các phần phụ thuộc bổ sung vào ứng dụng.

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

Tạo lệnh ghi

  1. Tạo lệnh ghi bằng cách tạo trong Perfetto.
  2. Thêm phần nguồn dữ liệu track_event theo cách thủ công như ví dụ sau:

    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

Ghi lại dấu vết

  1. Khởi chạy ứng dụng và chuẩn bị phần bạn muốn theo dõi.
  2. Bật tính năng theo dấu trong ứng dụng bằng cách truyền tin.

    # 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. Bắt đầu lệnh ghi mà bạn đã tạo trước đó.

Mở dấu vết

  1. adb pull <location> dấu vết từ thiết bị (vị trí được chỉ định trong lệnh ghi).

  2. Mở trong Perfetto.

Ghi lại dấu vết bằng Jetpack Macrobenchmark

Bạn có thể đo lường hiệu suất bằng Jetpack Macrobenchmark. Thư viện này cung cấp dấu vết dưới dạng kết quả. Để bật tính năng theo dõi thành phần bằng macrobenchmark, bạn cần:

  1. Thêm các phần phụ thuộc bổ sung này vào mô-đun kiểm thử Macrobenchmark:

    implementation("androidx.tracing:tracing-perfetto:1.0.0")
    implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
    
  2. Thêm đối số đo lường androidx.benchmark.fullTracing.enable=true trước khi chạy phép đo điểm chuẩn. Hãy xem phần Đối số đo lường Macrobenchmark để biết thêm thông tin về đối số đo lường Macrobenchmark.

Phản hồi

Chúng tôi rất mong nhận được ý kiến phản hồi của bạn về tính năng này, mọi lỗi bạn phát hiện được và mọi yêu cầu bạn có. Bạn có thể gửi ý kiến phản hồi cho chúng tôi qua công cụ theo dõi lỗi.