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.

Vì tính năng theo dõi hệ thống chỉ theo dõi các khu vực được đánh dấu cụ thể để theo dõi, nên tính năng này đã mức hao tổn thấp và 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 tìm dấu vết phương thức theo dõi mọi lệnh gọi hàm trong ứng dụng của bạn. Việc này rất tốn kém và do đó ảnh hưởng lớn đến hiệu suất của ứng dụng, nhưng cũng mang lại cho bạn hình ảnh về điều gì đang xảy ra, những chức năng được gọi và tần suất chúng sẽ được 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.0.0-beta01")

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 process (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. Trình biên dịch Compose chèn chúng vào tất cả bắt đầu từ phiên bản 1.3.0.

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. Chạy ứng dụng và chuẩn bị phần mà 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 kết hợp 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. Kiểm tra khả năng đo lường Macrobenchmark đối số để biết thêm thông tin về Macrobenchmark đối số đo lường.

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.