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 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 có hiệu ứng động và 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 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 đổi.

Các 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 hoặc 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 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 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 các 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 các dấu vết.
  • Chuyển đổi giao diện: Ghi lại thông tin chi tiết về hệ thống chuyển đổi cửa sổ và hoạt động.
  • SurfaceFlinger: Thu thập dấu vết SurfaceFlinger chứa thông tin về các thành phần (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 để tạo thành phần.
  • ViewCapture: Chụp một dải thuộc tính của tất cả các khung hiển thị từ Windows 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.
  • Window Manager (Trình quản lý cửa sổ): Trạng thái Window Manager chứa thông tin chi tiết liên quan đến các 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à biến đổi.

Các tệp kết xuất được hỗ trợ

Winscope có thể thu thập và hiển thị các kết xuất trạng thái. Đây 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 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), các bản kết xuất chỉ được lấy tại những thời điểm do người dùng xác định, đảm bảo rằng 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 những thời điểm cụ thể. Winscope hỗ trợ các tệp kết xuất 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 các tệp kết xuất.

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 web Winscope.

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 khi kiểm thử nhấp nháy không thành công 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 khi kiểm thử 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 bài kiểm thử và tên lớp.

    Tên bài kiểm tra và tên lớp học:

    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).

    • Bài kiểm thử này dự kiến ứng dụng sẽ xuất hiện (#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 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 theo ngữ cảnh liên quan đến việc tìm hiểu và gỡ lỗi sự cố
    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 vào 2024-05-10T11:04:14.227572545.

    • NotificationActivity lẽ ra phải hiển thị nhưng không hiển thị.

    • Tên của tệp tạo tác 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 tệp theo dõi xuống và tải tệp đó vào Winscope. Winscope mở ra với 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 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 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 tính bằng 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ả ứng dụng cũng như 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à chip V trên các phần tử hệ phân cấp của chúng.

    Tên bề mặt của ứ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 ứ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 xảy ra trong quá trình khởi chạy ứng dụng, vì màn hình chờ vẫn hiển thị:

    Khi 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 khung hiển thị rects, NotificationShade xuất hiện trên màn hình thay vì ứng dụng. Các thành phần 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ỏ (trong 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 chế độ xem phân cấp. Nếu bạn không tìm thấy, hãy bỏ chọn Chỉ hiện V. Sau đó, hãy kiểm tra chế độ xem tài sản.

    Tên nền tảng của ứ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à 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 mờ khác được đặt phía trước bề mặt này trong quá trình kết hợp. Giả thuyết này bắt nguồn từ việc NotificationShade rect nằm ở phía trước NotificationActivity rect trong chế độ xem 3D và NotificationShade (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 hiển thị 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, nhấn mũi tên trái để quay lại khung hình trước (trước khi 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, 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ờ đục 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 xuất hiện. NotificationShade có màu đen, nên 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 khiến NotificationShade trở nên mờ đục quá sớm.

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

Việc gỡ lỗi đối với các lỗi do người dùng báo cáo có thể gặp nhiều khó khăn vì thường thiếu thông tin chi tiết. Không giống như lỗi kiểm tra 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), 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 ở chế độ chia đôi màn hình và dấu thời gian gần đúng là 18/4/2024 15:51 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ó 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 dễ đọ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ị rects để xác định nội dung đã được vẽ trên màn hình. Để có chế độ xem tốt hơn, hãy dùng thanh trượt Xoay để thay đổi góc nhìn của hình chữ nhật. Bằng cách đánh dấu Chỉ hiện VPhẳng trong chế độ xem Hệ thống phân cấp, bạn có thể thấy hình nền, lớp phủ trang trí màn hình, hộp thư, trình chạy, danh bạ và trì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

    • Ứng dụng quay số: com.google.android.dialer/com.google.android.dialer.extensions.GoogleDialtactsActivity#40564

    Ngoài các bề mặt có thể nhìn thấy (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 (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 chế độ hiển thị) bên cạnh bề mặt ScreenDecorHwcOverlay#64 để ẩn hình chữ nhật tương ứng và cho thấy các bề mặt phía sau. Chúng tôi sẽ xoá lớp phủ cho hoạt động phân tích vì lớp phủ này không hiển thị cho người dùng và sẽ không được báo cáo là một ảnh động nhấp nháy.

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

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

  4. Sau khi xác định những bề mặt liên quan đến chế độ xem chia đôi màn hình, hãy dùng dấu vết Chuyển đổi để thực hiện từng bước thông qua nhiều hành động của người dùng và tìm ra hiện tượng nhấp nháy. Nhấp vào thẻ Transitions (Chuyển đổi) trong Winscope để trực quan hoá danh sách các 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 cảnh được phát trong khung hình này sẽ đượ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 truy cập vào 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. 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 đổi bằng cách chuyển đổi từng bước bằng phím mũi tên bê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 ả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 (đường phân chia). 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 chia xuất hiện. Đây là giao diện của chế độ 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 dương nhạt. Các hiệu ứng chuyển cảnh được biểu thị bằng một hàng gồm 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 tiếp 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 đó. Chuyển đổi từng bước bằng phím mũi tên phải để xem có hiện tượng nhấp nháy hay không. Xác nhận rằng thiết bị có vẻ phù hợp với hiệu ứng chuyển đổi 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 tại vị trí bắt đầu của hiệu ứng chuyển đổi dài hơn tiếp theo, như được chỉ ra bằng con trỏ trong hình ả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 để thấy rằng Splash Screencác lớp 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 sai. 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 bạn 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 một 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ụ: nhấp vào 15:51:13.859. Giờ đây, hai ứng dụng này đã ở vị trí cuối cùng, với ứng dụng 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. Chế độ chia đôi màn hình cuối cùng.

  10. Nhấp vào cờ của dấu thời gian 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. Đánh dấu dòng thời gian.

    Cả hai ứng dụng đều ở bên phải, cho thấy 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 trình quay số. Xem xét cụ thể các thuộc tính biến đổi của đối tượng trong chế độ xem Thuộc tính được tuyển chọn.

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

    Hình 17. Biến đổi các thuộc tính.

    Phép biến đổi được tính toán sẽ đượ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ột đượ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 thành phần cấp trên.

  12. Bỏ chọn Flat (Phẳng) trong chế độ xem phân cấp để hiện toàn bộ cây phân cấp, rồi chuyển đến các nút gốc của thành phần ứng dụng cho đến khi cả hai phép biến đổi Calculated (Đã tính) 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 thành phần Surface(name=Task=7934)/@0x1941191_transition-leash#40670.

  13. Xác nhận thời điểm biến đổi được đặt lần đầu tiên và giá trị của biến đổi. 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 tài sản được tuyển chọn.

  14. Chọn Show diff (Hiện chênh lệch) trong chế độ xem Proto Dump (Kết xuất giao thức) để làm nổi bật 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:

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

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

    Phép biế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 hiện tượng nhấp nháy xảy ra khi phép biến đổi được áp dụng cho dây buộc ảnh động của ứng dụng màn hình chia đôi của 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 khiến phép biến đổi này được đặt thành dây buộc chuyển đổi chia đôi màn hình.