LeakCanary: phát hiện rò rỉ bộ nhớ dành cho dev Android
LeakCanary là thư viện của Square bắt rò rỉ bộ nhớ Android — nó phát hiện một Activity, Fragment hay View bị giữ lại trước khi thành OutOfMemoryError ngoài production. Nó theo dõi object lẽ ra phải được garbage collector thu hồi, dump heap khi object còn sót lại, rồi lần theo chuỗi tham chiếu về thứ đang giữ nó. Với dự án Kotlin hay Java, thêm nó lúc phát triển gần như không có lý do để từ chối — chi phí thấp, trace đủ cụ thể để sửa ngay.
LeakCanary là gì?
LeakCanary là thư viện Android mã nguồn mở do Square duy trì, phát hiện rò rỉ bộ nhớ ngay trong lúc bạn phát triển app chứ không phải sau khi app đã ra mắt. Nó gắn vào lifecycle của Android để theo dõi các object — một Activity đã bị destroy, một Fragment đã bị clear — lẽ ra phải được garbage collector thu hồi. Khi một object còn sót lại, LeakCanary dump heap và lần theo chuỗi tham chiếu từ một GC root xuống tới object đang bị kẹt.
Tính năng chính của LeakCanary
- ✓Tự động phát hiện Activity, Fragment và View bị giữ lại trong lúc phát triển, không cần chạy profiler thủ công
- ✓Tích hợp sẵn dump heap và phân tích hprof, không cần gắn thêm công cụ phân tích riêng
- ✓In ra leak trace cho thấy chuỗi tham chiếu chính xác từ một GC root tới object bị rò rỉ
- ✓Hoạt động như nhau trên dự án Kotlin lẫn Java vì nó gắn vào lifecycle của Android, không phụ thuộc ngôn ngữ
- ✓Giấy phép Apache-2.0 nên có thể đưa vào debug build của app thương mại mà không cần bàn về pháp lý
- ✓Chỉ là một dependency Gradle — không có service riêng nào phải chạy
Khi nào nên dùng LeakCanary
- •Debug một app có mức dùng bộ nhớ cứ tăng dần qua một phiên sử dụng dài
- •Bắt một Activity hoặc Fragment bị rò rỉ ngay sau khi refactor code điều hướng hoặc lifecycle
- •Chạy liên tục trong lúc phát triển để rò rỉ lộ ra trước khi tới tay QA hoặc gây crash ngoài production
- •Kiểm tra xem một SDK bên thứ ba hay custom View có đang giữ tham chiếu quá lifecycle của Activity hay không
Thêm LeakCanary vào dự án Android
LeakCanary được thêm vào như một dependency Gradle trong module app — không cần tài khoản, không cần service, không có bước cài đặt riêng. Nguồn dữ liệu ở đây không nêu chính xác tọa độ dependency hay số phiên bản hiện tại, nên hãy lấy dòng Gradle chính xác từ tài liệu chính thức tại square.github.io/leakcanary thay vì đoán phiên bản ở đây. Sau khi có trong build, phần lớn app không cần thêm code setup nào để bắt đầu thấy leak trace.
LeakCanary hoạt động như thế nào
LeakCanary theo dõi các object lẽ ra phải được garbage collector thu hồi — một Activity hay Fragment đã bị destroy, một ViewModel đã bị clear, một View đã bị gỡ khỏi parent. Nếu một trong số đó vẫn còn tồn tại sau khoảng thời gian đáng lẽ đã bị thu hồi, LeakCanary kích hoạt dump heap và ghi ra một file hprof. Sau đó nó phân tích file dump này và tính đường đi ngắn nhất từ một GC root tới object bị giữ lại — chính là leak trace — chỉ ra tham chiếu cụ thể trong code đang giữ nó sống. Bạn thấy kết quả dưới dạng notification ngay trong lúc phát triển. Không cần chạy profiler riêng.
Điểm mạnh
- ✓Tự chạy ngay khi đã có trong project — không cần nhớ bật một phiên profiler thủ công
- ✓Leak trace chỉ thẳng vào tham chiếu đang giữ object, không chỉ là một biểu đồ dùng bộ nhớ chung chung
- ✓Giấy phép Apache-2.0 giúp dùng được trong app thương mại mà không cần thêm bước rà soát pháp lý
- ✓Cách phát hiện như nhau dù app viết bằng Kotlin, Java, hay cả hai
Hạn chế của LeakCanary
- △Nguồn dữ liệu này không liệt kê phạm vi phiên bản API Android được hỗ trợ — cần xác nhận khả năng tương thích qua tài liệu chính thức trước khi thêm vào app chạy trên API cũ
- △Dump heap và phân tích heap có chi phí thật, đó là lý do nó thuộc về debug build chứ không phải release build
- △Các bước cài đặt chi tiết và số phiên bản hiện tại không có trong tóm tắt GitHub này, nên lần setup đầu tiên cần tra tài liệu chính thức của project
Lựa chọn thay thế cho phân tích bộ nhớ Android
Câu hỏi thường gặp
LeakCanary được thiết kế để chạy trong debug build lúc phát triển, không phải trong release build mà người dùng cài đặt — chi phí dump heap và phân tích không phải thứ bạn muốn đưa lên production. Chỉ dùng trong lúc phát triển là cách setup tiêu chuẩn cho loại công cụ này.
Nguồn GitHub dùng cho bài review này không liệt kê API level tối thiểu hay tối đa cụ thể. LeakCanary nhắm tới quá trình phát triển Android hiện tại, nên hãy kiểm tra tài liệu chính thức tại square.github.io/leakcanary để biết phạm vi phiên bản chính xác trước khi dựa vào nó.
LeakCanary dùng giấy phép Apache-2.0, một giấy phép mã nguồn mở khá thoáng cho phép dùng thương mại trong một app trả phí hoặc closed-source mà không phải trả phí bản quyền. Bạn vẫn cần tuân theo các điều khoản attribution tiêu chuẩn của giấy phép này.
LeakCanary theo dõi các object lẽ ra phải được garbage collector thu hồi khi không còn cần dùng nữa, chẳng hạn một Activity đã bị destroy. Nếu object đó vẫn còn trong bộ nhớ sau khi đáng lẽ đã bị thu hồi, LeakCanary dump heap ra một file hprof và phân tích để lần ra chuỗi tham chiếu chính xác đang giữ object đó sống.
LeakCanary theo dõi các nguồn rò rỉ phổ biến trên Android, gồm Activity, Fragment và View tồn tại lâu hơn lifecycle mà chúng đáng lẽ phải có, cộng với bất kỳ object nào khác mà code của bạn đăng ký theo dõi. Kết quả là một leak trace cho thấy tham chiếu nào đang giữ từng object trong bộ nhớ.
LeakCanary hoạt động với cả dự án Android viết bằng Kotlin và Java vì nó gắn vào lifecycle của framework Android chứ không phụ thuộc vào một ngôn ngữ JVM cụ thể. Theo metadata GitHub, Kotlin là ngôn ngữ mà bản thân thư viện này được viết, nhưng điều đó không giới hạn ngôn ngữ mà app của bạn dùng để gọi nó.
Vấn đề mà LeakCanary giải quyết
Rò rỉ bộ nhớ trong một app Android âm thầm cho tới khi nó không còn âm thầm nữa — một app giữ lại một Activity hay Fragment đã bị destroy sẽ ngốn dần bộ nhớ khả dụng qua một phiên sử dụng, và kiểu lỗi thường gặp là một OutOfMemoryError ngoài production với stack trace không nói rõ object nào gây ra. Bắt được điều đó ngay trong lúc phát triển, trước khi nó biến thành một crash report, chính là khoảng trống cụ thể mà LeakCanary lấp vào: nó gọi tên tham chiếu đang rò rỉ ngay khi bạn vẫn đang viết đoạn code gây ra rò rỉ đó.
Nên dùng LeakCanary khi nào — và khi nào nên bỏ qua
Một team đang phát hành app Android bằng Kotlin hoặc Java nên có LeakCanary trong debug build — chi phí setup thấp hơn nhiều so với việc lần mò một crash report OutOfMemoryError mà không có leak trace đi kèm. Bỏ qua nó, hoặc ít nhất đừng chỉ dựa vào nó, nếu bạn đang xây một library hay SDK để chạy trong app của người khác; công cụ này được thiết kế quanh vòng lặp phát triển của chính app bạn, không phải thứ bạn đóng gói gửi cho người dùng cuối. Nó cũng không phải công cụ đúng cho một vấn đề hiệu năng hay CPU diện rộng — đó là việc của một profiler, không phải của một công cụ bắt rò rỉ.
Repo liên quan
Chưa chắc leakcanary có hợp với bạn?
Để ChatGPT, Claude hoặc Perplexity tìm hiểu giúp — bấm bên dưới và xem AI nói gì về leakcanary.
