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 cũng như hiệu ứng chuyển đổi. Winscope ghi lại tất cả các trạng thái dịch vụ hệ thống liên quan 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 các chuyển đổi.

Dấu vết được hỗ trợ

Winscope có khả năng thu thập và trình bày trực quan nhiều dấu vết hoặc trình tự trạng thái dịch vụ hệ thống. Bạn có thể định cấu hình các dấu vết này cho phù hợp với các trường hợp sử dụng cụ thể, từ mức hao tổn thấp đến mức chi tiết cao. Winscope hỗ trợ các dấu vết sau:

  • EventLog: Thu thập bản ghi sự kiện chẩn đoán hệ thống bằng cách sử dụng EventLog. Trong Winscope, thông tin này chỉ được dùng để xác định và hiển thị các dấu CUJ.
  • IME: Theo dõi các sự kiện từ quy trình Trình chỉnh sửa phương thức nhập (IME), bao gồm cả IMS, IMMS và IME Client.
  • Đầu vào: Theo dõi các sự kiện đầu vào từ nhiều phần của quy trình sự kiện đầu vào.
  • ProtoLog: Thu thập thông báo ProtoLog từ các dịch vụ hệ thống và mã của các dịch vụ hệ thống đang chạy trong các quy trình của ứng dụng.
  • Ghi màn hình: Thu thập bản ghi màn hình cùng với dấu vết.
  • Chuyển đổi vỏ: Ghi lại thông tin chi tiết về hệ thống chuyển đổi hoạt động và cửa sổ.
  • SurfaceFlinger: Thu thập dấu vết SurfaceFlinger chứa thông tin về các bề mặt (lớp) như vị trí, vùng đệm và thành phần.
  • Giao dịch: Theo dõi tập hợp các thay đổi nguyên tử mà SurfaceFlinger nhận được bằng cách sử dụng SurfaceControl cho thành phần.
  • ViewCapture: Ghi lại một loạt thuộc tính của tất cả thành phần hiển thị từ các Cửa sổ hệ thống hỗ trợ ViewCapture, chẳng hạn như Giao diện người dùng hệ thống và Trình chạy.
  • Trình quản lý cửa sổ: Theo dõi trạng thái của Trình quản lý cửa sổ chứa thông tin chi tiết liên quan đến cửa sổ, bao gồm cả sự kiện đầu vào và tiêu điểm, hướng màn hình, hiệu ứng chuyển đổi, ảnh động, vị trí và phép biến đổi.

Tệp báo lỗi được hỗ trợ

Winscope có thể thu thập và hiển thị tệp báo lỗi trạng thái, đây là ảnh chụp nhanh về trạng thái của thiết bị được chụp tại những thời điểm cụ thể do người dùng xác định. Không giống như dấu vết, được thu thập liên tục trong quá trình sử dụng thiết bị và có thể ảnh hưởng đến hiệu suất, tệp báo lỗi chỉ được lấy tại những thời điểm do người dùng xác định, đảm bảo hiệu suất và độ chi tiết không bị ảnh hưởng. Điều này cho phép phân tích trạng thái của thiết bị một cách tập trung và hiệu quả hơn tại các thời điểm cụ thể. Winscope hỗ trợ các tệp báo lỗi sau:

  • Trình quản lý cửa sổ: Kết xuất một trạng thái Trình quản lý cửa sổ.
  • SurfaceFlinger: Kết xuất một ảnh chụp nhanh SurfaceFlinger.
  • Ảnh chụp màn hình: Thu thập ảnh chụp màn hình cùng với tệp báo lỗi.

Tài nguyên

Hãy xem phần Chạy Winscope để biết thông tin về cách tạo và chạy Winscope.

Hãy xem phần Ghi lại dấu vết để biết thông tin về cách thu thập dấu vết.

Hãy xem phần Tải dấu vết để biết thông tin về cách tải dấu vết bằng giao diện người dùng Winscope trên web.

Hãy xem phần Phân tích dấu vết để biết thông tin về cách phân tích dấu vết.

