Theo dõi quá trình chuyển đổi cửa sổ bằng Winscope

Winscope là một công cụ web cho phép người dùng ghi lại, phát lại và phân tích trạng thái của một số dịch vụ hệ thống trong và sau khi tạo ảnh động và chuyển đổi. Winscope ghi lại tất cả trạng thái dịch vụ hệ thống thích hợp vào một tệp theo dõi. Khi sử dụng giao diện người dùng Winscope với tệp theo dõi, bạn có thể kiểm tra trạng thái của các dịch vụ này cho từng khung ảnh động, có hoặc không có bản ghi màn hình, bằng cách phát lại, từng bước và gỡ lỗi thông qua các quá trình chuyển đổi.

Sau đây là các dịch vụ hệ thống tạo ra dấu vết có thể tải vào Winscope:

  • SurfaceFlinger
  • WindowManager
  • WMShell
  • IME
  • Súng phóng lựu

Chạy trình xem dấu vết Winscope

Theo dõi Winscope là một phần của các dịch vụ trên nền tảng này. Phần này trình bày các bước cần thiết để tải xuống, tạo và chạy trình xem dấu vết Winscope.

Làm theo các bước sau nhằm thiết lập máy tính của bạn để chạy trình theo dõi Winscope:

  1. Tải nguồn Android xuống.
  2. Chuyển đến thư mục Winscope:

    cd development/tools/winscope
    
  3. Cài đặt phần phụ thuộc bằng:

    npm install
    

    Để xem danh sách các lệnh có sẵn, hãy chạy: npm run

  4. Tạo tất cả mục tiêu sản xuất và kiểm thử bằng cách sử dụng:

    npm run build:prod
    
  5. Chạy Winscope bằng:

    npm run start
    

Ghi lại dấu vết

Bạn có thể ghi lại dấu vết trên thiết bị thông qua Winscope hoặc thông qua các lệnh Cầu gỡ lỗi Android (adb).

Ghi lại dấu vết trên thiết bị

Ghi lại dấu vết trên thiết bị để thu thập dữ liệu khi báo cáo lỗi cho các vấn đề về ảnh động. Tất cả dấu vết giao diện người dùng đều được ghi lại bằng phương thức này, vì không thể tuỳ chỉnh cấu hình.

Trên thiết bị Android:

  1. Bật tuỳ chọn cho nhà phát triển.
  2. Chọn Theo dõi hệ thống trong Tuỳ chọn cho nhà phát triển.
  3. Bật tuỳ chọn Thu thập dấu vết Winscope.
  4. Trong phần Khác:
    1. Bật tuỳ chọn Đính kèm bản ghi vào báo cáo lỗi.
    2. Bật Hiển thị ô Cài đặt nhanh.
  5. Chuyển đến nơi bạn cần tái tạo lỗi.
  6. Để bắt đầu chụp, mở Cài đặt nhanh và chọn Ghi dấu vết:

    quick_setting_winscope

    Hình 1. Trình đơn cài đặt nhanh với tính năng Ghi lại dấu vết.

  7. Chỉ thực thi các bước cần thiết để tái tạo lỗi.

  8. Để dừng quá trình ghi lại, hãy mở phần Cài đặt nhanh rồi chọn Dừng theo dõi.

  9. Chia sẻ nhật ký đã ghi bằng một trong các tuỳ chọn được liệt kê, chẳng hạn như Gmail, Drive hoặc BetterBug.

Ghi lại dấu vết thông qua Winscope

Bạn có thể ghi lại dấu vết bằng Winscope để phát triển và gỡ lỗi cục bộ. Winscope sử dụng adb, hỗ trợ kết nối thiết bị qua USB hoặc Wi-Fi.

Trên Winscope:

  1. Trên màn hình Collect Traces (Thu thập dấu vết), hãy nhấp vào ADB Proxy (Proxy ADB):

    capture_traces_winscope

    Hình 2. Ghi lại dấu vết trên Winscope.

  2. Chạy proxy Winscope ADB Connect để ghi lại dấu vết ngay từ trình duyệt.

  3. Chạy lệnh:

    python3 $ANDROID_BUILD_TOP/development/tools/winscope/src/adb/winscope_proxy.py
    
  4. Để bắt đầu thu thập, trên màn hình Collect Traces (Thu thập dấu vết), hãy chọn mục tiêu và cấu hình rồi nhấp vào Start trace (Bắt đầu theo dõi):

    collect_traces_winscope

    Hình 3. Thu thập dấu vết trên Winscope.

  5. Để dừng quá trình ghi, hãy nhấp vào End trace (Kết thúc theo dõi):

    end_trace_winscope

    Hình 4. Kết thúc dấu vết trên Winscope.

