Android Lint — Android Studio 및 Gradle에 내장된 정적 코드 분석기로, Google의 권장 사항에 따라 소스 파일을 검사합니다. Lint는 컴파일 전에 잠재적인 오류를 찾습니다: 사용하지 않는 리소스, 성능 문제, 메모리 누수 및 API 비호환성. 이 도구는 XML, Java 및 Kotlin 파일을 분석합니다. 자세한 내용은 Android Lint Guide에서 확인하세요.
주요 내용
Android Lint는 Android SDK 및 Android Studio에 포함된 정적 분석 도구입니다. Lint는 애플리케이션의 소스 코드를 실행하지 않고 스캔하여 컴파일러가 놓치는 문제를 찾습니다: 사용하지 않는 리소스, 잘못된 지역화, 잠재적 메모리 누수, minSdkVersion과의 API 비호환성, Google의 성능 권장 사항 위반.
정적 분석은 실제 코드 실행이 필요 없는 소프트웨어 검증 방법입니다. 구문과 유형만 검사하는 컴파일러와 달리, 정적 분석기는 논리적 오류, 안티 패턴 및 모범 사례에서의 이탈을 찾습니다. Lint는 카테고리별로 200개 이상의 내장 검사를 수행합니다: correctness, performance, security, accessibility, usability 및 I18N.
Lint는 여러 수준에서 작동합니다: XML 분석은 레이아웃, 리소스(strings, colors, dimens), 매니페스트 및 구성 파일을 검사합니다. Java/Kotlin 분석은 소스 코드에서 비권장 API 호출, 스레딩 문제 및 컨텍스트 누수를 검사합니다. Gradle 분석은 버전 호환성을 위해 빌드 구성을 검사합니다.
Lint 검사는 Android Studio(Analyze > Inspect Code) 또는 Gradle 명령을 통해 시작됩니다: ./gradlew lint. 결과는 build/reports/lint-results.html 폴더의 HTML 보고서와 CI 시스템용 XML 보고서입니다. Lint는 각 파일을 독립적으로 분석하며, 각각 고유한 ID, 설명, 카테고리 및 심각도 수준을 가진 규칙 세트(Issue)를 적용합니다.
Lint 심각도 수준: Error(오류 — 빌드 차단), Warning(경고 — 품질에 영향), Informational(정보 — 참고용), Ignore(기본적으로 무시). 수준은 lint.xml에서 구성됩니다. Lint 오류는 lintOptions.abortOnError true를 통해 Gradle 빌드를 실패하도록 구성할 수 있습니다.
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 — Java/Kotlin에서 메서드 또는 클래스 수준에서 Lint를 비활성화하는 애너테이션입니다. 예: @SuppressLint("SetTextI18n")는 TextView에서 텍스트가 동적으로 설정되는 메서드에 사용됩니다. @RequiresApi 애너테이션은 메서드의 최소 API 수준을 지정합니다 — minSdk가 지정된 값을 초과하면 Lint가 경고를 발행하지 않습니다.
Lint의 CI 통합은 Android 개발의 표준 관행입니다. ./gradlew lint 명령은 모든 모듈의 분석을 실행하고 보고서를 생성합니다. CI/CD 구성(Jenkins, GitLab CI, GitHub Actions)에서 Lint는 각 풀 리퀘스트에서 실행됩니다. 오류가 발견되면 빌드가 실패하고 개발자는 Lint HTML 보고서와 함께 알림을 받습니다.
lint-check:
script:
- ./gradlew lint
artifacts:
paths:
- app/build/reports/lint-results.html
when: always
Lint HTML 보고서에는 카테고리, 규칙 ID, 파일, 줄 및 설명과 함께 발견된 모든 문제의 표가 포함됩니다. 보고서는 CI 서버에서 확인하거나 빌드 아티팩트로 게시됩니다. XML 보고서(lint-results.xml)는 코드 분석 시스템(SonarQube, CodeClimate)과의 통합 및 트래커(Jira, YouTrack)에서 자동 작업 생성에 사용됩니다.
풀 리퀘스트에서의 Lint — MR/PR이 생성될 때 Lint가 자동으로 실행되도록 GitHub Actions 또는 GitLab CI를 구성하세요. Lint가 오류를 찾으면 CI가 실패 상태를 반환하고 병합이 차단됩니다. 이는 문제가 있는 코드가 메인 브랜치에 들어가는 것을 방지하고 코드베이스 품질을 유지합니다.
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 |
성능 규칙은 실제로 가장 유용합니다. UnusedResources는 XML에 선언되었지만 코드에서 사용되지 않는 리소스를 찾습니다. ViewHolder는 RecyclerView 어댑터에서 ViewHolder 패턴이 사용되는지 확인합니다. DrawAllocation은 onDraw 메서드에서 객체 생성에 대해 경고합니다. 이러한 문제를 수정하면 APK 크기가 줄어들고 애플리케이션 속도가 빨라집니다.
보안 규칙은 게시된 애플리케이션에 필수입니다. ExportedContentProvider는 ContentProvider가 보호 없이 내보내졌는지 확인합니다. WorldReadableFiles는 모든 애플리케이션이 액세스할 수 있는 파일 생성에 대해 경고합니다. AllowBackup은 매니페스트의 allowBackup 플래그를 확인합니다 — 데이터 보안을 위해 비활성화하는 것이 좋습니다.
자주 묻는 질문
컴파일러는 구문과 유형을 검사하고 코드를 실행용 바이트코드로 변환합니다. Lint는 컴파일 없이 코드를 분석하고 컴파일러가 놓치는 논리적 문제를 찾습니다: 사용하지 않는 변수, 리소스 누수, 지역화 문제, 성능 위반 및 minSdkVersion과의 API 비호환성. Lint는 컴파일러를 보완하지만 대체하지는 않습니다.
XML 파일에서는 규칙 ID와 함께 tools:ignore 속성을 사용합니다: tools:ignore="UnusedResources". Java/Kotlin에서는 메서드나 클래스에 @SuppressLint 애너테이션을 추가합니다: @SuppressLint("SetTextI18n"). 전체 디렉터리의 경우, issue 노드와 severity="ignore"를 사용하여 lint.xml을 구성합니다. 전체 프로젝트의 경우, 모듈 루트에서 lint.xml을 구성합니다.
Lint baseline은 현재 Lint 경고를 허용 가능한 것으로 표시하는 XML 파일입니다. ./gradlew lint -Pbaseline 명령 또는 build.gradle의 lintOptions.baselineFile을 통해 생성됩니다. baseline을 추가하면 Lint는 새로운 문제만 보고합니다. 이는 레거시 코드가 있는 프로젝트에 Lint를 도입할 때 편리합니다 — 팀이 반복적으로 오류를 수정합니다.
com.android.tools.lint 라이브러리의 lint-api 및 lint-checks에 대한 종속성이 있는 새 Java/Kotlin 모듈을 만듭니다. 문제를 찾기 위한 Detector 클래스와 문제를 설명하기 위한 Issue 클래스를 구현합니다. 모듈을 JAR로 빌드하고 Android 프로젝트의 lintLibs 폴더에 배치합니다. Android Studio가 자동으로 사용자 지정 규칙을 인식합니다.
Lint는 컴파일러가 볼 수 없는 문제를 찾습니다: 컨텍스트 누수(Activity, Fragment), minSdkVersion과의 API 비호환성, Gradle 구성 문제, 너무 큰 PNG 아이콘, 다양한 언어 및 화면 구성을 위한 대체 리소스 부족. Google Play는 게시 전에 Lint를 권장합니다. Lint가 없으면 앱이 오래된 기기에서 충돌할 수 있습니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.