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

Winscope là một công cụ trên web cho phép bạn 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 hiệu ứng động và hiệu ứng chuyển cảnh diễn ra. Winscope ghi lại tất cả các trạng thái dịch vụ hệ thống có liên quan vào một tệp dấu vết. Khi sử dụng giao diện người dùng Winscope với tệp dấu vết, 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, chuyển qua từng bước và gỡ lỗi các hiệu ứng chuyển cảnh.

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

Winscope cung cấp khả năng thu thập và trình bày trực quan nhiều dấu vết, tức là chuỗi 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 EventLog. Trong Winscope, thông tin này chỉ được dùng để xác định và hiển thị 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 IMS, IMMS và IME Client.
  • Input: Theo dõi các sự kiện nhập từ nhiều phần của quy trình sự kiện nhập.
  • ProtoLog: Thu thập ProtoLog thông báo 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 máy khách.
  • Screen recording: Thu thập bản ghi màn hình cùng với các dấu vết.
  • Shell transitions: 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 SurfaceFlinger dấu vết 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 SurfaceControl cho thành phần.
  • ViewCapture: Chụp một loạt thuộc tính của tất cả các khung hiển thị từ Windows hệ thống hỗ trợ ViewCapture, 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ình quản lý cửa sổ các trạng thái chứa thông tin chi tiết liên quan đến các cửa sổ, bao gồm các sự kiện nhập và tiêu điểm, hướng màn hình, hiệu ứng chuyển cảnh, hiệu ứng động, vị trí và quy tắc chuyển đổi.

Kết xuất được hỗ trợ

Winscope có thể thu thập và hiển thị kết xuất trạng thái, là ảnh chụp nhanh trạng thái của thiết bị được chụp tại những thời điểm cụ thể do bạn xác định. Không giống như các 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, kết xuất chỉ được chụp tại những thời điểm do người dùng xác định này để xác minh rằng hiệu suất và mức 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 kết xuất sau:

  • Window Manager: Trích xuất dữ liệu một trạng thái duy nhất của Trình quản lý cửa sổ.
  • SurfaceFlinger: Trích xuất dữ liệu một ảnh chụp nhanh duy nhất của SurfaceFlinger.
  • Screenshot: Thu thập ảnh chụp màn hình cùng với các kết xuất.

Tài nguyên

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

Hãy xem bài viết Chụp dấu vết để biết thông tin về cách thu thập dấu vết.

Hãy xem bài viết 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 web Winscope.

Hãy xem bài viết 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 thất bại trong kiểm thử nhấp nháy và lỗi do người dùng báo cáo.

Lỗi kiểm thử nhấp nháy

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

