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 hoạt ảnh và chuyển tiếp. Winscope ghi lại tất cả các trạng thái dịch vụ hệ thống thích hợp vào một tệp theo dõi. 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 hình động, có hoặc không có bản ghi màn hình, bằng cách phát lại, thực hiện từng bước và gỡ lỗi thông qua các chuyển đổi.

Các dịch vụ hệ thống tạo ra dấu vết có thể tải được vào Winscope như sau:

  • bề mặtFlinger
  • Trình quản lý cửa sổ
  • WMShell
  • IME
  • Trình khởi chạy

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

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

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

  1. Tải xuống nguồn Android .
  2. Điều hướng đến thư mục Winscope:

    cd development/tools/winscope
    
  3. Cài đặt phụ thuộc bằng cách sử dụng:

    npm install
    

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

  4. Xây dựng tất cả các mục tiêu sản phẩm và thử nghiệm bằng cách sử dụng:

    npm run build:prod
    
  5. Chạy Winscope bằng cách sử dụ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 lỗi cho các vấn đề về hoạt ảnh. Tất cả dấu vết giao diện người dùng đều được ghi lại bằng phương pháp này vì không thể tùy chỉnh cấu hình.

Trên thiết bị Android của bạn:

  1. Bật tùy chọn nhà phát triển .
  2. Chọn Theo dõi hệ thống trong Tùy chọn nhà phát triển .
  3. Bật Thu thập dấu vết Winscope .
  4. Dưới mục Khác :
    1. Bật Đí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. Điều hướng đến nơi bạn cần tái tạo lỗi.
  6. Để bắt đầu chụp, hãy mở Cài đặt nhanh và chọn Ghi dấu vết :

    quick_setting_winscope

    Hình 1. Menu cài đặt nhanh với Record Trace.

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

  8. Để dừng chụp, hãy mở Cài đặt nhanh và chọn Dừng theo dõi .

  9. Chia sẻ nhật ký đã ghi bằng một trong các tùy 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 Thu thập dấu vết , nhấp vào ADB Proxy :

    capture_traces_winscope

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

  2. Khởi chạy proxy Winscope ADB Connect để ghi lại dấu vết trực tiếp từ trình duyệt của bạn.

  3. Chạy lệnh:

    python3 $ANDROID_BUILD_TOP/development/tools/winscope/src/adb/winscope_proxy.py
    
  4. Để bắt đầu chụp, trên màn hình Thu thập dấu vết , chọn mục tiêu và cấu hình rồi nhấp vào 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 chụp, nhấp vào Kết thúc dấu vết :

    end_trace_winscope

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

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

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

Để thực hiện kết xuất trạng thái bằng Winscope, trên màn hình Thu thập dấu vết , chọn tab Kết xuất và sau đó nhấp vào Kết xuất 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 lệnh adb shell cho từng dấu vết sau. Ở cuối dấu vết, các tệp dấu vết có sẵn 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 nó từ một thiết bị, hãy xem Sao chép tệp vào và từ một thiết bị . Xem adb để biết thêm thông tin.

Dấu vết của WindowManager

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

  • Kích hoạt theo dõi:

    adb shell wm tracing start
    
  • Vô hiệu hóa dấu vết:

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

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

    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
    
  • Trạng thái dấu vết in:

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

    adb shell wm tracing level
    

Nhật ký nguyên mẫu

Các lệnh sau được sử 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 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:

  • Bắt đầu ProtoLog:

    adb shell dumpsys activity service SystemUIService WMShell
    

Truy tìm chuyển tiếp

Các lệnh sau được sử dụng để theo dõi quá trình chuyển đổi:

Trong quy trình system_server :

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

    adb shell cmd window shell tracing start
    
  • Dừng một dấu vết:

    adb shell cmd window shell tracing stop
    
  • Bắt đầu theo dõi trong WMShell:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
    
  • Dừng dấu vết 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 được sử dụng để theo dõi Trình soạn phương thức nhập liệu (IME):

  • Bắt đầu theo dõi IME cho các máy khách 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 truy tìm ứng dụng khách IME, IMS và IMMS:

    adb shell ime tracing stop
    

Lớp SurfaceFlinger

Theo dõi lớp SurfaceFlinger sử dụng dấu vết Perfetto để chụp. Xem Cấu hình theo dõi để biết thông tin cấu hình.

Xem ví dụ sau về cấu hình để 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
        }
    }
}

Xem lệnh ví dụ sau để 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 SurfaceFlinger

Theo dõi giao dịch SurfaceFlinger sử dụng dấu vết Perfetto để chụp. Xem Cấu hình theo dõi để biết thông tin cấu hình.

Xem ví dụ sau về cấu hình Perfetto để theo dõi hoạt động 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

Xem ví dụ sau về cấu hình Perfetto để theo dõi liên tục 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
        }
    }
}

Xem lệnh ví dụ sau để tạo theo dõi cho các giao dịch SurfaceFlinger:

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

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

Winscope đọc ảnh chụp nhanh 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ữ các trạng thái dưới dạng các tệp proto riêng biệt trong thư mục proto . Để tạo kết xuất trạng thái bằng adb, hãy chạy các lệnh sau.

Đối với Trình quản lý cửa sổ:

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 nhất thời và không hợp lệ gây ra sự cố hoạt ảnh, Winscope tổng hợp các tệp theo dõi khác nhau, cung cấp khả năng tìm kiếm và trực quan hóa trên các khung và dòng thời gian, đồng thời trình bày các thông báo protobuf một cách mạch lạ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

