Android Lint — вбудований статичний аналізатор коду в Android Studio та Gradle, який перевіряє вихідні файли на відповідність рекомендаціям Google. Lint знаходить потенційні помилки до компіляції: невикористовувані ресурси, проблеми продуктивності, витоки пам'яті та несумісність API. Інструмент аналізує XML, Java та Kotlin файли. Детальніше — на Android Lint Guide.
Головне
Android Lint — інструмент статичного аналізу, що входить до складу Android SDK та Android Studio. Lint сканує вихідний код додатку без його виконання та знаходить проблеми, які компілятор пропускає: невикористовувані ресурси, некоректну локалізацію, потенційні витоки пам'яті, несумісність API з minSdkVersion та порушення рекомендацій Google щодо продуктивності.
Статичний аналіз — метод перевірки програмного забезпечення без фактичного виконання коду. На відміну від компілятора, який перевіряє лише синтаксис та типи, статичний аналізатор шукає логічні помилки, антипатерни та відхилення від кращих практик. Lint виконує понад 200 вбудованих перевірок за категоріями: correctness, performance, security, accessibility, usability та I18N.
Lint працює на кількох рівнях: XML аналіз перевіряє макети (layout), ресурси (strings, colors, dimens), маніфест та конфігураційні файли. Java/Kotlin аналіз — вихідний код на предмет виклику застарілих API, проблем з потоками та витоків контексту. Gradle аналіз — конфігурацію збірки на сумісність версій.
Lint перевірка запускається через Android Studio (Analyze > Inspect Code) або командою Gradle: ./gradlew lint. Результат — HTML-звіт у папці build/reports/lint-results.html та XML-звіт для CI систем. Lint аналізує кожен файл незалежно, застосовуючи набір правил (Issue), кожне з яких має унікальний ID, опис, категорію та рівень серйозності.
Рівні серйозності Lint: Error (помилка — блокує збірку), Warning (попередження — впливає на якість), Informational (інформація — для відома), Ignore (ігнорується за замовчуванням). Рівні налаштовуються в lint.xml. Помилки Lint можна налаштувати так, щоб Gradle збірка падала при їх наявності через lintOptions.abortOnError true.
android {
lintOptions {
abortOnError true
checkAllWarnings true
baselineFile file("lint-baseline.xml")
htmlReport true
xmlReport true
lintConfig file("lint.xml")
}
}
Lint baseline — файл, що фіксує поточні попередження як допустимі. Створюється командою lint --baseline baseline.xml. Після додавання baseline в проєкт Lint повідомляє лише про нові проблеми. Це зручно для впровадження Lint в старий проєкт із сотнями попереджень — команда виправляє помилки поступово.
lint.xml — конфігураційний файл в корені проєкту для налаштування правил Lint. У ньому вказуються ігноровані правила, рівні серйозності та винятки для конкретних файлів або директорій. Файл створюється вручну і застосовується глобально до всіх модулів проєкту. Без lint.xml всі правила працюють з налаштуваннями за замовчуванням.
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<!-- Вимкнути перевірку невикористовуваних ресурсів -->
<issue id="UnusedResources" severity="ignore" />
<!-- Підвищити серйозність витоку контексту -->
<issue id="StaticFieldLeak" severity="error" />
<!-- Ігнорувати в згенерованих файлах -->
<issue id="MissingTranslation" severity="ignore">
<ignore path="build/generated" />
</issue>
</lint>
@SuppressLint — анотація для відключення Lint на рівні методу або класу в Java/Kotlin. Приклад: @SuppressLint("SetTextI18n") для методу, де текст динамічно встановлюється в TextView. Анотація @RequiresApi вказує мінімальний API Level для методу — Lint не буде видавати попередження, якщо minSdk вище вказаного значення.
CI інтеграція Lint — стандартна практика в Android розробці. Команда ./gradlew lint запускає аналіз всіх модулів та генерує звіти. В CI/CD конфігурації (Jenkins, GitLab CI, GitHub Actions) Lint запускається на кожен pull request. При наявності помилок збірка падає, і розробник отримує сповіщення з HTML-звітом Lint.
lint-check:
script:
- ./gradlew lint
artifacts:
paths:
- app/build/reports/lint-results.html
when: always
HTML-звіт Lint містить таблицю всіх знайдених проблем з категорією, ID правила, файлом, рядком та описом. Звіт доступний на CI сервері або публікується як артефакт збірки. XML-звіт (lint-results.xml) використовується для інтеграції з системами аналізу коду (SonarQube, CodeClimate) та автоматичного створення завдань в трекерах (Jira, YouTrack).
Lint в pull request — налаштуйте GitHub Actions або GitLab CI так, щоб Lint запускався автоматично при створенні MR/PR. Якщо Lint знаходить помилки, CI повертає статус failure, і злиття блокується. Це запобігає потраплянню проблемного коду в основну гілку та підтримує якість кодової бази.
Lint категорії охоплюють всі аспекти Android розробки. Google розділяє правила на 12 категорій, кожна відповідає за певний тип проблем. Найважливіші категорії — Correctness, Performance, Security та Accessibility. Розробнику достатньо знати ключові перевірки кожної категорії для ефективної роботи з Lint.
| Категорія | Опис | Приклад правила |
|---|---|---|
| Correctness | Помилки, що впливають на роботу додатку | MissingPermission, WrongConstant |
| Performance | Проблеми продуктивності та пам'яті | UnusedResources, ViewHolder, DrawAllocation |
| Security | Вразливості та порушення безпеки | ExportedContentProvider, WorldReadableFiles |
| Accessibility | Проблеми доступності для користувачів | ContentDescription, TouchTargetSize |
| Usability | Юзабіліті та користувацький досвід | NotSibling, BackButton, HardcodedText |
| I18N | Інтернаціоналізація та локалізація | MissingTranslation, ExtraTranslation |
Performance правила — найкорисніші на практиці. UnusedResources знаходить ресурси, оголошені в XML, але не використовувані в коді. ViewHolder перевіряє, що в адаптерах RecyclerView використовується патерн ViewHolder. DrawAllocation попереджає про створення об'єктів в методі onDraw. Усунення цих проблем знижує розмір APK та прискорює роботу додатку.
Security правила обов'язкові для публікованих додатків. ExportedContentProvider перевіряє, чи не експортовано ContentProvider без захисту. WorldReadableFiles попереджає про створення файлів, доступних всім додаткам. AllowBackup перевіряє прапорець allowBackup в маніфесті — його рекомендується вимикати для забезпечення безпеки даних.
Часті запитання
Компілятор перевіряє синтаксис та типи, транслюючи код в байт-код для виконання. Lint аналізує код без компіляції та знаходить логічні проблеми, які компілятор пропускає: невикористовувані змінні, витоки ресурсів, проблеми локалізації, порушення продуктивності та несумісність API з minSdkVersion. Lint доповнює компілятор, але не замінює його.
В XML файлах використовуйте атрибут tools:ignore з ID правила: tools:ignore="UnusedResources". В Java/Kotlin додайте анотацію @SuppressLint на метод або клас: @SuppressLint("SetTextI18n"). Для всієї директорії налаштуйте lint.xml з вузлом issue та severity="ignore". Для всього проєкту налаштуйте lint.xml в корені модуля.
Lint baseline — XML-файл, що фіксує поточні Lint попередження як допустимі. Створюється командою ./gradlew lint -Pbaseline або через lintOptions.baselineFile в build.gradle. Після додавання baseline Lint повідомляє лише про нові проблеми. Це зручно для впровадження Lint в проєкти з успадкованим кодом — команда виправляє помилки ітераційно.
Створіть новий Java/Kotlin модуль із залежностями від lint-api та lint-checks з бібліотеки com.android.tools.lint. Реалізуйте клас Detector для пошуку проблем та клас Issue для їх опису. Зберіть модуль в JAR, розмістіть в папці lintLibs вашого Android проєкту. Android Studio автоматично підхопить кастомні правила.
Lint знаходить проблеми, які компілятор не бачить: витоки контексту (Activity, Fragment), несумісність API з minSdkVersion, проблеми конфігурації Gradle, занадто великі PNG іконки, відсутність альтернативних ресурсів для різних мов та конфігурацій екрану. Google Play рекомендує Lint перед публікацією. Без Lint додаток може вилітати на старих пристроях.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.