Ví dụ

Ví dụ sau đây mô tả cách gỡ lỗi kiểm thử hiện tượng nhấp nháy và lỗi do người dùng báo cáo.

Không kiểm tra được hiện tượng nhấp nháy

Ví dụ này minh hoạ cách sử dụng Winscope để gỡ lỗi kiểm thử hiện tượng nhấp nháy không thành công.

Kiểm tra lỗi kiểm thử

Hãy làm theo các bước sau để xác định loại vấn đề và kiểm tra thông báo lỗi kiểm thử.

  1. Xác định loại vấn đề bằng cách kiểm tra tên kiểm thử và tên lớp.

    Tên kiểm thử và tên lớp:

    FlickerTestsNotification com.android.server.wm.flicker.notification.OpenAppFromLockscreenNotificationColdTest#appLayerBecomesVisible[ROTATION_0_GESTURAL_NAV]
    

    Loại sự cố:

    • CUJ đề cập đến việc chạy một ứng dụng từ thông báo trên màn hình khoá (OpenAppFromLockscreenNotificationColdTest).

    • Kiểm thử dự kiến ứng dụng sẽ hiển thị (#appLayerBecomesVisible).

  2. Kiểm tra thông báo lỗi kiểm thử. Thông báo này cung cấp thông tin toàn diện về lỗi, bao gồm:

    • So sánh giữa kết quả dự kiến và kết quả thực tế có thể nhìn thấy
    • Dấu thời gian giúp xác định thời điểm xảy ra lỗi
    • Tên của cấu phần phần mềm hoặc tệp liên kết với lỗi
    • Thông tin theo bối cảnh bổ sung liên quan đến việc hiểu và gỡ lỗi lỗi
    android.tools.flicker.subject.exceptions.IncorrectVisibilityException: com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity# should be visible
    
    Where?
        Timestamp(UNIX=2024-05-10T11:04:14.227572545(1715339054227572545ns), UPTIME=37m21s184ms79178ns(2241184079178ns), ELAPSED=0ns)
    
    What?
        Expected: com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#
        Actual: [e636ecd com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3457: Buffer is empty, Visible region calculated by Composition Engine is empty, com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458: Visible region calculated by Composition Engine is empty]
    
    Other information
        Artifact: FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV.zip
    
    Check the test run artifacts for trace files
    
        at android.tools.flicker.subject.layers.LayerTraceEntrySubject.isVisible(LayerTraceEntrySubject.kt:187)
        at android.tools.flicker.subject.layers.LayersTraceSubject$isVisible$1$1.invoke(LayersTraceSubject.kt:151)
        at android.tools.flicker.subject.layers.LayersTraceSubject$isVisible$1$1.invoke(LayersTraceSubject.kt:150)
        at android.tools.flicker.assertions.NamedAssertion.invoke(NamedAssertion.kt:32)
        at android.tools.flicker.assertions.CompoundAssertion.invoke(CompoundAssertion.kt:42)
        at android.tools.flicker.assertions.AssertionsChecker.test(AssertionsChecker.kt:79)
        at android.tools.flicker.subject.FlickerTraceSubject.forAllEntries(FlickerTraceSubject.kt:59)
        at android.tools.flicker.assertions.AssertionDataFactory$createTraceAssertion$closedAssertion$1.invoke(AssertionDataFactory.kt:46)
        at android.tools.flicker.assertions.AssertionDataFactory$createTraceAssertion$closedAssertion$1.invoke(AssertionDataFactory.kt:43)
        at android.tools.flicker.assertions.AssertionDataImpl.checkAssertion(AssertionDataImpl.kt:33)
        at android.tools.flicker.assertions.ReaderAssertionRunner.doRunAssertion(ReaderAssertionRunner.kt:35)
        at android.tools.flicker.assertions.ReaderAssertionRunner.runAssertion(ReaderAssertionRunner.kt:29)
        at android.tools.flicker.assertions.BaseAssertionRunner.runAssertion(BaseAssertionRunner.kt:36)
        at android.tools.flicker.legacy.LegacyFlickerTest.doProcess(LegacyFlickerTest.kt:59)
        at android.tools.flicker.assertions.BaseFlickerTest.assertLayers(BaseFlickerTest.kt:89)
        at com.android.server.wm.flicker.notification.OpenAppTransition.appLayerBecomesVisible_coldStart(OpenAppTransition.kt:51)
        at com.android.server.wm.flicker.notification.OpenAppFromNotificationColdTest.appLayerBecomesVisible(OpenAppFromNotificationColdTest.kt:64)
    

    Mẫu đầu ra này cho biết những điều sau:

    • Vấn đề xảy ra ở 2024-05-10T11:04:14.227572545.

    • NotificationActivity dự kiến sẽ hiển thị nhưng không phải vậy.

    • Tên của tệp cấu phần phần mềm chứa dấu vết gỡ lỗi là FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV.

Gỡ lỗi

Hãy làm theo các bước sau để xác định nguyên nhân gây ra hiện tượng nhấp nháy:

  1. Tải tệp theo dõi xuống và tải các tệp đó trong Winscope. Winscope mở bằng SurfaceFlinger được chọn tự động:

    Trang đích Winscope có chế độ xem SurfaceFlinger

    Hình 1. Trang đích Winscope có chế độ xem SurfaceFlinger.

  2. Chuyển đến dấu thời gian xảy ra sự cố bằng cách sao chép và dán dấu thời gian từ thông báo ngoại lệ vào trường dấu thời gian. Bạn có thể sao chép dấu thời gian ở định dạng có thể đọc được (2024-05-10T11:04:14.227572545) rồi dán vào trường đầu tiên hoặc sao chép dấu thời gian ở nano giây (1715339054227572545ns) rồi dán vào trường thứ hai.

    Hộp thoại Dấu thời gian

    Hình 2. Hộp thoại Dấu thời gian.

  3. Nhấn phím mũi tên trái để chuyển đến khung trước. Ở trạng thái này, ứng dụng NotificationActivity hiển thị chính xác trong video và cả ứng dụng và màn hình chờ đều hiển thị, được biểu thị bằng các hình chữ nhật màu xanh lục trong chế độ xem 3D và khối V trên các phần tử hệ phân cấp.

    Tên ứng dụng và bề mặt màn hình chờ là:

    com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
    
    Splash Screen com.android.server.wm.flicker.testapp#3453
    

    Điều này cho biết rằng ứng dụng đang khởi chạy khi màn hình chuyển sang màu đen và sự kiện này đang diễn ra trong quá trình khởi chạy ứng dụng, vì màn hình chờ vẫn hiển thị:

    Khi khởi chạy ứng dụng

    Hình 3. Khi khởi chạy ứng dụng.

  4. Nhấn phím mũi tên phải để quay lại khung hình tiếp theo, nơi xảy ra hiện tượng nhấp nháy. Trong chế độ xem rects, NotificationShade sẽ hiển thị trên màn hình thay vì ứng dụng. Các nền tảng sau đây sẽ hiển thị trong khung này:

    • Lớp phủ trang trí màn hình (trên cùng và dưới cùng)
    • Thanh điều hướng
    • Vị trí con trỏ (từ bản ghi màn hình)

      Hoạt động nhấp nháy

      Hình 4. Hoạt động nhấp nháy.

  5. Chọn hoạt động của ứng dụng trong chế độ xem hệ thống phân cấp. Nếu bạn không tìm thấy, hãy tắt tuỳ chọn Chỉ hiển thị V. Sau đó, hãy kiểm tra chế độ xem thuộc tính.

    Tên giao diện ứng dụng là:

    com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
    

    Thuộc tính ứng dụng

    Hình 5. Thuộc tính ứng dụng.

    Mặc dù hoạt động của ứng dụng được đặt thành hiển thị và mờ, nhưng giao diện không xuất hiện do lỗi Invisible due to: null visible region. Điều này xảy ra vì một bề mặt mờ khác được đặt trước nó trong quá trình kết hợp. Giả thuyết này bắt nguồn từ hình chữ nhật NotificationShade ở phía trước hình chữ nhật NotificationActivity trong chế độ xem 3D và NotificationShade hiển thị (màu xanh lục) có thể là lớp đã chọn.

  6. Để xác thực giả thuyết này, hãy chọn nền tảng NotificationShade hiển thị trên khung hiện tại và kiểm tra các thuộc tính của nền tảng đó. Các cờ được đặt thành OPAQUE|ENABLE_BACKPRESSURE (0x102). Tên bề mặt NotificationShadeNotificationShade#3447. Tiếp theo, hãy nhấn mũi tên trái để quay lại khung trước (trước khi nhấp nháy) và kiểm tra lại các thuộc tính của nền tảng NotificationShade. Lưu ý rằng thay vì OPAQUE, nền tảng này chỉ có cờ ENABLE_BACKPRESSURE (0x100). Điều này xác nhận rằng NotificationShade trở nên mờ trước khi quá trình khởi chạy ứng dụng hoàn tất. Vì NotificationShade nằm trước NotificationActivity, nên ứng dụng không hiển thị. NotificationShade có màu đen, vì vậy màn hình sẽ chuyển sang màu đen trong giây lát, gây ra hiện tượng nhấp nháy.

  7. Xác định trong mã lý do NotificationShade trở nên mờ quá sớm.

Lỗi do người dùng báo cáo

Rất khó để gỡ lỗi các lỗi do người dùng báo cáo vì các lỗi này thường thiếu thông tin chi tiết. Không giống như các lỗi kiểm thử nhấp nháy cung cấp dấu thời gian, thông tin chi tiết về phần tử và bản ghi màn hình cụ thể, các lỗi do người dùng báo cáo thường chỉ bao gồm nội dung mô tả ngắn gọn về vấn đề.

Trong nghiên cứu điển hình của chúng tôi, thông tin duy nhất được cung cấp là tiêu đề Màn hình nhấp nháy khi mở lại ứng dụng từ chế độ chia đôi màn hình và dấu thời gian gần đúng là 18/4/2024 3:51 chiều GMT-04:00.

Hãy làm theo các bước sau để gỡ lỗi một lỗi do người dùng báo cáo:

  1. Tải tệp theo dõi trong Winscope. Winscope mở ra với SurfaceFlinger được tự động chọn.

    Trang đích Winscope có chế độ xem SurfaceFlinger

    Hình 6. Trang đích Winscope có chế độ xem SurfaceFlinger.

  2. Chuyển đến dấu thời gian gần đúng do người dùng báo cáo, trong trường hợp này là 3:50 PM GMT-04:00, bằng cách nhập 15:50:00 vào trường dấu thời gian mà con người có thể đọc được.

    Hộp thoại Dấu thời gian

    Hình 7. Hộp thoại Dấu thời gian.

  3. Sử dụng thành phần hiển thị rects để xác định nội dung được vẽ trên màn hình. Để có chế độ xem tốt hơn, hãy sử dụng thanh trượt Rotation (Xoay) để thay đổi phối cảnh của các hình chữ nhật. Bằng cách đánh dấu Chỉ hiển thị VPhẳng trong chế độ xem Hệ phân cấp, bạn sẽ thấy hình nền, lớp phủ trang trí màn hình, hòm thư, trình chạy, người liên hệ và màn hình quay số.

    Tên gói là:

    • Trình chạy: com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity#40602

    • Danh bạ: com.google.android.contacts/com.android.contacts.activities.PeopleActivity#40565

    • Trình quay số: com.google.android.dialer/com.google.android.dialer.extensions.GoogleDialtactsActivity#40564

    Ngoài các bề mặt hiển thị (hình chữ nhật màu xanh lục), một hình chữ nhật màu xám đại diện cho bề mặt khu vực hiển thị có tên là Màn hình không xác định sẽ xuất hiện. Để cải thiện khả năng hiển thị, hãy nhấp vào biểu tượng (biểu tượng chế độ hiển thị) bên cạnh nền tảng ScreenDecorHwcOverlay#64 để ẩn hình chữ nhật tương ứng và hiển thị các nền tảng phía sau. Chúng tôi xoá lớp phủ cho mục đích phân tích vì người dùng không nhìn thấy lớp phủ này và lớp phủ này sẽ không được báo cáo là ảnh động nhấp nháy.

    Báo cáo người dùng

    Hình 8. Báo cáo người dùng.

  4. Sau khi bạn xác định được những nền tảng nào có liên quan đến chế độ xem màn hình phân tách, hãy sử dụng tính năng theo dõi Hiệu ứng chuyển đổi để thực hiện các thao tác khác nhau của người dùng và tìm thấy hiện tượng nhấp nháy. Nhấp vào thẻ Transitions (Hiệu ứng chuyển đổi) trong Winscope để xem hình ảnh danh sách hiệu ứng chuyển đổi đã phát:

    hiệu ứng chuyển cảnh

    Hình 9. Hiệu ứng chuyển cảnh.

    Hiệu ứng chuyển đổi phát trong khung này được đánh dấu màu xanh dương. Trong trường hợp này, các cờ chuyển đổi bao gồm TRANSIT_FLAG_IS_RECENTS, cho biết người dùng đang chuyển đến màn hình gần đây.

  5. Nhấp vào đường liên kết trên cột Dispatch Time (Thời gian gửi) (trong trường hợp này là 2024-04-18, 15:50:57.205) để chuyển đến thời điểm đó và xác minh các hình chữ nhật trong thẻ Surface Flinger (Trình chuyển đổi giao diện). Xác nhận trạng thái của thiết bị là chính xác trong quá trình chuyển đổi bằng cách thực hiện chuyển đổi bằng phím mũi tên phải và quan sát các hình chữ nhật.

    Trình chạy xuất hiện vào lúc 15:50:57.278, nhưng ảnh động không bắt đầu vào thời điểm đó. Hình nền đã hiển thị vì không có gì được vẽ giữa các ứng dụng ở chế độ chia đôi màn hình (dải phân cách). Một khung trước đó (15:50:57.212), hình nền không hiển thị và đường phân chia xuất hiện. Đây là giao diện của chế độ chia đôi màn hình khi không tạo ảnh động.

    Màn hình trước khi nhấp nháy

    Hình 10. Màn hình trước khi xảy ra sự kiện nhấp nháy.

  6. Để xem chuyển đổi tiếp theo, hãy nhấp trực tiếp vào tiến trình. Các trạng thái SurfaceFlinger được biểu thị bằng một hàng các khối màu xanh dương nhạt. Hiệu ứng chuyển đổi được biểu thị bằng một hàng các khối màu hồng.

    Kết thúc quá trình chuyển đổi đầu tiên

    Hình 11. Kết thúc quá trình chuyển đổi đầu tiên.

    Nhấp vào hàng SurfaceFlinger ở vị trí bắt đầu của hiệu ứng chuyển đổi tiếp theo. Trong hình 11, vị trí dọc của con trỏ được biểu thị bằng đường màu xanh dương mỏng. Nền màu xanh dương nhạt của hàng SurfaceFlinger cho biết vị trí ngang của hàng đó. Di chuyển qua quá trình chuyển đổi bằng phím mũi tên phải để xem liệu có hiện tượng nhấp nháy hay không. Xác nhận rằng thiết bị có giao diện phù hợp với quá trình chuyển đổi này.

  7. Bỏ qua hiệu ứng chuyển đổi tiếp theo vì thời lượng của hiệu ứng này rất ngắn, nên không có khả năng sẽ xảy ra hiện tượng nhấp nháy. Thay vào đó, hãy nhấp vào dòng thời gian trong hàng SurfaceFlinger ở vị trí bắt đầu của hiệu ứng chuyển đổi dài hơn tiếp theo, như được con trỏ chỉ ra trong hình sau.

    kết thúc quá trình chuyển đổi thứ hai

    Hình 12. Kết thúc quá trình chuyển đổi thứ hai.

    Trong quá trình chuyển đổi này, tại 15:51:13.239, hãy quan sát các lớp Splash Screen cho cả ứng dụng, danh bạ và trình quay số đều nằm ở cùng một bên của màn hình:

    màn hình chờ

    Hình 13. Màn hình chờ.

  8. Làm rõ ứng dụng nào nằm sai bên. Thêm dấu trang vào vị trí hiện tại bằng cách nhấp vào biểu tượng cờ bên cạnh trường nhập ns để giúp quay lại khung này sau.

    thêm dấu trang

    Hình 14. Thêm dấu trang.

  9. Chuyển đến một khung ở cuối quá trình chuyển đổi bằng cách nhấp trực tiếp vào dòng thời gian, ví dụ: đến 15:51:13.859. Tại đây, hai ứng dụng hiện đã ở vị trí cuối cùng, với trình quay số ở bên trái và danh bạ ở bên phải:

    màn hình chia đôi cuối cùng

    Hình 15. Chế độ chia đôi màn hình cuối cùng.

  10. Nhấp vào cờ của dấu trang trong tiến trình để quay lại khung hình bị nhấp nháy.

    dòng thời gian của dấu trang

    Hình 16. Dòng thời gian của dấu trang.

    Cả hai ứng dụng đều ở bên phải, cho biết rằng trình quay số đang ở sai vị trí.

  11. Nhấp vào màn hình chờ của trình quay số để xem các thuộc tính của màn hình chờ đó. Hãy xem xét cụ thể các thuộc tính biến đổi của nó trong chế độ xem Thuộc tính được tuyển chọn.

    Chuyển đổi thuộc tính

    Hình 17. Chuyển đổi thuộc tính.

    Biến đổi được tính toán được áp dụng cho bề mặt này, nhưng không được đặt làm cấp này. Các cột được tính toán và được yêu cầu có các giá trị khác nhau, cho biết rằng phép biến đổi đang được kế thừa từ một nền tảng mẹ.

  12. Bỏ chọn Flat (Phẳng) trong chế độ xem hệ phân cấp để hiển thị toàn bộ cây hệ phân cấp, rồi chuyển đến các nút mẹ của giao diện ứng dụng cho đến khi cả phép biến đổi Calculated (Đã tính toán) và Requested (Đã yêu cầu) đều giống nhau, cho thấy phép biến đổi đang được yêu cầu trên giao diện Surface(name=Task=7934)/@0x1941191_transition-leash#40670.

  13. Xác nhận thời điểm đặt phép biến đổi lần đầu và giá trị của phép biến đổi đó. Thu gọn các tài sản được tuyển chọn bằng cách nhấp vào biểu tượng bên cạnh tiêu đề:

    thu gọn các cơ sở lưu trú được tuyển chọn

    Hình 18. Thu gọn các thuộc tính được tuyển chọn.

  14. Chọn Show diff (Hiện sự khác biệt) trong chế độ xem Proto Dump (Tệp báo lỗi) để làm nổi bật các thuộc tính đang được thay đổi trong khung này. Nhập transform vào trường tìm kiếm văn bản để lọc các thuộc tính:

    hiển thị sự khác biệt

    Hình 19. Hiển thị sự khác biệt.

    Biến đổi được đặt từ IDENTITY thành SCALE|TRANSLATE|ROT_270 trong khung này cho transition-leash.

    Thông tin này cho thấy hiện tượng nhấp nháy xảy ra khi áp dụng phép biến đổi cho dây buộc ảnh động của ứng dụng màn hình chia đôi trình quay số.

    Xác định hiện tượng nhấp nháy

    Hình 20. Xác định hiện tượng nhấp nháy.

  15. Xác định trong mã lý do biến đổi này được đặt thành dây chuyển đổi màn hình phân tách.