Kiểm tra thất bại trong 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 thất bại trong kiểm thử.

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

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

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

    Loại vấn đề:

    • 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).
    • Bài kiểm thử dự kiến ứng dụng sẽ xuất hiện (#appLayerBecomesVisible).
  2. Kiểm tra thông báo lỗi thất bại trong 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ế xuất hiện
    • Dấu thời gian giúp xác định chính xác 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 bổ sung về bối cảnh liên quan đến việc hiểu và gỡ 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 tại 2024-05-10T11:04:14.227572545.
    • NotificationActivity dự kiến sẽ xuất hiện nhưng không xuất hiện.
    • Tên của tệp cấu phần phần mềm chứa các 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 các tệp dấu vết xuống và tải các tệp đó trong Winscope. Winscope mở ra với SurfaceFlinger được tự động chọn:

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

    Hình 1. Trang đích Winscope có khung hiển thị SurfaceFlinger.

  2. Chuyển đến dấu thời gian xảy ra vấn đề 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 mà con người 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 theo 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 hình trước. Ở trạng thái này, ứng dụng NotificationActivity hiển thị chính xác trong video và cả bề mặt ứng dụng lẫn màn hình chờ đều xuất hiện, được biểu thị bằng các hình chữ nhật màu xanh lục trong khung hiển thị 3D và chip V trên các phần tử phân cấp.

    Tên bề mặt ứng dụng và 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 chạy khi màn hình chuyển sang màu đen và sự kiện này đang xảy ra trong quá trình chạy ứng dụng, vì màn hình chờ vẫn xuất hiện:

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

    Hình 3. Khi 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 khung hiển thị hình chữ nhật, NotificationShade xuất hiện trên màn hình thay vì ứng dụng. Các bề mặt sau đây xuất hiện trong khung hình 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 trên Flickr

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

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

    Tên bề mặt ứng dụng là:

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

    Thuộc tính của ứ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 xuất hiện và không trong suốt, nhưng bề mặt 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 không trong suốt khác được đặt ở phía trước bề mặt đó trong quá trình tạo thành phần. Giả thuyết này bắt nguồn từ việc hình chữ nhật NotificationShade nằm ở phía trước hình chữ nhật NotificationActivity trong khung hiển thị 3D và NotificationShade xuất hiện (màu xanh lục) có thể là lớp được chọn.

  6. Để xác thực giả thuyết này, hãy chọn bề mặt NotificationShade xuất hiện trên khung hình hiện tại và kiểm tra các thuộc tính của bề mặt đó. 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 hình trước (trước khi xảy ra hiện tượng nhấp nháy) và kiểm tra lại các thuộc tính của bề mặt NotificationShade. Xin lưu ý rằng thay vì là OPAQUE, bề mặt chỉ có cờ ENABLE_BACKPRESSURE (0x100). Điều này xác nhận rằng NotificationShade trở nên không trong suốt trước khi quá trình chạy ứng dụng hoàn tất. Vì NotificationShade nằm ở phía trước NotificationActivity nên ứng dụng không xuất hiện. 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 không trong suốt quá sớm.

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

Lỗi do người dùng báo cáo có thể khó gỡ lỗi vì thường thiếu thông tin chi tiết. Không giống như lỗi kiểm thử nhấp nháy (cung cấp dấu thời gian cụ thể, thông tin chi tiết về phần tử và bản ghi màn hình), 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 ở chế độ chia đôi màn hình và dấu thời gian gần đúng là 18 thg 4, 2024 3:51 CH GMT-04:00.

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

  1. Tải tệp dấu vết 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ó khung hiển thị 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 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 khung hiển thị hình chữ nhật để xác định nội dung được vẽ trên màn hình. Để xem rõ hơn, hãy sử dụng thanh trượt Xoay để thay đổi góc nhìn hình chữ nhật. Bằng cách đánh dấu Chỉ hiện VPhẳng trong khung hiển thị Phân cấp , hình nền, lớp phủ trang trí màn hình, hộp thư, trình chạy, danh bạ và bề mặt trình quay số sẽ xuất hiện.

    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 xuất hiện (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 vùng hiển thị) có tên là Unknown display 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 mức độ hiển thị) bên cạnh bề mặt ScreenDecorHwcOverlay#64 để ẩn hình chữ nhật tương ứng và hiển thị các bề mặt ở phía sau. Chúng tôi xoá lớp phủ để phân tích vì người dùng không nhìn thấy lớp phủ này và sẽ không báo cáo lớp phủ này là hiệu ứng độ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 xác định các bề mặt liên quan đến khung hiển thị chia đôi màn hình, hãy sử dụng dấu vết Hiệu ứng chuyển cảnh để chuyển qua từng bước các hành động của người dùng và tìm hiện tượng nhấp nháy. Nhấp vào thẻ Hiệu ứng chuyển cảnh trong Winscope để hình dung danh sách các hiệu ứng chuyển cảnh đã phát:

    hiệu ứng chuyển cảnh

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

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

  5. Nhấp vào đường liên kết trên cột 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. Xác nhận tính chính xác của trạng thái thiết bị trong quá trình chuyển cảnh bằng cách chuyển qua từng bước hiệu ứng chuyển cảnh 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 lúc 15:50:57.278 nhưng hiệu ứng động không bắt đầu vào thời điểm đó. Hình nền đã xuất hiện vì không có nội dung nào được vẽ giữa các ứng dụng chia đôi màn hình (đường phân cách). Một khung hình trước đó (15:50:57.212), hình nền không xuất hiện và đường phân cách xuất hiện. Đây là giao diện chia đôi màn hình khi không có hiệu ứng động.

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

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

  6. Để xem hiệu ứng chuyển cảnh tiếp theo, hãy nhấp trực tiếp vào dòng thời gian. Các trạng thái SurfaceFlinger được biểu thị bằng một hàng các khối màu xanh lam nhạt. Các hiệu ứng chuyển cảnh đượ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 hiệu ứng chuyển cảnh đầu tiên.

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

  7. Bỏ qua hiệu ứng chuyển cảnh tiếp theo vì hiệu ứng này có thời lượng rất ngắn nên khó có thể chứa 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 cảnh dài hơn tiếp theo, như được biểu thị bằng con trỏ trong hình sau.

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

    Hình 12. Kết thúc hiệu ứng chuyển cảnh thứ hai.

    Trong quá trình chuyển cảnh này, tại 15:51:13.239, hãy quan sát để thấy rằng các lớp Splash Screen cho cả hai ứng dụng, danh bạ và trình quay số đều nằm ở cùng một phía 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 ở phía không chính xác. 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 dữ liệu ns để giúp bạn điều hướng quay lại khung hình này sau.

    thêm dấu trang

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

  9. Chuyển đến khung hình ở cuối hiệu ứng chuyển cảnh 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:

    chia đôi màn hình lần cuối

    Hình 15. Màn hình chia đôi cuối cùng.

  10. Nhấp vào cờ của dấu trang trong dòng thời gian để quay lại khung hình có hiện tượng nhấp nháy.

    dòng thời gian dấu trang

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

    Cả hai ứng dụng đều nằm ở bên phải, cho biết rằng trình quay số nằm ở vị trí không chính xác.

  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 đó. Hãy xem cụ thể các thuộc tính chuyển đổi của màn hình đó trong khung hiển thị Thuộc tính được tuyển chọn.

    Thuộc tính biến đổi

    Hình 17. Thuộc tính chuyển đổi.

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

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

  13. Xác nhận thời điểm quy tắc chuyển đổi được đặt lần đầu và giá trị được đặt. Thu gọn các thuộc tính đượ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 tài sản đượ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 Hiển thị điểm khác biệt trong khung hiển thị Kết xuất Proto để đánh dấu các thuộc tính đang được thay đổi trong khung hình 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:

    show diff

    Hình 19. Hiển thị điểm khác biệt.

    Quy tắc chuyển đổi được đặt từ IDENTITY thành SCALE|TRANSLATE|ROT_270 trong khung hình này cho transition-leash.

    Thông tin này cho thấy rằng hiện tượng nhấp nháy xảy ra khi quy tắc chuyển đổi được áp dụng cho dây xích hiệu ứng động của ứng dụng chia đôi màn hình 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 quy tắc chuyển đổi này được đặt thành dây xích hiệu ứng chuyển cảnh chia đôi màn hình.