Dependency Impact Report

KMP Impact Analyzer — Static dependency propagation analysis
com.android.application  8.5.0 8.13.2
0
Impacted files
0/90 (0%)
90
Total files
0 direct · 0 transitive
3
Expect/actual pairs
3 detected · 0 affected
1
Impacted screens
6 surfaces explored
P

Pipeline Execution

Summary of the 5 analysis phases
1
Shadow Build
✓ Completed
2
Static Analysis
✓ 0 files
3
Dynamic Analysis
✓ 1 differences
4
Consolidation
✓ 1 screen(s)
5
Visualization
✓ CodeCharta
1

Shadow Build

BEFORE and AFTER copies of the project were created, modifying the dependency version
Before — libs.versions.toml
[versions]
agp = "8.5.0"
kotlin = "2.0.21"
activityCompose = "1.9.0"
compose = "1.6.10"
composeCompiler = "1.5.14"
coroutines = "1.8.0"
serialization = "1.7.0"
mviKotlin = "3.3.0"
decompose = "2.1.4-compose-experimental"
essenty = "1.2.0"
ktor = "2.3.10"
sqlDelight = "2.0.0"
koin = "3.5.6"
imageLoader = "1.8.0"
logbackClassic = "1.2.11"
kotlinWrappersBom = "1.0.0-pre.641"
touchlab = "2.0.5"
compileSdk = "34"
targetSdk = "34"
minSdk = "24"
appMajorVersion = "1"
appMinorVersion = "0"
appPatchVersion = "0"
appVersionCode = "1"

[libraries]
# Org.JetBrains.Kotlinx
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" }

# Org.JetBrains.KotlinWrappers
kotlin-wrappers-bom = { module = "org.jetbrains.kotlin-wrappers:kotlin-wrappers-bom", version.ref = "kotlinWrappersBom" }
kotlin-styled = { module = "org.jetbrains.kotlin-wrappers:kotlin-styled" } # Uses BOM

# Androidx.Activity
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activityCompose" }

# Io.Ktor
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
ktor-client-contentNegotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" }
ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" }
ktor-client-android = { module = "io.ktor:ktor-client-android", version.ref = "ktor" }
ktor-client-darwin = { module = "io.ktor:ktor-client-darwin", version.ref = "ktor" }
ktor-client-java = { module = "io.ktor:ktor-client-java", version.ref = "ktor" }
ktor-client-js = { module = "io.ktor:ktor-client-js", version.ref = "ktor" }

# Logback
logback-classic = { module = "ch.qos.logback:logback-classic", version.ref = "logbackClassic" }

# CashApp.SQLDelight
sqldelight-gradle-plugin = { module = "app.cash.sqldelight:gradle-plugin", version.ref = "sqlDelight" } # This is a plugin, will also add to [plugins]
sqldelight-android-driver = { module = "app.cash.sqldelight:android-driver", version.ref = "sqlDelight" }
sqldelight-sqlite-driver = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqlDelight" }
sqldelight-native-driver = { module = "app.cash.sqldelight:native-driver", version.ref = "sqlDelight" }
sqldelight-sqljs-driver = { module = "app.cash.sqldelight:sqljs-driver", version.ref = "sqlDelight" }
sqldelight-coroutines-extensions = { module = "app.cash.sqldelight:coroutines-extensions", version.ref = "sqlDelight" }
sqldelight-primitive-adapters = { module = "app.cash.sqldelight:primitive-adapters", version.ref = "sqlDelight" }

# Koin
koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" }
koin-test = { module = "io.insert-koin:koin-test", version.ref = "koin" }
koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" }

# ArkIvanov.MVIKotlin
mvikotlin = { module = "com.arkivanov.mvikotlin:mvikotlin", version.ref = "mviKotlin" }
mvikotlin-main = { module = "com.arkivanov.mvikotlin:mvikotlin-main", version.ref = "mviKotlin" }
mvikotlin-extensions-coroutines = { module = "com.arkivanov.mvikotlin:mvikotlin-extensions-coroutines", version.ref = "mviKotlin" }

# ArkIvanov.Decompose
decompose = { module = "com.arkivanov.decompose:decompose", version.ref = "decompose" }
decompose-extensions-compose = { module = "com.arkivanov.decompose:extensions-compose-jetbrains", version.ref = "decompose" }

# ArkIvanov.Essenty
essenty-lifecycle = { module = "com.arkivanov.essenty:lifecycle", version.ref = "essenty" }

