Gỡ lỗi và chẩn đoán chuyên nghiệp các ứng dụng di động là kỹ năng quan trọng cho phát triển di động, cho phép tìm và sửa lỗi trong mã. Theo JetBrains Developer Ecosystem (2024), các nhà phát triển dành tới 30% thời gian làm việc để gỡ lỗi mã. IT Sectr đã phát triển các phương pháp chẩn đoán riêng giúp giảm 40% thời gian tìm lỗi nhờ sử dụng đúng các công cụ gỡ lỗi.
Những điểm chính
Các ứng dụng di động được xây dựng trong hai cấu hình chính: Debug và Release. Bản dựng Debug bao gồm các ký hiệu gỡ lỗi, không tối ưu hóa mã và sử dụng chữ ký tạm thời — cho phép thiết lập breakpoints, kiểm tra biến và thực thi mã từng bước.
Bản dựng Release cho phát triển di động là phiên bản cuối cùng cho App Store và Google Play. Release tối ưu hóa mã, loại bỏ các ký hiệu và nhật ký không cần thiết, ký ứng dụng bằng chứng chỉ sản xuất. Không thể gỡ lỗi trên Release — nếu lỗi chỉ tái hiện trên Release, cần có Crashlytics hoặc các trình báo cáo sự cố khác.
Chiến lược đúng đắn cho ứng dụng di động: Debug để phát triển, Release để kiểm tra trước khi xuất bản. IT Sectr khuyên bạn nên chạy bản dựng Release trên thiết bị kiểm thử 2–3 ngày trước khi phát hành để xác định các vấn đề không xuất hiện ở chế độ Debug (ví dụ: mã bị làm rối hoặc lỗi ProGuard/R8).
Debuggable=false là cài đặt bắt buộc cho Release trong AndroidManifest. iOS Debug và Release khác nhau theo sơ đồ xây dựng trong Xcode — Debug bao gồm Debug executable, Release thì không. iOS cũng có cấu hình TestFlight (với báo cáo sự cố) và App Store.
Android Studio cung cấp một bộ công cụ hoàn chỉnh để gỡ lỗi và chẩn đoán ứng dụng di động trên nền tảng Android. Logcat là bảng điều khiển nhật ký hệ thống Android, công cụ chính để xem nhật ký, có thể lọc theo cấp độ (Verbose, Debug, Info, Warn, Error), tiến trình và thẻ.
Logcat hiển thị nhật ký của tất cả các tiến trình trên thiết bị hoặc trình giả lập. Mỗi nhật ký có mức độ ưu tiên, thẻ và thông báo — sử dụng Log.d(TAG, message) cho thông báo gỡ lỗi, Log.e cho lỗi. Lọc theo thẻ là cách tốt nhất để tìm nhật ký của bạn giữa hàng nghìn thông báo hệ thống.
Ví dụ đầu ra nhật ký trong phát triển di động trên Android:
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate started");
try {
initComponents();
Log.i(TAG, "Components initialized successfully");
} catch (Exception e) {
Log.e(TAG, "Failed to init components", e);
}
}
Layout Inspector — trình gỡ lỗi giao diện trực quan cho Android, hiển thị hệ thống phân cấp View, thuộc tính của từng phần tử và vị trí của nó trên màn hình. Cho phép kiểm tra các tham số bố cục, đệm, lề, hiển thị và kích thước văn bản trên ứng dụng đang chạy.
Database Inspector — xem và chỉnh sửa cơ sở dữ liệu SQLite trực tiếp trong Android Studio, hiển thị nội dung của tất cả các bảng, cho phép thực thi truy vấn SQL và sửa đổi dữ liệu trong thời gian thực — một công cụ không thể thiếu để gỡ lỗi truy vấn Room và ContentProvider.
Network Inspector — theo dõi tất cả các yêu cầu HTTP của ứng dụng, hiển thị URL, tiêu đề, nội dung yêu cầu và phản hồi, thời gian thực thi và mã trạng thái. Giúp gỡ lỗi API REST, xác minh tính đúng đắn của tuần tự hóa và phát hiện các yêu cầu chậm.
Việc gỡ lỗi và chẩn đoán toàn diện ứng dụng di động trên Android đòi hỏi phải thành thạo tất cả các công cụ được liệt kê. Android Studio kết hợp chúng trong một IDE duy nhất để nâng cao hiệu quả.
Xcode cung cấp một bộ công cụ tương tự để gỡ lỗi và chẩn đoán ứng dụng di động trên iOS. Console là tương đương với Logcat trên iOS, hiển thị nhật ký hệ thống và ứng dụng được nhóm theo danh mục và cấp độ (OSLogType).
Memory Graph Debugger là một công cụ trực quan để phát hiện retain cycles và rò rỉ bộ nhớ, hiển thị biểu đồ của tất cả các đối tượng trong bộ nhớ với các tham chiếu của chúng. Các nút màu đỏ cho biết rò rỉ — các đối tượng lẽ ra đã được giải phóng nhưng vẫn còn trong bộ nhớ.
Sử dụng Memory Graph: chạy ứng dụng, nhấp vào nút Debug Memory Graph trong Xcode, chọn một đối tượng và kiểm tra các tham chiếu đến nó. Một retain cycle xuất hiện dưới dạng phụ thuộc vòng tròn: đối tượng A giữ đối tượng B, đối tượng B giữ đối tượng A. Giải pháp là sử dụng tham chiếu weak hoặc unowned trong closures.
View Hierarchy Debugger là tương đương với Layout Inspector trên iOS, hiển thị trực quan hóa 3D của tất cả UIView trên màn hình với hệ thống phân cấp, ràng buộc và thuộc tính của chúng. Cho phép chọn bất kỳ phần tử nào để xem vị trí, màu sắc, kích thước và các ràng buộc bố cục của nó.
Heap Dump là ảnh chụp nhanh toàn bộ bộ nhớ ứng dụng, phân tích giúp tìm các đối tượng không được giải phóng và ước tính tổng mức sử dụng bộ nhớ của mỗi lớp. Trong Xcode, Heap Dump có sẵn thông qua Memory Report trong Debug Navigator.
LLDB là trình gỡ lỗi cấp thấp cho các ứng dụng C, Objective-C và Swift, hỗ trợ breakpoints, watchpoints, kết xuất hợp ngữ và sửa đổi biến động. Lệnh po (print object) trong LLDB xuất ra mô tả của bất kỳ đối tượng nào trong bộ nhớ.
Watchpoint là điểm dừng được kích hoạt khi giá trị của biến thay đổi, hữu ích để theo dõi ai và khi nào thay đổi giá trị trường của đối tượng. Không giống như breakpoint, kích hoạt tại một dòng cụ thể, watchpoint kích hoạt khi có bất kỳ sửa đổi bộ nhớ nào.
Gỡ lỗi và chẩn đoán chuyên nghiệp trên iOS đòi hỏi kinh nghiệm với Xcode và hiểu biết về quản lý bộ nhớ. Apple cung cấp tài liệu đầy đủ cho từng công cụ gỡ lỗi.
Các công cụ proxy là cần thiết để chẩn đoán các vấn đề mạng trong ứng dụng di động. Charles Proxy là proxy HTTP phổ biến nhất cho phát triển di động, cho phép chặn, xem và sửa đổi các yêu cầu giữa ứng dụng và máy chủ.
Charles Proxy hoạt động như người trung gian: bạn cấu hình thiết bị để sử dụng Charles làm proxy (thường là IP máy tính, cổng 8888). Charles hiển thị tất cả các yêu cầu HTTP và HTTPS với khả năng xem tiêu đề, nội dung, cookie và thời gian thực thi. SSL Proxying cho phép giải mã lưu lượng HTTPS để phân tích.
Tính năng của Charles: Breakpoints (tạm dừng yêu cầu để chỉnh sửa), Rewrite (tự động sửa đổi yêu cầu), Map Local (thay thế phản hồi bằng tệp cục bộ). Map Local không thể thiếu để kiểm tra mà không có API thực — bạn trả về JSON đã chuẩn bị trước thay vì phản hồi từ máy chủ.
Proxyman là một thay thế hiện đại cho Charles trên macOS với giao diện sạch hơn, hỗ trợ M1 và M2 tốt hơn và bảo vệ quyền riêng tư. Hỗ trợ các chức năng tương tự: chặn, proxy SSL, chỉnh sửa yêu cầu và tập lệnh để tự động sửa đổi lưu lượng.
Wireshark là trình phân tích lưu lượng chuyên nghiệp để chẩn đoán mạng sâu, phân tích tất cả các lớp OSI: TCP, DNS, bắt tay TLS, ICMP. Được sử dụng để chẩn đoán kết nối chậm, vấn đề DNS và lỗi mạng cấp thấp.
Stetho là một thư viện từ Facebook để gỡ lỗi ứng dụng Android qua trình duyệt Chrome, cho phép xem cơ sở dữ liệu, yêu cầu mạng, View Hierarchy và Shared Preferences qua Chrome DevTools. Flipper là người kế nhiệm của Stetho với hỗ trợ iOS và kiến trúc plugin.
Các ứng dụng khách API được sử dụng để gỡ lỗi và chẩn đoán backend của ứng dụng di động mà không cần chạy ứng dụng. Postman là ứng dụng khách API phổ biến nhất với bộ sưu tập, kiểm thử và tự động hóa, cho phép gửi yêu cầu GET, POST, PUT, DELETE và quản lý tiêu đề, cookie và biến môi trường.
Insomnia là một thay thế mã nguồn mở nhẹ cho Postman với giao diện nhanh hơn, hỗ trợ GraphQL tích hợp và tổ chức bộ sưu tập tốt hơn. Hỗ trợ plugin: chủ đề, xuất khẩu, tạo mã bằng nhiều ngôn ngữ khác nhau.
Httpie là ứng dụng khách HTTP dòng lệnh với đầu ra dễ đọc, hiển thị phản hồi JSON có màu sắc, tiêu đề và trạng thái trực tiếp trong terminal. Phù hợp cho kiểm tra API nhanh mà không cần mở ứng dụng GUI.
Ví dụ sử dụng Httpie:
http POST https://api.example.com/v1/users \
"Authorization: Bearer token123" \
name="John" email="john@example.com"
IT Sectr khuyên bạn nên kết hợp: Postman để phân tích và tài liệu API + Httpie để kiểm tra nhanh. Nhập bộ sưu tập Postman từ đặc tả Swagger hoặc OpenAPI — điều này đảm bảo các điểm cuối được kiểm thử khớp với tài liệu máy chủ.
| Công cụ | Nền tảng | Loại gỡ lỗi | Miễn phí | Sử dụng tốt nhất |
|---|---|---|---|---|
| Logcat | Android | Ghi nhật ký | + | Xem nhật ký ứng dụng và hệ thống |
| Layout Inspector | Android | UI/View | + | Kiểm tra hệ thống phân cấp View và thuộc tính |
| Memory Graph | iOS | Bộ nhớ | + | Chẩn đoán rò rỉ bộ nhớ |
| View Hierarchy | iOS | UI/View | + | Trực quan hóa 3D UIView |
| Charles Proxy | iOS/Android | Mạng | Dùng thử 30 ngày | Chặn lưu lượng HTTP/HTTPS |
| Proxyman | iOS/Android | Mạng | + (giới hạn) | Proxy HTTP hiện đại cho macOS |
| Wireshark | Tất cả nền tảng | Mạng (sâu) | + | Phân tích tất cả các lớp OSI |
| Postman | Tất cả nền tảng | API | + | Kiểm thử API REST/GraphQL |
| Insomnia | Tất cả nền tảng | API | + | Thay thế Postman với GraphQL |
| LLDB | iOS/macOS | Cấp thấp | + | Gỡ lỗi từng bước, hợp ngữ |
Câu hỏi thường gặp
Bản dựng Debug chứa ký hiệu gỡ lỗi, không tối ưu mã và sử dụng chữ ký tạm thời. Bản dựng Release tối ưu mã, loại bỏ nhật ký, làm rối và ký bằng chứng chỉ sản xuất. Debug được cài qua USB hoặc trình giả lập, Release — qua App Store hoặc Google Play.
Sử dụng Memory Profiler trong Android Studio — nó hiển thị các đối tượng được cấp phát và giải phóng cũng như các sự kiện GC. Thực hiện Heap Dump và phân tích các đối tượng không được giải phóng. Tìm các phiên bản Activity và Fragment còn trong bộ nhớ sau finish(). Sử dụng LeakCanary — thư viện tự động phát hiện rò rỉ.
Trên máy tính: bật SSL Proxying trong Charles (Proxy → SSL Proxying Settings). Trên thiết bị: cài đặt chứng chỉ CA Charles (chls.pro/ssl) và tin cậy nó trong cài đặt. Trên iOS 13+, bật tin cậy chứng chỉ trong General → About → Certificate Trust Settings. Trên Android 7+, cần cấu hình network_security_config.xml.
Breakpoint dừng thực thi tại một dòng mã cụ thể. Watchpoint dừng thực thi khi giá trị của biến thay đổi. Breakpoint kích hoạt mỗi khi đến dòng đó, watchpoint kích hoạt khi có bất kỳ thay đổi nào trong bộ nhớ được theo dõi. Watchpoint hữu ích để tìm các sửa đổi trường bất ngờ.
Sử dụng Apollo DevTools (tiện ích mở rộng trình duyệt) hoặc Insomnia với hỗ trợ GraphQL. Charles và Proxyman chặn các yêu cầu GraphQL như HTTP POST thông thường — bạn có thể xem truy vấn, biến và phản hồi. Để gỡ lỗi chi tiết — Apollo Client Developer Tools.
Tóm tắt
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.