Khi công cụ này tải các dấu vết lên giao diện người dùng của Winscope, các thông báo Tìm nạpPhân tích cú pháp tệp giao thức sẽ xuất hiện trên màn hình.

Tạo tệp kết xuất trạng thái bằng Winscope

Để tạo tệp báo lỗi trạng thái bằng Winscope, trên màn hình Collect Traces (Thu thập dấu vết), hãy chọn thẻ Dump (Tệp báo lỗi) rồi nhấp vào Dump state (Tạo tệp báo lỗi trạng thái):

dump-winscope

Hình 5. Trạng thái kết xuất trên Winscope.

Ghi lại dấu vết thông qua lệnh adb

Chạy adb root trước khi chạy các lệnh adb shell cho từng dấu vết sau. Khi quá trình theo dõi kết thúc, các tệp theo dõi sẽ có trong /data/misc/wmtrace. Để sao chép một tệp hoặc thư mục và các thư mục con của tệp đó từ một thiết bị, hãy xem phần Sao chép tệp vào và từ một thiết bị. Hãy xem adb để biết thêm thông tin.

Dấu vết WindowManager

Để ghi lại dấu vết WindowManager:

  • Bật tính năng theo dõi:

    adb shell wm tracing start
    
  • Tắt tính năng theo dõi:

    adb shell wm tracing stop
    
  • Lưu dữ liệu ghi nhật ký vào tệp trong khi chạy ghi lại dấu vết:

    adb shell wm tracing save-for-bugreport
    
  • Ghi nhật ký theo dõi một lần cho mỗi khung hình:

    adb shell wm tracing frame
    
  • Ghi lại từng giao dịch:

    adb shell wm tracing transaction
    
  • Đặt kích thước nhật ký tối đa (tính bằng KB):

    adb shell wm tracing size
    
  • In trạng thái theo dõi:

    adb shell wm tracing status
    
  • Đặt cấp độ nhật ký thành critical (chỉ các cửa sổ hiển thị có thông tin giảm thiểu), trim (tất cả các cửa sổ có thông tin giảm thiểu) hoặc all (tất cả các cửa sổ và thông tin):

    adb shell wm tracing level
    

ProtoLog

Các lệnh sau được dùng cho hệ thống ProtoLog.

Trong quy trình system_server:

  • Bắt đầu ProtoLog:

    adb shell cmd window logging start
    
  • Dừng ProtoLog:

    adb shell cmd window logging stop
    
  • Bật ProtoLog cho các nhóm nhật ký nhất định:

    adb shell cmd window logging enable [group...]
    
  • Tắt ProtoLog cho các nhóm nhật ký nhất định:

    adb shell cmd window logging disable [group...]
    
  • Bật tính năng ghi nhật ký Logcat cho các nhóm nhật ký nhất định:

    adb shell cmd window logging enable-text [group...]
    
  • Tắt tính năng ghi nhật ký Logcat cho các nhóm nhật ký nhất định:

    adb shell cmd window logging disable-text [group...]
    

Trong WMShell:

  • Khởi động ProtoLog:

    adb shell dumpsys activity service SystemUIService WMShell
    

Theo dõi chuyển đổi

Các lệnh sau được dùng để theo dõi chuyển đổi:

Trong quy trình system_server:

  • Bắt đầu theo dõi:

    adb shell cmd window shell tracing start
    
  • Dừng ghi lại dấu vết:

    adb shell cmd window shell tracing stop
    
  • Bắt đầu ghi lại dấu vết trong WMShell:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
    
  • Dừng theo dõi trong WMShell:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
    

Trình chỉnh sửa phương thức nhập

Các lệnh sau đây được dùng để theo dõi Trình chỉnh sửa phương thức nhập (IME):

  • Bắt đầu theo dõi IME cho ứng dụng Phương thức nhập (IM), Dịch vụ phương thức nhập (IMS) và Dịch vụ quản lý phương thức nhập (IMMS):

    adb shell ime tracing start
    
  • Bắt đầu theo dõi các ứng dụng IME, IMS và IMMS:

    adb shell ime tracing stop
    

