Thank you for your interest in contributing! This project welcomes bug reports, feature requests, documentation improvements, and pull requests.
- Use the issue templates for bug reports and feature requests.
- For IDE plugin freezes or performance problems, please attach the Android Studio thread dumps (Help → Collect Logs and Diagnostic Data) — they make issues diagnosable in one pass.
- For Gradle plugin issues, include your Kotlin/AGP versions and the relevant
composeStabilityAnalyzer { ... }configuration.
The project requires JDK 17+ and builds with the bundled Gradle wrapper. Kotlin and AGP versions are pinned in gradle/libs.versions.toml.
# Build everything and publish to Maven Local (required before building the sample app)
./gradlew spotlessApply publishToMavenLocal :app:assembleDebug -x test -PRELEASE_SIGNING_ENABLED=falseThe IntelliJ/Android Studio plugin is a separate IntelliJ Platform build:
./gradlew :stability-runtime:publishToMavenLocal -x test -PRELEASE_SIGNING_ENABLED=false
cd compose-stability-analyzer-idea && ../gradlew buildPluginThe sample app resolves the Gradle plugin from Maven Local (it shadows Maven Central for the same version), so always publish locally before building :app.
| Module | What it is |
|---|---|
stability-compiler |
K2 compiler plugin (FIR checks + IR instrumentation) |
stability-runtime |
KMP runtime emitting recomposition logs |
stability-gradle |
Gradle plugin (composeStabilityAnalyzer {} DSL, stabilityDump/stabilityCheck) |
stability-lint |
Android Lint rules, packaged into the runtime AAR |
compose-stability-analyzer-idea |
IntelliJ/Android Studio plugin (separate build) |
compiler-tests |
Kotlin compiler test framework suite |
app, app-model |
Sample app for end-to-end verification |
- Format: run
./gradlew spotlessApply— CI fails on formatting violations, and Spotless also applies the license header to new files. - API dumps: if you changed any public API in a published module, run
./gradlew apiDumpand commit the updatedapi/*.apifiles. - Tests: run the suites relevant to your change:
./gradlew :stability-runtime:jvmTest :stability-gradle:test :stability-compiler:test :compiler-tests:test- IDE plugin:
cd compose-stability-analyzer-idea && ../gradlew test
- Compiler golden data: if your change affects generated IR, regenerate snapshots with
./gradlew :compiler-tests:test -Pupdate.test.data(the regenerating run reports failures while writing; the next run passes). Never hand-edit.txtsnapshots or the generated JUnit classes undercompiler-tests/src/test/java/.
- The logcat output format (
stability-runtimeloggers): it is a wire protocol parsed by the IDE plugin'sLogcatParser. Header lines may only gain trailing optional tokens; changing or reordering existing tokens breaks older IDE/runtime combinations. - Stability inference (
stability-compiler/ IDE plugin): the compiler's and the IDE's inference must stay in sync, including the known-stable type lists. - AGP types in
stability-gradle: AGP iscompileOnlyand its types may only be referenced insideAndroidStabilityTaskRegistrar, so projects without AGP keep working. - Versions:
gradle.propertiesVERSION_NAME, theVERSIONconstant inStabilityAnalyzerGradlePlugin,gradle/libs.versions.toml, and the IDE plugin's version/runtime dependency must move together.
All submissions, including submissions by project members, require review. We use GitHub pull requests for this purpose. Consult GitHub Help for more information on using pull requests.
By contributing, you agree that your contributions will be licensed under the Apache License 2.0.