Android Lint — một trình phân tích mã tĩnh được tích hợp trong Android Studio và Gradle, kiểm tra các tệp nguồn theo khuyến nghị của Google. Lint tìm ra các lỗi tiềm ẩn trước khi biên dịch: tài nguyên không được sử dụng, vấn đề hiệu suất, rò rỉ bộ nhớ và không tương thích API. Công cụ này phân tích các tệp XML, Java và Kotlin. Tìm hiểu thêm tại Android Lint Guide.
Những điểm chính
Android Lint là một công cụ phân tích tĩnh được bao gồm trong SDK Android và Android Studio. Lint quét mã nguồn của ứng dụng mà không thực thi nó và tìm ra các vấn đề mà trình biên dịch bỏ sót: tài nguyên không được sử dụng, bản địa hóa không chính xác, rò rỉ bộ nhớ tiềm ẩn, không tương thích API với minSdkVersion và vi phạm các khuyến nghị về hiệu suất của Google.
Phân tích tĩnh là một phương pháp xác minh phần mềm không yêu cầu thực thi mã thực tế. Không giống như trình biên dịch chỉ kiểm tra cú pháp và kiểu, trình phân tích tĩnh tìm kiếm lỗi logic, phản mẫu và sai lệch so với các phương pháp hay nhất. Lint thực hiện hơn 200 kiểm tra tích hợp theo các danh mục: tính đúng đắn, hiệu suất, bảo mật, khả năng tiếp cận, khả năng sử dụng và I18N.
Lint hoạt động ở nhiều cấp độ: Phân tích XML kiểm tra bố cục, tài nguyên (strings, colors, dimens), tệp kê khai và tệp cấu hình. Phân tích Java/Kotlin kiểm tra mã nguồn để tìm các lệnh gọi API lỗi thời, vấn đề về luồng và rò rỉ ngữ cảnh. Phân tích Gradle kiểm tra cấu hình xây dựng để tương thích phiên bản.
Kiểm tra Lint được khởi chạy qua Android Studio (Analyze > Inspect Code) hoặc bằng lệnh Gradle: ./gradlew lint. Kết quả là báo cáo HTML trong thư mục build/reports/lint-results.html và báo cáo XML cho hệ thống CI. Lint phân tích từng tệp một cách độc lập, áp dụng một bộ quy tắc (Issues), mỗi quy tắc có ID, mô tả, danh mục và mức độ nghiêm trọng riêng.
Mức độ nghiêm trọng của Lint: Error (lỗi — chặn xây dựng), Warning (cảnh báo — ảnh hưởng đến chất lượng), Informational (thông tin — để tham khảo), Ignore (bỏ qua theo mặc định). Các mức được cấu hình trong lint.xml. Lỗi Lint có thể được cấu hình để làm hỏng bản dựng Gradle khi có mặt thông qua lintOptions.abortOnError true.
android {
lintOptions {
abortOnError true
checkAllWarnings true
baselineFile file("lint-baseline.xml")
htmlReport true
xmlReport true
lintConfig file("lint.xml")
}
}
Lint baseline — một tệp đánh dấu các cảnh báo hiện tại là có thể chấp nhận được. Được tạo bằng lệnh lint --baseline baseline.xml. Sau khi thêm baseline vào dự án, Lint chỉ báo cáo các vấn đề mới. Điều này thuận tiện cho việc giới thiệu Lint vào một dự án cũ với hàng trăm cảnh báo — nhóm sẽ sửa lỗi dần dần.
lint.xml — một tệp cấu hình trong thư mục gốc của dự án để tùy chỉnh quy tắc Lint. Nó chỉ định các quy tắc bị bỏ qua, mức độ nghiêm trọng và ngoại lệ cho các tệp hoặc thư mục cụ thể. Tệp được tạo thủ công và áp dụng toàn cầu cho tất cả các mô-đun của dự án. Nếu không có lint.xml, tất cả các quy tắc đều hoạt động với cài đặt mặc định.
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<!-- Vô hiệu hóa kiểm tra tài nguyên không sử dụng -->
<issue id="UnusedResources" severity="ignore" />
<!-- Tăng mức độ nghiêm trọng của rò rỉ ngữ cảnh -->
<issue id="StaticFieldLeak" severity="error" />
<!-- Bỏ qua trong các tệp được tạo -->
<issue id="MissingTranslation" severity="ignore">
<ignore path="build/generated" />
</issue>
</lint>
@SuppressLint — một chú thích để vô hiệu hóa Lint ở cấp phương thức hoặc lớp trong Java/Kotlin. Ví dụ: @SuppressLint("SetTextI18n") cho một phương thức nơi văn bản được đặt động trong TextView. Chú thích @RequiresApi chỉ định Cấp độ API tối thiểu cho một phương thức — Lint sẽ không đưa ra cảnh báo nếu minSdk vượt quá giá trị được chỉ định.
Tích hợp CI của Lint là một thực tiễn tiêu chuẩn trong phát triển Android. Lệnh ./gradlew lint chạy phân tích trên tất cả các mô-đun và tạo báo cáo. Trong cấu hình CI/CD (Jenkins, GitLab CI, GitHub Actions), Lint chạy trên mọi pull request. Nếu tìm thấy lỗi, bản dựng sẽ thất bại và nhà phát triển nhận được thông báo với báo cáo HTML của Lint.
lint-check:
script:
- ./gradlew lint
artifacts:
paths:
- app/build/reports/lint-results.html
when: always
Báo cáo HTML Lint chứa bảng tất cả các vấn đề được tìm thấy với danh mục, ID quy tắc, tệp, dòng và mô tả. Báo cáo có sẵn trên máy chủ CI hoặc được xuất bản dưới dạng tạo phẩm xây dựng. Báo cáo XML (lint-results.xml) được sử dụng để tích hợp với các hệ thống phân tích mã (SonarQube, CodeClimate) và tự động tạo nhiệm vụ trong các trình theo dõi (Jira, YouTrack).
Lint trong pull request — cấu hình GitHub Actions hoặc GitLab CI để Lint chạy tự động khi MR/PR được tạo. Nếu Lint tìm thấy lỗi, CI trả về trạng thái thất bại và việc hợp nhất bị chặn. Điều này ngăn mã có vấn đề xâm nhập vào nhánh chính và duy trì chất lượng cơ sở mã.
Các danh mục Lint bao gồm tất cả các khía cạnh của phát triển Android. Google chia các quy tắc thành 12 danh mục, mỗi danh mục chịu trách nhiệm cho một loại vấn đề cụ thể. Các danh mục quan trọng nhất là Correctness, Performance, Security và Accessibility. Các nhà phát triển cần biết các kiểm tra chính của mỗi danh mục để làm việc hiệu quả với Lint.
| Danh mục | Mô tả | Quy tắc ví dụ |
|---|---|---|
| Correctness | Lỗi ảnh hưởng đến chức năng ứng dụng | MissingPermission, WrongConstant |
| Performance | Vấn đề về hiệu suất và bộ nhớ | UnusedResources, ViewHolder, DrawAllocation |
| Security | Lỗ hổng và vi phạm bảo mật | ExportedContentProvider, WorldReadableFiles |
| Accessibility | Vấn đề khả năng tiếp cận cho người dùng | ContentDescription, TouchTargetSize |
| Usability | Khả năng sử dụng và trải nghiệm người dùng | NotSibling, BackButton, HardcodedText |
| I18N | Quốc tế hóa và bản địa hóa | MissingTranslation, ExtraTranslation |
Các quy tắc hiệu suất là hữu ích nhất trong thực tế. UnusedResources tìm tài nguyên được khai báo trong XML nhưng không được sử dụng trong mã. ViewHolder kiểm tra xem mẫu ViewHolder có được sử dụng trong bộ điều hợp RecyclerView hay không. DrawAllocation cảnh báo về việc tạo đối tượng trong phương thức onDraw. Sửa các vấn đề này giúp giảm kích thước APK và tăng tốc ứng dụng.
Các quy tắc bảo mật là bắt buộc đối với các ứng dụng đã xuất bản. ExportedContentProvider kiểm tra xem ContentProvider có được xuất mà không có bảo vệ hay không. WorldReadableFiles cảnh báo về việc tạo tệp mà tất cả ứng dụng có thể truy cập. AllowBackup kiểm tra cờ allowBackup trong tệp kê khai — nên tắt nó để bảo mật dữ liệu.
Các câu hỏi thường gặp
Trình biên dịch kiểm tra cú pháp và kiểu, dịch mã thành bytecode để thực thi. Lint phân tích mã mà không cần biên dịch và tìm các vấn đề logic mà trình biên dịch bỏ sót: biến không sử dụng, rò rỉ tài nguyên, vấn đề bản địa hóa, vi phạm hiệu suất và không tương thích API với minSdkVersion. Lint bổ sung cho trình biên dịch nhưng không thay thế nó.
Trong tệp XML, sử dụng thuộc tính tools:ignore với ID quy tắc: tools:ignore="UnusedResources". Trong Java/Kotlin, thêm chú thích @SuppressLint vào phương thức hoặc lớp: @SuppressLint("SetTextI18n"). Cho toàn bộ thư mục, cấu hình lint.xml với nút issue và severity="ignore". Cho toàn bộ dự án, cấu hình lint.xml trong thư mục gốc của mô-đun.
Lint baseline là một tệp XML đánh dấu các cảnh báo Lint hiện tại là có thể chấp nhận được. Nó được tạo bằng lệnh ./gradlew lint -Pbaseline hoặc thông qua lintOptions.baselineFile trong build.gradle. Sau khi thêm baseline, Lint chỉ báo cáo các vấn đề mới. Điều này thuận tiện cho việc giới thiệu Lint vào các dự án có mã kế thừa — nhóm sửa lỗi theo từng bước.
Tạo một mô-đun Java/Kotlin mới với các phụ thuộc vào lint-api và lint-checks từ thư viện com.android.tools.lint. Triển khai lớp Detector để tìm vấn đề và lớp Issue để mô tả chúng. Xây dựng mô-đun thành JAR, đặt nó trong thư mục lintLibs của dự án Android của bạn. Android Studio sẽ tự động nhận các quy tắc tùy chỉnh.
Lint tìm các vấn đề mà trình biên dịch không thấy: rò rỉ ngữ cảnh (Activity, Fragment), không tương thích API với minSdkVersion, vấn đề cấu hình Gradle, biểu tượng PNG quá lớn, thiếu tài nguyên thay thế cho các ngôn ngữ và cấu hình màn hình khác nhau. Google Play khuyến nghị Lint trước khi xuất bản. Nếu không có Lint, ứng dụng có thể bị treo trên các thiết bị cũ.
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.
Đọc thêm