Khi đã bắt được dấu vết , hãy phân tích dấu vết trên Winscope:

  1. Tải lên dấu vết đã lưu của bạn bằ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 lên nhiều dấu vết hơn.

    upload_traces_winscope

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

  2. Nhấn vào Xem dấu vết để hiển thị dấu vết đã tải lên. Các tab cho mỗi dấu vết xuất hiện ở bảng 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 liên quan thì chế độ xem nổi của dấu vết 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 trên cùng của cửa sổ để đổi tênchỉnh sửa tên và tải xuống dấu vết đã tải lên của bạntải_dấu vết hoặc để tải lên một cái mới.

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

    • Để điều hướng đến một thời điểm hoặc sự kiện cụ thể, hãy sử dụng con trỏ (thanh trượt thời gian) hoặc phím tráimũi tên_left_time và phảimũi tên_right_time mũi tên 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 của bạn.
    • Để hiển thị các dấu vết được mã hóa màu đã chọn trên dòng thời gian, hãy sử dụng menu thả xuống (bên trái thanh trượt thời gian). Theo mặc định, ba dấu vết cuối cùng được xem bằng tab dấu vết sẽ được hiển thị trên dòng thời gian.
    • Để xem chi tiết tất cả dấu vết đã tải lên, hãy sử dụng chức năng phóng tothu phóng_in_time hoặc thu nhỏzoom_out_time công cụ (dưới thanh trượt thời gian) hoặc cuộn trên bàn phím của bạn. Sử dụng nút đặt lại để đặt lại mức thu phóng.
    • Để có chế độ xem mở rộng về phân bổ dấu vết theo thời gian, hãy nhấp vào mũi tên lênmũi tên_up_time (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), chọn và phóng to các khung thời gian cụ thể để kiểm tra tốt hơn:

    expand_time_winscope

    Hình 9. Dòng thời gian mở rộng 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 tab dấu vết có liên quan trên bảng trên cùng của công cụ.

    • Đối với dấu vết Surface Flinger , 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 10:sf_trace

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

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

        • Thanh trượt Xoay (trên cùng bên trái của chế độ xem Lớp) xoay các hình chữ nhật được xếp lớp để xem chúng ở 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 tổng 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 tothu phóng_in_time và thu nhỏzoom_out_time vào các lớp để kiểm tra tốt hơn.
        • Nút đặt lạiđặt lại_sf (trên cùng bên phải của chế độ xem Lớp) khôi phục cài đặt camera về chế độ xem ban đầu.
        • Kéo các hình chữ nhật để thu phóng tốt hơn.
      • Chế độ xem phân cấp : Một hệ thống 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 Thứ bậc), khi được chọn, sẽ ẩn các lớp vô hình khỏi cấu trúc phân cấp để giúp trực quan hóa các thành phần trên màn hình.
        • Flat (trên cùng bên phải của chế độ xem Thứ bậc), khi được chọn, hiển thị thứ bậc dưới dạng danh sách các lớp được làm phẳng.
        • Hiển thị khác biệt (trên cùng bên trái của chế độ xem Thứ bậc) chỉ được chọn khi có chuyển đổi trạng thái. Khi được chọn, công cụ 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 đánh dấu bằng màu xanh lục, phần tử đã xóa được đánh dấu bằng màu đỏ và phần tử đã sửa đổi được đánh dấu bằng màu xanh lam.
      • Chế độ xem thuộc tính : Thuộc tính của lớp đã chọn. Bảng trên cùng của chế độ xem Thuộc tính chỉ chứa thông tin về các thuộc tính chính, chẳng hạn như Khả năng hiển thị , Hình họcBộ đệm . Bảng dưới cùng của chế độ xem Thuộc tính chứa Kết xuất Proto của tất cả các thuộc tính.

        • Hộp kiểm Hiển thị 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 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ị nguyên mẫu mặc định trên Kết xuất Proto. Theo mặc định, các giá trị này không được liệt kê trong 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 trường proto không có bộ giá trị mặc định không rỗng thì các giá trị proto mặc định được hiển thị là:
          • Dây: Không
          • Số: 0
          • Giá trị Boolean: Sai
          • Các đối tượng: Không

      Lựa chọn giữa ba chế độ xem và bản ghi màn hình được đồng bộ hóa, nghĩa là tất cả cá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 Thứ bậc hoặc bằng cách 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 biểu thị rằng dấu vết chế độ xem được gắn vào lớp này. Khi nhấp đúp vào lớp màu tím, giao diện người dùng sẽ điều hướng để thay đổi sang tab theo dõi chế độ xem có liên quan.

    • Đối với dấu vết của 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 : Chế độ xem 3D của các lớp.
      • Chế độ xem phân cấp : Một hệ thống phân cấp đầy đủ của các lớp.
      • Chế độ xem thuộc tính chứa Proto Dump của tất cả các thuộc tính.

      Lựa chọn giữa ba chế độ xem và bản ghi màn hình được đồng bộ hóa, nghĩa là tất cả cá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. Dấu vết của Window Manager trên Winscope.

    • Đối với dấu vết Giao dịch , các giao dịch giữa Surface Flinger và Window Manager được trình bày ở định dạng bảng có thể tìm kiếm theo ID, loại và văn bản được hiển thị, cùng với dạng xem thuộc tính hiển thị kết xuất proto. Lựa chọn giữa hai chế độ xem và ghi màn hình được đồng bộ hóa:

      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 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 Chuyển tiếp , danh sách chuyển tiếp có ID, loại, thời gian gửi, thời lượng và trạng thái được hiển thị cùng với các thuộc tính của chuyển đổi đã chọn:

      transitions_trace

      Hình 14. Dấu vết chuyển tiếp trên Winscope.