Этап 1: version catalog (libs.versions.toml) — устранён дрейф версий
CI / verify (push) Has been cancelled
CI / release (push) Has been cancelled

- gradle/libs.versions.toml: единый источник версий (Gradle 9.3 авто-подхват).
- 15 module build.gradle мигрированы на libs.* (скриптом, регекс по group:name).
- Устранён дрейф: coroutines 1.8.1/1.10.1→1.10.1, coil 2.6.0/2.7.0→2.7.0,
  lifecycle 2.8.1/2.8.7→2.8.7, activity-compose 1.9.0/1.10.1→1.10.1,
  core-ktx 1.13.1/1.15.0→1.15.0. Firebase в core/push → bom (был explicit 24.0.1).
- Compose BOM в каталоге вместо дубля в каждом модуле.

Проверено: assembleRelease BUILD SUCCESSFUL, APK 53 МБ.
This commit is contained in:
b-dev-mobile
2026-07-07 23:53:30 +00:00
parent f006a69b5c
commit fd96ca89e6
17 changed files with 188 additions and 124 deletions
+1
View File
@@ -2,6 +2,7 @@
Формат: `ГГГГ-ММ-ДД | версия | изменение | контракты | риск`
- 2026-07-07 | v0.5.114 (122) | Этап 1 (version catalog): заведён gradle/libs.versions.toml, 15 module build.gradle мигрированы на libs.* (скриптом). Устранён дрейф версий: coroutines 1.8.1/1.10.1→1.10.1, coil 2.6.0/2.7.0→2.7.0, lifecycle 2.8.1/2.8.7→2.8.7, activity-compose 1.9.0/1.10.1→1.10.1, core-ktx 1.13.1/1.15.0→1.15.0. Firebase в core/push переведён на bom (был explicit 24.0.1). Compose BOM в каталоге вместо дубля в каждом модуле. Проверено сборкой | контракты не менялись; версии унифицированы вверх (minor-бампы) | низкий: сборочная гигиена, унификация версий
- 2026-07-07 | v0.5.114 (122) | Этап 1 (статанализ): detekt 1.23.8 + formatting-ruleset (ktlint) на все наши модули (vendor исключён), совместим с Kotlin 2.3. config/detekt/detekt.yml + per-module detekt-baseline.xml (~403 текущих замечаний зафиксированы → зелёный, ловит только новые). Добавлен в CI verify-джобу. Нормальные сборки (assembleDebug/Release) не затрагивает (detekt только в check/CI) | процесс качества | нет: тулинг, кода приложения не трогает
- 2026-07-07 | v0.5.114 (122) | Этап 1 (единый OkHttpClient, ч.2 — 401 централизован): добавлен UnauthorizedInterceptor (401→UnauthorizedException) в NetworkFactory (флаг throwOnUnauthorized, по умолч. true). Удалены 75 ручных проверок `if(code==401) throw` в 16 репозиториях. Login-верификация (AuthVerifier) исключена (throwOnUnauthorized=false: 401=«неверный пароль», не session-expired). Побочно: теперь 401 ловится единообразно ВЕЗДЕ, включая пути, что раньше проверку забывали. +3 теста (MockWebServer: 401 бросает, 200/403 проходят) — всего 18. Проверено сборкой | контракты не менялись; поведение 401 сохранено (interceptor бросает то же исключение) | средний: затрагивает обработку 401 во всех репозиториях; login-путь исключён явно, покрыто тестами
- 2026-07-07 | v0.5.114 (122) | Этап 1 (единый OkHttpClient, ч.1): NetworkFactory переписан — раньше создавал НОВЫЙ OkHttpClient на КАЖДЫЙ запрос (~32 места) → TLS-handshake + новый пул/диспатчер на запрос + утечка ExecutorService. Теперь один базовый клиент (общий ConnectionPool/Dispatcher + диск-кэш 20МБ), авторизованные варианты через base.newBuilder() (шарят пул/кэш), кэшируются по кредам+таймаутам. Публичный API НЕ менялся — 32 вызова не тронуты. Init диск-кэша — F7MobileApp.onCreate. +3 unit-теста (переиспользование клиента, общий пул). 401→interceptor НЕ делал (меняет семантику исключений — отдельный шаг) | контракты не менялись | средний: затрагивает ВСЕ сетевые вызовы (переиспользование соединений); поведение запросов то же, проверено 15 тестами + assembleRelease
+24 -24
View File
@@ -111,30 +111,30 @@ dependencies {
implementation project(':feature:mail')
implementation project(':feature:f7support')
def composeBom = platform('androidx.compose:compose-bom:2025.02.00')
def composeBom = platform(libs.compose.bom)
implementation composeBom
androidTestImplementation composeBom
implementation 'androidx.activity:activity-compose:1.10.1'
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.ui:ui-tooling-preview'
implementation 'androidx.compose.material3:material3'
implementation 'androidx.navigation:navigation-compose:2.8.9'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7'
implementation 'androidx.lifecycle:lifecycle-runtime-compose:2.8.7'
implementation 'androidx.lifecycle:lifecycle-process:2.8.7'
implementation 'io.coil-kt:coil-compose:2.7.0'
implementation 'io.coil-kt:coil-svg:2.7.0'
implementation platform('com.google.firebase:firebase-bom:33.7.0')
implementation 'com.google.firebase:firebase-messaging'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.9.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.biometric:biometric:1.1.0'
implementation 'androidx.fragment:fragment-ktx:1.8.6'
implementation 'androidx.camera:camera-camera2:1.5.2'
implementation 'androidx.camera:camera-lifecycle:1.5.2'
implementation 'androidx.camera:camera-view:1.5.2'
implementation 'com.google.zxing:core:3.3.0'
implementation 'androidx.compose.material:material-icons-extended'
implementation 'com.google.guava:guava:33.3.1-android'
debugImplementation 'androidx.compose.ui:ui-tooling'
implementation libs.activity.compose
implementation libs.compose.ui
implementation libs.compose.ui.tooling.preview
implementation libs.compose.material3
implementation libs.navigation.compose
implementation libs.lifecycle.viewmodel.compose
implementation libs.lifecycle.runtime.compose
implementation libs.lifecycle.process
implementation libs.coil.compose
implementation libs.coil.svg
implementation platform(libs.firebase.bom)
implementation libs.firebase.messaging
implementation libs.coroutines.play.services
implementation libs.multidex
implementation libs.biometric
implementation libs.fragment.ktx
implementation libs.camera.camera2
implementation libs.camera.lifecycle
implementation libs.camera.view
implementation libs.zxing
implementation libs.compose.material.icons.extended
implementation libs.guava
debugImplementation libs.compose.ui.tooling
}
+1 -1
View File
@@ -21,5 +21,5 @@ android {
dependencies {
implementation project(':core:network')
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'
implementation libs.coroutines.android
}
+3 -3
View File
@@ -21,7 +21,7 @@ android {
}
dependencies {
api 'androidx.room:room-runtime:2.7.2'
implementation 'androidx.room:room-ktx:2.7.2'
ksp 'androidx.room:room-compiler:2.7.2'
api libs.room.runtime
implementation libs.room.ktx
ksp libs.room.compiler
}
+6 -6
View File
@@ -25,11 +25,11 @@ android {
}
dependencies {
def composeBom = platform('androidx.compose:compose-bom:2025.02.00')
def composeBom = platform(libs.compose.bom)
implementation composeBom
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.foundation:foundation'
implementation 'androidx.compose.material3:material3'
implementation 'io.coil-kt:coil-compose:2.6.0'
implementation 'io.coil-kt:coil-svg:2.6.0'
implementation libs.compose.ui
implementation libs.compose.foundation
implementation libs.compose.material3
implementation libs.coil.compose
implementation libs.coil.svg
}
+5 -5
View File
@@ -23,10 +23,10 @@ android {
}
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'
implementation 'org.json:json:20240303'
api 'com.squareup.okhttp3:okhttp:4.12.0'
implementation libs.coroutines.android
implementation libs.json
api libs.okhttp
testImplementation 'junit:junit:4.13.2'
testImplementation 'com.squareup.okhttp3:mockwebserver:4.12.0'
testImplementation libs.junit
testImplementation libs.okhttp.mockwebserver
}
+5 -4
View File
@@ -21,8 +21,9 @@ android {
dependencies {
implementation project(':core:auth')
implementation 'com.google.firebase:firebase-messaging:24.0.1'
implementation 'androidx.core:core-ktx:1.15.0'
implementation 'androidx.core:core:1.15.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'
implementation platform(libs.firebase.bom)
implementation libs.firebase.messaging
implementation libs.core.ktx
implementation libs.core
implementation libs.coroutines.android
}
+10 -10
View File
@@ -27,15 +27,15 @@ dependencies {
implementation project(':core:auth')
implementation project(':core:network')
implementation project(':core:designsystem')
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'
def composeBom = platform('androidx.compose:compose-bom:2025.02.00')
implementation libs.coroutines.android
def composeBom = platform(libs.compose.bom)
implementation composeBom
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.material3:material3'
implementation 'androidx.compose.foundation:foundation'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1'
implementation 'androidx.activity:activity-compose:1.10.1'
implementation 'androidx.core:core-ktx:1.15.0'
implementation 'io.coil-kt:coil-compose:2.7.0'
implementation 'io.coil-kt:coil-svg:2.7.0'
implementation libs.compose.ui
implementation libs.compose.material3
implementation libs.compose.foundation
implementation libs.lifecycle.viewmodel.compose
implementation libs.activity.compose
implementation libs.core.ktx
implementation libs.coil.compose
implementation libs.coil.svg
}
+8 -8
View File
@@ -28,13 +28,13 @@ dependencies {
implementation project(':core:network')
implementation project(':core:database')
implementation project(':core:designsystem')
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'
def composeBom = platform('androidx.compose:compose-bom:2025.02.00')
implementation libs.coroutines.android
def composeBom = platform(libs.compose.bom)
implementation composeBom
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.material3:material3'
implementation 'androidx.compose.foundation:foundation'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1'
implementation 'io.coil-kt:coil-compose:2.7.0'
implementation 'io.coil-kt:coil-svg:2.7.0'
implementation libs.compose.ui
implementation libs.compose.material3
implementation libs.compose.foundation
implementation libs.lifecycle.viewmodel.compose
implementation libs.coil.compose
implementation libs.coil.svg
}
+7 -7
View File
@@ -27,12 +27,12 @@ dependencies {
implementation project(':core:auth')
implementation project(':core:network')
implementation project(':core:designsystem')
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'
implementation 'org.json:json:20240303'
def composeBom = platform('androidx.compose:compose-bom:2025.02.00')
implementation libs.coroutines.android
implementation libs.json
def composeBom = platform(libs.compose.bom)
implementation composeBom
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.material3:material3'
implementation 'androidx.compose.foundation:foundation'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1'
implementation libs.compose.ui
implementation libs.compose.material3
implementation libs.compose.foundation
implementation libs.lifecycle.viewmodel.compose
}
+10 -10
View File
@@ -27,15 +27,15 @@ dependencies {
implementation project(':core:auth')
implementation project(':core:network')
implementation project(':core:designsystem')
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'
implementation 'org.json:json:20240303'
def composeBom = platform('androidx.compose:compose-bom:2025.02.00')
implementation libs.coroutines.android
implementation libs.json
def composeBom = platform(libs.compose.bom)
implementation composeBom
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.material3:material3'
implementation 'androidx.compose.foundation:foundation'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1'
implementation 'androidx.activity:activity-compose:1.10.1'
implementation 'io.coil-kt:coil-compose:2.7.0'
implementation 'io.coil-kt:coil-svg:2.7.0'
implementation libs.compose.ui
implementation libs.compose.material3
implementation libs.compose.foundation
implementation libs.lifecycle.viewmodel.compose
implementation libs.activity.compose
implementation libs.coil.compose
implementation libs.coil.svg
}
+12 -12
View File
@@ -29,17 +29,17 @@ dependencies {
implementation project(':core:network')
implementation project(':core:designsystem')
def composeBom = platform('androidx.compose:compose-bom:2025.02.00')
def composeBom = platform(libs.compose.bom)
implementation composeBom
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.material3:material3'
implementation 'androidx.compose.foundation:foundation'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'
implementation 'org.json:json:20240303'
implementation 'androidx.core:core-ktx:1.13.1'
implementation 'androidx.activity:activity-compose:1.9.0'
implementation 'androidx.documentfile:documentfile:1.0.1'
implementation 'io.coil-kt:coil-compose:2.6.0'
implementation 'io.coil-kt:coil-svg:2.6.0'
implementation libs.compose.ui
implementation libs.compose.material3
implementation libs.compose.foundation
implementation libs.lifecycle.viewmodel.compose
implementation libs.coroutines.android
implementation libs.json
implementation libs.core.ktx
implementation libs.activity.compose
implementation libs.documentfile
implementation libs.coil.compose
implementation libs.coil.svg
}
+11 -11
View File
@@ -29,16 +29,16 @@ dependencies {
implementation project(':core:designsystem')
implementation project(':feature:files')
implementation project(':feature:contacts')
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'
implementation 'org.json:json:20240303'
def composeBom = platform('androidx.compose:compose-bom:2025.02.00')
implementation libs.coroutines.android
implementation libs.json
def composeBom = platform(libs.compose.bom)
implementation composeBom
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.material3:material3'
implementation 'androidx.compose.foundation:foundation'
implementation 'androidx.compose.foundation:foundation-layout'
implementation 'androidx.activity:activity-compose:1.9.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1'
implementation 'io.coil-kt:coil-compose:2.6.0'
implementation 'io.coil-kt:coil-svg:2.6.0'
implementation libs.compose.ui
implementation libs.compose.material3
implementation libs.compose.foundation
implementation libs.compose.foundation.layout
implementation libs.activity.compose
implementation libs.lifecycle.viewmodel.compose
implementation libs.coil.compose
implementation libs.coil.svg
}
+2 -2
View File
@@ -24,6 +24,6 @@ dependencies {
api project(':vendor:talk-app')
implementation project(':core:auth')
implementation project(':core:push')
implementation 'androidx.core:core-ktx:1.15.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1'
implementation libs.core.ktx
implementation libs.coroutines.android
}
+13 -13
View File
@@ -31,18 +31,18 @@ dependencies {
implementation project(':core:push')
implementation project(':feature:talk-native')
implementation project(':core:designsystem')
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1'
implementation 'org.json:json:20240303'
def composeBom = platform('androidx.compose:compose-bom:2025.02.00')
implementation libs.coroutines.android
implementation libs.json
def composeBom = platform(libs.compose.bom)
implementation composeBom
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.material3:material3'
implementation 'androidx.compose.foundation:foundation'
implementation 'androidx.compose.foundation:foundation-layout'
implementation 'androidx.activity:activity-compose:1.10.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7'
implementation 'io.coil-kt:coil-compose:2.7.0'
implementation 'androidx.room:room-runtime:2.7.2'
implementation 'androidx.room:room-ktx:2.7.2'
ksp 'androidx.room:room-compiler:2.7.2'
implementation libs.compose.ui
implementation libs.compose.material3
implementation libs.compose.foundation
implementation libs.compose.foundation.layout
implementation libs.activity.compose
implementation libs.lifecycle.viewmodel.compose
implementation libs.coil.compose
implementation libs.room.runtime
implementation libs.room.ktx
ksp libs.room.compiler
}
+8 -8
View File
@@ -27,13 +27,13 @@ dependencies {
implementation project(':core:auth')
implementation project(':core:network')
implementation project(':core:designsystem')
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'
def composeBom = platform('androidx.compose:compose-bom:2025.02.00')
implementation libs.coroutines.android
def composeBom = platform(libs.compose.bom)
implementation composeBom
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.material3:material3'
implementation 'androidx.compose.foundation:foundation'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1'
implementation 'io.coil-kt:coil-compose:2.7.0'
implementation 'io.coil-kt:coil-svg:2.7.0'
implementation libs.compose.ui
implementation libs.compose.material3
implementation libs.compose.foundation
implementation libs.lifecycle.viewmodel.compose
implementation libs.coil.compose
implementation libs.coil.svg
}
+62
View File
@@ -0,0 +1,62 @@
# Version catalog — единый источник версий (устраняет дрейф между модулями).
# Плагины (AGP/Kotlin/KSP) — в корневом build.gradle (там дрейфа нет).
[versions]
activityCompose = "1.10.1" # был дрейф 1.9.0 / 1.10.1
composeBom = "2025.02.00"
coreKtx = "1.15.0" # был дрейф 1.13.1 / 1.15.0
lifecycle = "2.8.7" # был дрейф 2.8.1 / 2.8.7
coil = "2.7.0" # был дрейф 2.6.0 / 2.7.0
coroutines = "1.10.1" # был дрейф 1.8.1 / 1.10.1
navigationCompose = "2.8.9"
room = "2.7.2"
okhttp = "4.12.0"
firebaseBom = "33.7.0"
junit = "4.13.2"
json = "20240303"
biometric = "1.1.0"
camerax = "1.5.2"
guava = "33.3.1-android"
zxing = "3.3.0"
multidex = "2.0.1"
fragment = "1.8.6"
documentfile = "1.0.1"
[libraries]
compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
compose-ui = { group = "androidx.compose.ui", name = "ui" }
compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
compose-foundation = { group = "androidx.compose.foundation", name = "foundation" }
compose-foundation-layout = { group = "androidx.compose.foundation", name = "foundation-layout" }
compose-material3 = { group = "androidx.compose.material3", name = "material3" }
compose-material-icons-extended = { group = "androidx.compose.material", name = "material-icons-extended" }
activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }
navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" }
lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" }
lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycle" }
lifecycle-process = { group = "androidx.lifecycle", name = "lifecycle-process", version.ref = "lifecycle" }
coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" }
coil-svg = { group = "io.coil-kt", name = "coil-svg", version.ref = "coil" }
coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "coroutines" }
coroutines-play-services = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-play-services", version.ref = "coroutines" }
okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" }
okhttp-mockwebserver = { group = "com.squareup.okhttp3", name = "mockwebserver", version.ref = "okhttp" }
json = { group = "org.json", name = "json", version.ref = "json" }
room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" }
room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" }
room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebaseBom" }
firebase-messaging = { group = "com.google.firebase", name = "firebase-messaging" }
core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
core = { group = "androidx.core", name = "core", version.ref = "coreKtx" }
biometric = { group = "androidx.biometric", name = "biometric", version.ref = "biometric" }
camera-camera2 = { group = "androidx.camera", name = "camera-camera2", version.ref = "camerax" }
camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "camerax" }
camera-view = { group = "androidx.camera", name = "camera-view", version.ref = "camerax" }
zxing = { group = "com.google.zxing", name = "core", version.ref = "zxing" }
guava = { group = "com.google.guava", name = "guava", version.ref = "guava" }
multidex = { group = "androidx.multidex", name = "multidex", version.ref = "multidex" }
fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragment" }
documentfile = { group = "androidx.documentfile", name = "documentfile", version.ref = "documentfile" }
junit = { group = "junit", name = "junit", version.ref = "junit" }