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
SurfaceControlcho 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ử.
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).
- 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á (
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. NotificationActivitydự 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:
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:
Hình 1. Trang đích Winscope có khung hiển thị SurfaceFlinger.
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ình 2. Hộp thoại dấu thời gian.
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:
Hình 3. Khi chạy ứng dụng.
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,
NotificationShadexuấ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)
Hình 4. Hoạt động nhấp nháy.
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`
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ậtNotificationShadenằm ở phía trước hình chữ nhậtNotificationActivitytrong khung hiển thị 3D vàNotificationShadexuất hiện (màu xanh lục) có thể là lớp được chọn.Để xác thực giả thuyết này, hãy chọn bề mặt
NotificationShadexuấ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ànhOPAQUE|ENABLE_BACKPRESSURE (0x102). Tên bề mặtNotificationShadelàNotificationShade#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ặtNotificationShade. 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ằngNotificationShadetrở nên không trong suốt trước khi quá trình chạy ứng dụng hoàn tất. VìNotificationShadenằm ở phía trướcNotificationActivitynên ứng dụng không xuất hiện.NotificationShadecó 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.Xác định trong mã lý do
NotificationShadetrở 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:
Tải tệp dấu vết trong Winscope. Winscope mở ra với SurfaceFlinger được tự động chọn.
Hình 6. Trang đích Winscope có khung hiển thị SurfaceFlinger.
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ập15:50:00vào trường dấu thời gian mà con người có thể đọc được.
Hình 7. Hộp thoại dấu thời gian.
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 V và Phẳ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 (
)
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.
Hình 8. Báo cáo người dùng.
- Trình chạy:
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:
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.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.
Hình 10. Màn hình trước sự kiện nhấp nháy.
Để 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.
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.
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.
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ớpSplash Screencho 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:
Hình 13. Màn hình chờ.
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.
Hình 14. Thêm dấu trang.
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:
Hình 15. Màn hình chia đôi cuối cùng.
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.
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.
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.
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ẹ.
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 và Đượ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.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 đề:
Hình 18. Thu gọn các thuộc tính được tuyển chọn.
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
transformvào trường tìm kiếm văn bản để lọc các thuộc tính:
Hình 19. Hiển thị điểm khác biệt.
Quy tắc chuyển đổi được đặt từ
IDENTITYthànhSCALE|TRANSLATE|ROT_270trong khung hình này chotransition-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ố.
Hình 20. Xác định hiện tượng nhấp nháy.
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.