# Github
imageLoader = { module = "io.github.qdsfdhvh:image-loader", version.ref = "imageLoader" }

# Touchlab
touchlab-stately-common = { module = "co.touchlab:stately-common", version.ref = "touchlab" }


[plugins]
sqldelight = { id = "app.cash.sqldelight", version.ref = "sqlDelight" }
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
android-application = { id = "com.android.application", version.ref = "agp" }
android-library = { id = "com.android.library", version.ref = "agp" }
jetbrains-compose = { id = "org.jetbrains.compose", version.ref = "compose" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlin-native-cocoapods = { id = "org.jetbrains.kotlin.native.cocoapods", version.ref = "kotlin" }
kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
After — libs.versions.toml
[versions]
agp = "8.13.2"
kotlin = "2.0.21"
activityCompose = "1.9.0"
compose = "1.6.10"
composeCompiler = "1.5.14"
coroutines = "1.8.0"
serialization = "1.7.0"
mviKotlin = "3.3.0"
decompose = "2.1.4-compose-experimental"
essenty = "1.2.0"
ktor = "2.3.10"
sqlDelight = "2.0.0"
koin = "3.5.6"
imageLoader = "1.8.0"
logbackClassic = "1.2.11"
kotlinWrappersBom = "1.0.0-pre.641"
touchlab = "2.0.5"
compileSdk = "34"
targetSdk = "34"
minSdk = "24"
appMajorVersion = "1"
appMinorVersion = "0"
appPatchVersion = "0"
appVersionCode = "1"

[libraries]
# Org.JetBrains.Kotlinx
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" }

# Org.JetBrains.KotlinWrappers
kotlin-wrappers-bom = { module = "org.jetbrains.kotlin-wrappers:kotlin-wrappers-bom", version.ref = "kotlinWrappersBom" }
kotlin-styled = { module = "org.jetbrains.kotlin-wrappers:kotlin-styled" } # Uses BOM

# Androidx.Activity
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activityCompose" }

# Io.Ktor
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
ktor-client-contentNegotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" }
ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" }
ktor-client-android = { module = "io.ktor:ktor-client-android", version.ref = "ktor" }
ktor-client-darwin = { module = "io.ktor:ktor-client-darwin", version.ref = "ktor" }
ktor-client-java = { module = "io.ktor:ktor-client-java", version.ref = "ktor" }
ktor-client-js = { module = "io.ktor:ktor-client-js", version.ref = "ktor" }

# Logback
logback-classic = { module = "ch.qos.logback:logback-classic", version.ref = "logbackClassic" }

# CashApp.SQLDelight
sqldelight-gradle-plugin = { module = "app.cash.sqldelight:gradle-plugin", version.ref = "sqlDelight" } # This is a plugin, will also add to [plugins]
sqldelight-android-driver = { module = "app.cash.sqldelight:android-driver", version.ref = "sqlDelight" }
sqldelight-sqlite-driver = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqlDelight" }
sqldelight-native-driver = { module = "app.cash.sqldelight:native-driver", version.ref = "sqlDelight" }
sqldelight-sqljs-driver = { module = "app.cash.sqldelight:sqljs-driver", version.ref = "sqlDelight" }
sqldelight-coroutines-extensions = { module = "app.cash.sqldelight:coroutines-extensions", version.ref = "sqlDelight" }
sqldelight-primitive-adapters = { module = "app.cash.sqldelight:primitive-adapters", version.ref = "sqlDelight" }

# Koin
koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" }
koin-test = { module = "io.insert-koin:koin-test", version.ref = "koin" }
koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" }

# ArkIvanov.MVIKotlin
mvikotlin = { module = "com.arkivanov.mvikotlin:mvikotlin", version.ref = "mviKotlin" }
mvikotlin-main = { module = "com.arkivanov.mvikotlin:mvikotlin-main", version.ref = "mviKotlin" }
mvikotlin-extensions-coroutines = { module = "com.arkivanov.mvikotlin:mvikotlin-extensions-coroutines", version.ref = "mviKotlin" }

# ArkIvanov.Decompose
decompose = { module = "com.arkivanov.decompose:decompose", version.ref = "decompose" }
decompose-extensions-compose = { module = "com.arkivanov.decompose:extensions-compose-jetbrains", version.ref = "decompose" }

# ArkIvanov.Essenty
essenty-lifecycle = { module = "com.arkivanov.essenty:lifecycle", version.ref = "essenty" }

# Github
imageLoader = { module = "io.github.qdsfdhvh:image-loader", version.ref = "imageLoader" }

# Touchlab
touchlab-stately-common = { module = "co.touchlab:stately-common", version.ref = "touchlab" }


[plugins]
sqldelight = { id = "app.cash.sqldelight", version.ref = "sqlDelight" }
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
android-application = { id = "com.android.application", version.ref = "agp" }
android-library = { id = "com.android.library", version.ref = "agp" }
jetbrains-compose = { id = "org.jetbrains.compose", version.ref = "compose" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlin-native-cocoapods = { id = "org.jetbrains.kotlin.native.cocoapods", version.ref = "kotlin" }
kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
2

Static Analysis — Propagation Graph

How the change in com.android.application propagates through the source code
Click a box to highlight only the files reached in the next column. Scroll vertically when the columns are long.
DEPENDENCY DIRECT TRANSITIVE (dist 1: 0) TRANSITIVE (dist 2+: 0) APPLICATION8.5.0 → 8.13.2
How to read this graph
  • The violet box is the bumped dependency.
  • Red boxes are files that directly import a symbol from the bumped library.
  • Amber boxes are files that depend transitively at distance 1 (they import a red file).
  • Orange boxes are files at distance 2+ (further transitive hops).
  • Click any box to dim the rest of the graph and highlight only the files reached in the next column.
  • Faint lines are real propagation edges captured during BFS; selected edges become darker when a box is active.
  • Dashed amber/orange guide lines show the general direction of propagation across columns.
Each box is a .kt file. Colour = relation to the bumped dependency. Scroll vertically when a column has many files; click a box to inspect its next-hop impact.
3

Dynamic Analysis — UI Exploration with DroidBot

Screen interaction flow with change-affected screens highlighted in red
Open DroidBot UTG full-screen
18
UTG nodes
12
Distinct UI surfaces
1
Behaviour diffs
1
Impacted screens (static)
Main #2
Screen 'Main #2' has different transitions: before=3, after=3
Traceability — File → Screen
Each impacted file with its relation, distance to the change, metrics, and associated UI screen.
FileRelationDist.RLOCMCCCoverageScreen
5

CodeCharta Visualization — 3D Impact Map

Each file is a building: area represents lines of code, height represents complexity, and red color indicates impact
Open CodeCharta fullscreen
Area (size)
rloc — Real lines of code
Height
mcc — Cyclomatic complexity
Color
impact_level: grey none · amber transitive · red direct

Source-set Impact Sunburst

Interactive ring: source-set → package → file. Click any ring to zoom; click center to zoom out.
KMP Impact · com.android.application
8.5.0 → 8.13.2  ·  90 archivos
Impacto
Afectados
Directo 0
Transitivo 0
Total0
No afectados
Expect/Actual pairs 3
Total90
Escala
Directo
Transitivo dist. 1
Transitivo dist. 2+
Sin impacto
Expect/Actual (KMP)
Archivos directos
No direct files.
Expect / Actual
SqlDriverFactory
commonMain/com/mocoding/pokedex/core/database/SqlDriverFactory.kt expect
androidMain/com/mocoding/pokedex/core/database/AndroidSqlDriverFactory.kt actual
desktopMain/com.mocoding.pokedex/core/database/DesktopSqlDriverFactory.kt actual
iosMain/com/mocoding/pokedex/core/database/SqlDriverFactory.kt actual
HttpClientFactory
commonMain/com/mocoding/pokedex/core/network/HttpClientFactory.kt expect
androidMain/com/mocoding/pokedex/core/network/HttpClientFactory.kt actual
desktopMain/com.mocoding.pokedex/core/network/HttpClientFactory.kt actual
iosMain/com/mocoding/pokedex/core/network/HttpClientFactory.kt actual
ExpectClass
commonMain/ExpectClass.kt expect
commonMain/ActualAndroid.kt actual
100%
scroll zoom · drag pan · click ring focus
Propagation tree
Same hierarchy as the sunburst, flattened for reading.
100%
scroll zoom · drag pan
G

Transitive Dependency Graph (GitGraph)

SBOM-derived arc diagram showing every library and its dependents. Use the sidebar to filter or focus a library.
Open dependency graph fullscreen
Pan with click-drag · zoom with mouse wheel · the bumped library is ringed in yellow.