Lớp SurfaceFlinger

Tính năng theo dõi lớp SurfaceFlinger sử dụng dấu vết Perfetto để ghi lại. Xem phần Cấu hình theo dõi để biết thông tin về cấu hình.

Xem ví dụ sau đây về một cấu hình cho tính năng theo dõi lớp SurfaceFlinger:

unique_session_name: "surfaceflinger_layers_active"
buffers: {
    size_kb: 63488
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.layers"
        surfaceflinger_layers_config: {
            mode: MODE_ACTIVE
            trace_flags: TRACE_FLAG_INPUT
            trace_flags: TRACE_FLAG_COMPOSITION
            trace_flags: TRACE_FLAG_HWC
            trace_flags: TRACE_FLAG_BUFFERS
            trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
        }
    }
}

Hãy xem lệnh mẫu sau đây để tạo dấu vết cho các lớp SurfaceFlinger:

adb shell -t perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \

Giao dịch trên SurfaceFlinger

Tính năng theo dõi giao dịch SurfaceFlinger sử dụng dấu vết Perfetto để ghi lại. Xem phần Cấu hình theo dõi để biết thông tin về cấu hình.

Hãy xem ví dụ sau đây về cấu hình Perfetto cho tính năng theo dõi hoạt động của SurfaceFlinger:

unique_session_name: "surfaceflinger_transactions_active"
buffers: {
    size_kb: 1024
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.transactions"
        surfaceflinger_transactions_config: {
            mode: MODE_ACTIVE
        }
    }
}
write_into_file: true
file_write_period_ms: 100

Hãy xem ví dụ sau đây về cấu hình Perfetto cho tính năng theo dõi liên tục của SurfaceFlinger:

unique_session_name: "surfaceflinger_transactions_continuous"
buffers: {
    size_kb: 1024
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.transactions"
        surfaceflinger_transactions_config: {
            mode: MODE_CONTINUOUS
        }
    }
}

Hãy xem lệnh mẫu sau đây để tạo dấu vết cho các giao dịch SurfaceFlinger:

    adb shell perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \

Tạo tệp kết xuất trạng thái bằng adb

Winscope đọc ảnh chụp nhanh về trạng thái WindowManager và SurfaceFlinger từ các báo cáo lỗi. Báo cáo lỗi lưu trữ trạng thái dưới dạng các tệp proto riêng biệt trong thư mục proto. Để tạo tệp báo lỗi trạng thái bằng adb, hãy chạy các lệnh sau.

Đối với WindowManager:

adb exec-out dumpsys window --proto > window_dump.winscope

Đối với SurfaceFlinger:

adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope

Phân tích dấu vết

Để gỡ lỗi các trạng thái tạm thời và không hợp lệ gây ra vấn đề về ảnh động, Winscope tổng hợp nhiều tệp theo dõi, cung cấp tính năng tìm kiếm và trực quan hoá trên các khung hình và tiến trình, đồng thời trình bày các thông báo protobuf một cách mạch lạc. Việc phân tích dấu vết trong Winscope giúp xác định chính xác lớp, khung và trạng thái xảy ra lỗi.

Sử dụng Winscope

