Giới thiệu về Instruments:
Instruments là một công cụ phân tích hiệu năng và kiểm thử cho iOS và Mac OS (Được tích hợp trong ứng dụng Xcode – được dùng để phát triển ứng dụng cho iOS và Mac OS). Đây là một công cụ linh hoạt và mạnh mẽ giúp ta theo dấu process (của logic trong ứng dụng), thu thập dữ liệu và khảo sát những dữ liệu đã thu thập được. Với phương pháp này Instruments sẽ giúp ta hiểu được hành vi của cả người dùng lẫn hệ điều hành.
1.Khởi động Instruments
- Mở Xcode
- Chọn Xcode > Open Developer Tool > Instruments
- Hiển thị màn hình Instruments
Vậy là chúng ta đã xong phần khởi động bộ công cụ Instrument của Xcode tiếp theo tôi sẽ giới thiệu cho các bạn 1 số công cụ thông dụng sử dụng trong Instrument.
2.Giới thiệu 1 số công cụ có trong Instruments
2.1.Automation
- Với Instruments, được tích hợp sẵn trong Xcode từ phiên bản 3.0 trở đi, ta có thể tương tác với UI của ứng dụng (do cá nhân hoặc tổ chức của ta phát triển – đồng nghĩa với việc cần có certificate và provisioning của thiết bị sử dụng để test). Khi sử dụng test tự động, đội ngũ của chúng ta sẽ có thời gian để làm những việc khác. Tuy nhiên ta sẽ phải dành chút thời gian để viết script cho test case của ứng dụng trước đã.
- Ta có thể sử dụng tính năng Automation trong Instruments để tự động tương tác với UI trong ứng dụng thông qua những đoạn script đã viết. (Đồng nghĩa với việc 1 test case chỉ phải viết script 1 lần nhưng được sử dụng để test nhiều lần ngay khi phát triển ứng dụng hay những bản nâng cấp sau). Những đoạn script này sẽ được chạy bên ngoài ứng dụng (đang cần test) và mô phỏng những tương tác của người dùng đối với ứng dụng bằng cách sử dụng UI Automation API (một tập các Java Script API), đồng thời chúng sẽ ghi lại log của quá trình tương tác lên trên máy tính.
- Ngoài ra ta có thể tích hợp Automation với những tính năng khác của Instruments để thực hiện những test case phức tạp hay kiểm tra rò rỉ bộ nhớ (Memory leaking) trong quá trình chạy ứng dụng.
2.1.1.Khởi tạo Automation trong Instrument
- Chạy Instruments
- Lựa chọn tạo Automation từ Instruments
- Sau khi khởi tạo ta sẽ nhận được một Automation
Trong đó
- Thiết bị và ứng dụng muốn kiểm thử: (Bao gồm cả device thật và Simulator)
- Editor để soạn thảo script: (Sử dụng ngôn ngữ Java Script)
- Các nút với chức năng ghi nhớ thao tác người dùng và thực thi script:
2.1.2.Tạo Script:
- Vào mục Display Setting bên phải:
- Thêm mới script hoặc load từ file: (Import or Create)
- Sử dụng Script: Sử dụng những Java Script API mà Apple cung cấp để thực hiện tương tác với UI trong ứng dụng ta đang phát triển.
- Ghi nhớ lại những tương tác của người dùng, biến chúng thành script tương ứng: Ngoài việc tự viết ra những đoạn script để tương tác với UI của app, ta còn có thể ghi lại những tương tác của người sử dụng thông qua chức năng record của Automation như đã giới thiệu ở trên. Mỗi khi người dùng thực hiện một tương tác với UI thì Instruments sẽ tự động tạo ra đoạn script tương ứng. Ta có thể chèn, thêm, sửa xóa để được đoạn script như ý.
- Truy cập và thao tác với các thành phần UI: Cấu trúc các thành phần UI trong ứng dụng: Các thành phần UI trong ứng dụng được tổ chức dưới dạng cây
- Trong đó class UIATarget chứa đối tượng gốc (root): localTarget là đối tượng đại diện cho thiết bị ta đang thực hiện trỏ tới để test. localTarget lại chứa đối tượng: frontMostApp – là đối tượng đại diện cho ứng dụng ta đang thực hiện trỏ tới để test. frontMostApp lại chứa đối tượng mainWindow – là màn hình hiện tại của ứng dụng (màn hình mà người sử dụng sẽ nhìn thấy ở thời điểm tương tác)
mainWindow lại chứa từ 0 -> nhiều thành phần UI thành phần UI (Element UI) cũng có thể chứa 0 -> nhiều thành phần UI khác. - Do đó muốn tương tác với thành phần UI nào (button: nút , cell in table: một dòng trong một bảng,..) ta chỉ cần truy cập từ đối tượng gốc localTarget đi dần theo cấu trúc cây ở trên cho đến khi tìm được thành phần UI đó và thực hiện tương tác. (tap: chạm , double tap: 2 chạm, pinch: 2 chạm có kéo mở, swipe: vuốt,…)
2.2.Leaks
- Cũng giống như Anotation ,Leaks cũng là 1 công cụ có trong Instrument. Công cụ này sẽ khởi chạy ứng dụng của bạn, qua đó đo các thông số về kích thước vùng nhớ được tạo ra, vùng nhớ nào bị leak, và dòng code nào đã gây ra leak vùng nhớ đó, thậm chí bạn có thể double-click để đi đến đoạn code đó và fix nó.
2.2.1.Khởi tạo Leaks trong Instrument
- Chạy Instruments
- Lựa chọn tạo Leaks từ Instruments
- Sau khi khởi tạo ta sẽ nhận được một Leaks
- Chọn Device và chương trình trong phần chọn thiết bị và danh sách chương trình
- Nhấp vào nút Record (màu đỏ)trên thanh công cụ (hoặc nhấn Command-R) để bắt đầu ghi âm.
- Sử dụng ứng dụng của bạn bình thường.
- Xem Leaks trong khung thời gian rò rỉ.Mỗi Leaks xuất hiện sẽ hiển thị là chữ x trắng trong khung màu đỏ
- Nhấp vào Leaks trong cửa sổ dòng thời gian để hiển thị các thông tin bị Leaks liên quan trong khung chi tiết.
- Chọn Call tree từ detail type list trên thanh menu của cửa sổ chi tiết
- Một danh sách các cuộc gọi phương thức liên quan đến bất kỳ Leaks phát hiện được hiển thị.
- Nhấn Command-2 để hiển thị các khu vực cài đặt hiển thị của cửa sổ thanh tra.
- Theo các cài đặt hiển thị Call Tree, chọn Invert Call Tree và Hide System Libraries.
- Các cuộc gọi phương thức gần đây nhất được hiển thị đầu tiên. Nó cũng giúp thu hẹp danh sách các phương pháp gọi cho những người thực hiện ứng dụng của bạn. Các cuộc gọi phương pháp được thực hiện bởi ứng dụng của bạn có một biểu tượng mã người dùng màu đen .Trong CallTree, chọn một phương pháp gọi bạn muốn để điều tra.
- Nhấn Command-3 để hiển thị một dấu vết ngăn xếp cho các cuộc gọi phương pháp được lựa chọn trong khu vực chi tiết mở rộng của thanh tra.
- Bấm đúp vào các phương pháp gọi trong stack trace để hiển thị mã của nó trong Instruments.
- Nhấp vào nút Xcode ở phía trên cùng của cửa sổ chi tiết để mở mã trong Xcode xem xét và chỉnh sửa.
2.2.2. Điều tra một đối tượng bị leaks sử dụng Backtrace
- Nhấp vào công cụ Leaks trong cửa sổ dòng thời gian để hiển thị các thông tin bị Leaks liên quan trong cửa sổ chi tiết.
- Chọn Leaks từ chi tiết danh sách trên thanh menu của cửa sổ chi tiết.
- Một danh sách các đối tượng bị Leaks bởi Backtrace được hiển thị.
- Việc Leaks do backtrace là để xem tất cả các khối bị rò rỉ bởi thời điểm phân bổ của nó, bởi vì một sai lầm duy nhất trong mã nguồn có thể dẫn đến nhiều rò rỉ vì trong thời gian chạy chương trình mã nguồn có thể được thực thi liên tục.
- Chọn một đối tượng bạn muốn để điều tra.
- Nhấp vào mũi tên bên cạnh địa chỉ bộ nhớ của đối tượng để hiển thị lịch sử bộ nhớ của đối tượng trong cửa sổ chi tiết, cùng với số lượng tham chiếu tương ứng và phương thức gọi.
- Nhấn Command-3 để hiển thị những Stack Trace của đối tượng được chọn trong vùng chi tiết mở rộng của chương trình.
- Nhấp vào nút Collapse trong khu vực chi tiết mở rộng để ẩn các phương thức gọi hệ thống trong Stack Trace. Điều này giúp cho chúng ta dễ dàng xác định vị trí các phương thức ứng dụng của mình.
- Bấm đúp vào một phương pháp trong stack trace để hiển thị mã của nó trong Instruments.
- Nhấp vào nút Xcode ở trên cùng của cửa sổ chi tiết để mở mã trong Xcode để xem xét và chỉnh sửa.
2.2.2. Điều tra một đối tượng bị leaks sử dụng Cycles & Roots
- Nhấp vào công cụ Leaks trong cửa sổ dòng thời gian để hiển thị các thông tin bị Leaks liên quan trong cửa sổ chi tiết.
- Chọn Cycles & Roots từ chi tiết danh sách trên thanh menu của cửa sổ chi tiết.
- Một danh sách các đối tượng bị Leaks bởi Cycles & Roots được hiển thị.
- Chọn một đối tượng bạn muốn để điều tra.
- Nếu có sẵn, xem biểu đồ đối tượng cho các đối tượng.
- Nhấp vào mũi tên bên cạnh các đối tượng để hiển thị lịch sử bộ nhớ của đối tượng trong cửa sổ chi tiết, cùng với số lượng tham chiếu tương ứng và phương thức gọi.
- Nhấn Command-3 để hiển thị những Stack Trace của đối tượng được chọn trong vùng chi tiết mở rộng của chương trình.
- Nhấp vào nút Collapse trong khu vực chi tiết mở rộng để ẩn các phương thức gọi của hệ thống trong Stack Trace. Điều này giúp cho chúng ta dễ dàng xác định vị trí các phương thức ứng dụng của mình.
- Bấm đúp vào một phương pháp trong stack trace để hiển thị mã của nó trong Instruments.
- Nhấp vào nút Xcode ở trên cùng của cửa sổ chi tiết để mở mã trong Xcode để xem xét và chỉnh sửa.
2.2.3.Điều tra Leaks bằng cách sử dụng Call Tree
- Nhấp vào công cụ Leaks trong cửa sổ dòng thời gian để hiển thị các thông tin bị Leaks liên quan trong cửa sổ chi tiết.
- Chọn CallTree từ chi tiết danh sách trên thanh menu của cửa sổ chi tiết.
- Một danh sách các cuộc gọi phương thức liên quan đến Leaks phát hiện được hiển thị.
- Nhấn Command-2 để hiển thị các khu vực thiết lập hiển thị trong cửa sổ chương trình.
- Theo các cài đặt hiển thị CallTree, chọn Invert CallTree và Hide System Libraries.
- Chọn một phương thức gọi bạn muốn để điều tra.Nhấn Command-3 để hiển thị Stack Trace cho các phương thức gọi được lựa chọn trong khu vực chi tiết mở rộng của chương trình.
- Bấm đúp vào các phương pháp gọi trong stack trace để hiển thị mã của nó trong Instruments.
- Nhấp vào nút Xcode ở trên cùng của cửa sổ chi tiết để mở mã trong Xcode để xem xét và chỉnh sửa.
Mặc dù cụ có thể giúp bạn phát hiện Leaks, bạn vẫn cần phải xem xét cẩn thận thông qua lịch sử bộ nhớ liên quan và mã nguồn của bạn để xác định và giải quyết vấn đề. Các vấn đề sau đây là những nguyên nhân phổ biến của Leaks:
- Retain được gọi về một đối tượng mà không có một cuộc gọi phát hành tương ứng khi đối tượng không còn tham chiếu.
- Một đối tượng đã được cấp phát và khởi tạo với các API mà không làm cho đối tượng autorelease.
- Nếu bị rò rỉ không phải là một đối tượng, bạn có thể gọi một API, cho rằng quyền sở hữu của một khối bộ nhớ malloc tạo ra, và bạn đang thiếu một cuộc gọi tương ứng để giải phóng.
Lời kết
Trên đây là 2 công cụ có trong Instrument mà tôi đã giới thiệu cho các bạn. Mong rằng qua bài viết này các bạn có thể hiểu và có thể ứng dụng được trong dự án của mình 1 cách tốt nhất. Nếu có đóng góp gì mong các bạn bình luận thêm bên dưới.
Xin cảm ơn.