Android Lint — встроенный статический анализатор кода в Android Studio и Gradle, проверяющий исходные файлы на соответствие рекомендациям Google. Lint находит потенциальные ошибки до компиляции: неиспользуемые ресурсы, проблемы производительности, утечки памяти и несовместимость API. Инструмент анализирует XML, Java и Kotlin файлы. Подробнее — на Android Lint Guide.
Главное
Android Lint — инструмент статического анализа, входящий в состав Android SDK и Android Studio. Lint сканирует исходный код приложения без его выполнения и находит проблемы, которые компилятор пропускает: неиспользуемые ресурсы, некорректную локализацию, потенциальные утечки памяти, несовместимость API c 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 c minSdkVersion, проблемы конфигурации Gradle, слишком большие PNG иконки, отсутствие альтернативных ресурсов для разных языков и конфигураций экрана. Google Play рекомендует Lint перед публикацией. Без Lint приложение может вылетать на старых устройствах.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также