Sau khi bạn đã thu thập được dấu vết, hãy phân tích các dấu vết đó trên Winscope:

  1. Tải lên các dấu vết đã lưu của bạn bằng cách sử dụng bảng điều khiển ở bên phải. Bạn có thể xóa dấu vết đã tải lên hoặc tải thêm dấu vết lên.

    nội dung tải lên

    Hình 6. Tải dấu vết lên Winscope.

  2. Nhấp vào Xem dấu vết để trực quan hóa các dấu vết đã tải lên. Các thẻ cho từng dấu vết sẽ xuất hiện ở bảng điều khiển trên cùng của cửa sổ. Nếu tệp đã tải lên chứa các dấu vết có liên quan, thì một chế độ xem nổi của dấu vết bản ghi màn hình sẽ được phủ lên màn hình.

    view_traces_winscope

    Hình 7. Xem dấu vết trên Winscope.

    Sử dụng giao diện người dùng trên bảng điều khiển trên cùng của cửa sổ để đổi tên edit_name và tải dấu vết đã tải lên download_trace xuống hoặc để tải một dấu vết mới lên.

  3. Di chuyển qua các dấu vết theo thời gian bằng công cụ thanh trượt thời gian ở bảng điều khiển dưới cùng của cửa sổ. Để di chuyển trong thời gian khác, hãy sử dụng các tính năng sau, như trong Hình 8:

    • Để chuyển đến một thời điểm hoặc lần xuất hiện cụ thể, hãy sử dụng con trỏ (thanh trượt thời gian) hoặc mũi tên arrow_left_time bên trái và arrow_right_time bên phải trong hộp hiển thị thời gian (góc dưới bên trái) hoặc mũi tên trái và phải trên bàn phím.
    • Để hiển thị dấu vết được mã hoá bằng màu đã chọn trên tiến trình, hãy sử dụng trình đơn thả xuống (bên trái thanh trượt thời gian). Theo mặc định, ba dấu vết gần đây nhất được xem bằng các thẻ dấu vết sẽ xuất hiện trên tiến trình.
    • Để xem chi tiết tất cả các dấu vết đã tải lên, hãy sử dụng công cụ phóng to thu_ phóng_trong_thời_gian hoặc thu nhỏ thời_gian_thu_nhỏ (dưới thanh trượt thời gian) hoặc di chuyển trên bàn phím. Sử dụng nút đặt lại để đặt lại mức thu phóng.
    • Để xem mở rộng tình trạng phân phối dấu vết theo thời gian, hãy nhấp vào mũi tên lên mũi_tên_lên_thời_gian (góc dưới bên phải).

    time_nav_winscope

    Hình 8. Điều hướng thời gian trên Winscope.

    Trong chế độ xem mở rộng (Hình 9), hãy chọn và phóng to các khung thời gian cụ thể để kiểm tra rõ hơn:

    mở rộng_time_winscope

    Hình 9. Mở rộng dòng thời gian trên Winscope.

  4. Để kiểm tra dấu vết, bạn có thể xem trạng thái thiết bị bằng bản ghi màn hình. Để kiểm tra một dấu vết cụ thể, hãy nhấp vào thẻ dấu vết liên quan trên bảng điều khiển trên cùng của công cụ.

    • Đối với dấu vết Surface Flinger, ba bảng điều khiển hiển thị nhiều chế độ xem khác nhau của dấu vết tại một khoảng thời gian nhất định, như minh hoạ trong Hình 10: sf_trace

      Hình 10. Dấu vết Surface Flinger trên Winscope.

      • Chế độ xem Lớp: Chế độ xem 3D về các lớp trong lớp phủ hình chữ nhật. Các phần tử sau đây trên giao diện người dùng điều chỉnh hình chữ nhật để hiển thị các phần tử đồ hoạ theo vị trí, kích thước, biến đổi và thứ tự z:

        • Thanh trượt Rotation (Xoay) (ở trên cùng bên trái của chế độ xem Layers (Lớp)) xoay các hình chữ nhật được xếp lớp để xem các hình chữ nhật đó ở các góc đã chọn.
        • Thanh trượt Khoảng cách (trên cùng bên phải của chế độ xem Lớp) điều chỉnh khoảng cách giữa các lớp để tạo chế độ xem kết hợp đã chọn.
        • Các công cụ thu phóng (trên cùng bên phải của chế độ xem Lớp) phóng to zoom_in_time và thu nhỏ thời_gian_thu_nhỏ vào các lớp để kiểm tra tốt hơn.
        • Nút đặt lại reset_sf (ở trên cùng bên phải của chế độ xem Lớp) sẽ khôi phục chế độ cài đặt máy ảnh về chế độ xem ban đầu.
        • Kéo hình chữ nhật để thu phóng hiệu quả hơn.
      • Chế độ xem Hệ phân cấp: Hệ phân cấp đầy đủ của các lớp.

        • Chỉ hiển thị (ở trên cùng bên phải của chế độ xem Hệ phân cấp), khi được chọn, sẽ ẩn các lớp không hiển thị khỏi hệ phân cấp để giúp hình dung các phần tử trên màn hình.
        • Flat (Phẳng) (ở trên cùng bên phải của chế độ xem Hệ phân cấp), khi được chọn, sẽ hiển thị hệ phân cấp dưới dạng danh sách các lớp được làm phẳng.
        • Bạn chỉ có thể chọn Show diff (Hiện sự khác biệt) (ở trên cùng bên trái của chế độ xem Hệ phân cấp) khi có quá trình chuyển đổi trạng thái. Khi được chọn, công cụ này sẽ so sánh trạng thái hiện tại với trạng thái trước đó. Phần tử mới được làm nổi bật bằng màu xanh lục, phần tử đã xoá được làm nổi bật bằng màu đỏ và phần tử đã sửa đổi được làm nổi bật bằng màu xanh dương.
      • Chế độ xem Properties (Thuộc tính): Thuộc tính của lớp đã chọn. Bảng điều khiển trên cùng của chế độ xem Properties (Thuộc tính) chỉ chứa thông tin về các thuộc tính chính, chẳng hạn như Visibility (Khả năng hiển thị), Geometry (Hình học) và Buffer (Vùng đệm). Bảng điều khiển dưới cùng của khung hiển thị Properties (Thuộc tính) chứa một Proto Dump (Tệp kết xuất Proto) của tất cả các thuộc tính.

        • Hộp đánh dấu Show Diff (Hiện sự khác biệt) (ở trên cùng bên trái của chế độ xem Thuộc tính) hoạt động giống như trong chế độ xem Hierarchy (Hệ phân cấp).
        • Hiển thị giá trị mặc định (ở trên cùng bên trái của chế độ xem Thuộc tính), khi được chọn, sẽ hiển thị các giá trị proto mặc định trên Tệp kết xuất proto. Theo mặc định, các giá trị này không được liệt kê trong Tệp kết xuất Proto. Các giá trị proto mặc định được lấy từ định nghĩa trường proto. Nếu một trường proto không có tập giá trị mặc định không rỗng, thì giá trị proto mặc định sẽ hiển thị là:
          • Chuỗi: Null
          • Số: 0
          • Giá trị boolean: False
          • Đối tượng: Rỗng

      Lựa chọn giữa 3 khung hiển thị và bản ghi màn hình sẽ được đồng bộ hoá, tức là tất cả dấu vết đều cập nhật đồng bộ khi bạn điều hướng đến một thời điểm khác. Để xem các thuộc tính của một lớp, hãy chọn lớp đó bằng cách nhấp vào lớp đó trong chế độ xem Phân cấp hoặc nhấp vào hình chữ nhật tương ứng trong chế độ xem Thuộc tính. Hình chữ nhật màu tím cho biết một dấu vết khung hiển thị được đính kèm vào lớp này. Khi nhấp đúp vào một lớp màu tím, giao diện người dùng sẽ chuyển sang thẻ theo dõi khung hiển thị có liên quan.

    • Đối với dấu vết Trình quản lý cửa sổ, ba bảng hiển thị các chế độ xem khác nhau của dấu vết tại một khoảng thời gian nhất định, như trong Hình 11:

      • Chế độ xem Windows (Cửa sổ): Chế độ xem 3D của các lớp.
      • Chế độ xem thứ bậc: Một hệ phân cấp đầy đủ của các lớp.
      • Chế độ xem Properties (Thuộc tính) chứa một tệp Proto Dump (Tệp kết xuất Proto) của tất cả thuộc tính.

      Lựa chọn giữa 3 khung hiển thị và bản ghi màn hình sẽ được đồng bộ hoá, tức là tất cả dấu vết đều cập nhật đồng bộ khi bạn điều hướng đến một thời điểm khác.

      wm_trace

      Hình 11. Theo dõi Trình quản lý cửa sổ trên Winscope.

    • Đối với dấu vết Giao dịch, các giao dịch giữa Surface Flinger và Trình quản lý cửa sổ được trình bày ở định dạng bảng, có thể tìm kiếm theo mã nhận dạng, loại và văn bản hiển thị, cùng với chế độ xem thuộc tính cho thấy tệp báo lỗi proto. Lựa chọn giữa hai chế độ xem và bản ghi màn hình được đồng bộ hoá:

      transaction_trace

      Hình 12. Dấu vết giao dịch trên Winscope.

    • Đối với dấu vết ProtoLog, thông tin được trình bày ở định dạng bảng có thể tìm kiếm được theo thẻ, tệp nguồn và văn bản:

      protolog_trace

      Hình 13. Dấu vết ProtoLog trên Winscope.

    • Đối với dấu vết Transitions (Chuyển đổi), một danh sách các lượt chuyển đổi có mã nhận dạng, loại, thời gian gửi, thời lượng và trạng thái sẽ được hiển thị cùng với các thuộc tính của lượt chuyển đổi đã chọn:

      transitions_trace

      Hình 14. Dấu vết chuyển đổi trên Winscope.