Detekt is a static code analysis tool for Kotlin that inspects your Android/Kotlin codebase for:
- Code smells
- Performance issues
- Potential memory/context leaks
- Style violations
- Complexity, nesting, duplication, and more
Think of it as Kotlin’s equivalent of Lint or SonarQube, but tailored for Kotlin best practices — and very extendable.
Why Use Detekt in Android App Development?
Benefit | Description |
---|---|
Catch bugs early | Find context leaks, unclosed resources, and anti-patterns |
Maintain clean code | Auto-check complexity, style, naming |
CI-ready | Works in GitHub Actions, GitLab, Bitrise, etc. |
Customizable | Add or disable rules, write your own |
Kotlin-first | No Java compatibility hacks needed |
Step-by-Step Integration in Android Project
Step 1: Apply Detekt Plugin
In your root build.gradle.kts
or build.gradle
:
plugins {
id("io.gitlab.arturbosch.detekt") version "1.23.6"
}
Or use
classpath
in older plugin DSLs.
Step 2: Add Configuration (Optional)
Generate a default configuration file:
./gradlew detektGenerateConfig
This creates:
config/detekt/detekt.yml
You can customize rules, thresholds, and disabled checks here.
Step 3: Run Detekt
Use:
./gradlew detekt
Optional with config:
./gradlew detekt --config config/detekt/detekt.yml
It will output findings in the console and optionally HTML/MD/XML reports.
Useful Detekt Rules (Leak & Jetpack Compose Focused)
1. UseApplicationContext
Flags dangerous use of Activity
context that may lead to leaks.
class Repo(val context: Context) // π« BAD
Use context.applicationContext
.
2. TooManyFunctions
, LargeClass
, LongMethod
Compose-friendly apps with many lambdas often need these enabled to track complexity.
3. UnsafeCallOnNullableType
, CastToNullableType
Helps avoid unexpected crashes from nulls or unsafe casts.
4. ComplexCondition
, NestedBlockDepth
Useful for detecting overly nested logic in state-handling Compose UIs.
5. MagicNumber
, ForbiddenComment
, MaxLineLength
Maintain clean and readable Compose files.
Optional: Use Detekt with Compose + Custom Rules
You can even write custom Detekt rules to:
-
Detect misuse of
remember
orLaunchedEffect
-
Prevent ViewModel holding reference to
Context
-
Flag mutable state misuse like:
var state by mutableStateOf(...) // without snapshot awareness? π₯ Flag it
You’d implement these with Detekt's Rule API.
CI Integration Example (GitHub Actions)
- name: Run Detekt
run: ./gradlew detekt
You can configure it to fail PRs on violation, ensuring team-wide quality.
Best Practices When Using Detekt
Practice | Benefit |
---|---|
Customize detekt.yml |
Tailor rules to team/style guidelines |
Run in CI | Prevent regression and enforce code health |
Use for Context Leak Rules | Prevent common Android lifecycle bugs |
Track complexity & function size | Useful for Compose UI layers |
Extend for custom Compose rules | Detect architecture violations |
Output Formats
-
Console (default)
-
HTML –
build/reports/detekt/detekt.html
-
XML – for tools like SonarQube
-
SARIF – for GitHub Code Scanning
Summary
Feature | Value |
---|---|
Kotlin-first | Yes |
Jetpack Compose friendly | Can flag misuse and complexity |
Leak prevention | Context, state misuse, null safety |
Configurable | Fully customizable rules |
Extendable | Supports custom rule sets |
CI Ready | Easy to integrate in pipelines |
π Useful Links
π’ Feedback: Did you find this article helpful? Let me know your thoughts or suggestions for improvements! Please leave a comment below. I’d love to hear from you! π
Happy coding! π»