Skip to content

Conversation

@kkh725
Copy link
Owner

@kkh725 kkh725 commented Jan 25, 2026

Summary by CodeRabbit

릴리스 노트

  • 문서

    • 모듈 의존성 다이어그램을 레이블 기반으로 단순화해 구조·관계 가독성 향상
  • 개선

    • 빌드 의존성 그래프 생성 로직 개선: 경로 단순화 및 제외 규칙 적용
    • 컴파일·Compose·Kotlin 설정을 모듈 유형별로 분리·일관화해 빌드 구성 명확화
    • 일부 플러그인 적용 범위 축소로 빌드 스크립트 간소화
  • 변경

    • 여러 라이브러리 및 Gradle 버전 업그레이드
    • 에디터/설정 파일에 포맷·권한·정책 항목 추가

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Jan 25, 2026

Walkthrough

Mermaid 그래프 표기를 명명된 레이블 기반 노드와 직접 관계로 재작성했고, Gradle 의존성 그래프 스크립트에 부모 모듈 제외 집합 및 경로 단순화/필터링 로직을 추가했으며, 빌드 로직을 Android/Kotlin 확장별 오버로드로 분리하고 여러 버전·프로퍼티·설정을 갱신했습니다.

Changes

Cohort / File(s) 요약
문서
docs/module-deps.md
Mermaid 그래프를 익명 노드·다중 엣지 표현에서 명명된 레이블 노드 및 직접 관계 표현으로 교체(노드 식별자·에지 표준화)
의존성 그래프 스크립트
gradle/dependencyGraph.gradle
부모 모듈 제외 집합(empty, core, feature) 및 경로 단순화 훅 추가, 의존성 열거 시 단순화된 경로로 필터링·키/값 일관성 적용
버전 카탈로그 / 그레이들 래퍼 / 속성
gradle/libs.versions.toml, gradle/wrapper/gradle-wrapper.properties, gradle.properties
AGP·라이브러리·플러그인 버전 상향(예: AGP 8.13.2→9.0.0 등), Gradle wrapper 배포판 버전 업데이트(9.x 계열), Android 관련 신규 gradle 속성 추가
에디터/로컬 설정
.editorconfig, .claude/settings.local.json
Kotlin boolean-property 네이밍 규칙 활성화 추가, 파일 끝 개행 조정, .claude/settings.local.jsonpermissions.allowWebSearch 추가
빌드 로직: 플러그인 적용 축소
build-logic/convention/.../AndroidApplicationConventionPlugin.kt, .../AndroidTestConventionPlugin.kt, .../AndroidLibraryConventionPlugin.kt
각 컨벤션에서 org.jetbrains.kotlin.android 플러그인 적용 제거(앱/라이브러리/테스트 대상)
빌드 로직: 확장별 설정 분리 및 Compose/Kotlin 구성 변경
build-logic/convention/src/main/java/com/kkh/convention/extensions/AndroidCompose.kt, .../Kotlin.kt
CommonExtension 기반 단일 함수들을 ApplicationExtension/LibraryExtension/TestExtension 전용 오버로드로 분리, Compose 컴파일러 설정 공통화(helper) 추가, Kotlin 설정을 확장별 오버로드로 분리(새 시그니처/추가 함수들)

Sequence Diagram(s)

(생략)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 분

Possibly related PRs

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Title check ⚠️ Warning PR 제목 '[Chore] update ci'는 실제 변경사항과 맞지 않습니다. PR에는 CI 업데이트 외에도 Gradle 버전 업그레이드, 의존성 그래프 구조화, Kotlin 플러그인 제거 등 다양한 변경사항이 포함되어 있습니다. PR 제목을 변경사항의 주요 내용을 반영하도록 수정하세요. 예: '[Chore] upgrade Gradle and dependencies, refactor Android plugins' 또는 각 주요 변경사항을 포함한 더 구체적인 제목으로 변경하세요.
Docstring Coverage ⚠️ Warning Docstring coverage is 20.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@gradle/libs.versions.toml`:
- Line 5: The dependency entry kotlinxSerializationJson = "1.10.0" is built for
Kotlin 2.3.0 and may be incompatible with our Kotlin 2.2.20; either upgrade the
project's Kotlin version to 2.3.0 (update Kotlin settings where Kotlin version
is declared) or change the kotlinxSerializationJson version to a 1.9.x release
that supports Kotlin 2.2.x, and ensure all serialization-related imports and
usages still compile; additionally verify ktlint-compose-rules (0.5.5 vs 0.5.3)
compatibility with ktlint 14.0.1 and adjust that dependency if it requires a
different ktlint/Kotlin combination.

coreSplashscreen = "1.2.0"
kotlin = "2.2.20"
kotlinxSerializationJson = "1.9.0"
kotlinxSerializationJson = "1.10.0"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🌐 Web query:

kotlinx-serialization-json 1.10.0 release notes compatibility Kotlin

💡 Result:

kotlinx-serialization-json 1.10.0 release notes (highlights)

kotlinx-serialization 1.10.0 is based on Kotlin 2.3.0 and includes all changes from 1.10.0-RC, plus one extra fix: ProtoBuf packing of Kotlin unsigned types. [1]

Key notable changes called out in the release notes:

  • Several widely-used JSON options are now stable (no longer experimental): decodeEnumsCaseInsensitive, allowTrailingComma, allowComments, prettyPrintIndent. [1]
  • @EncodeDefault is now stable. [1]
  • JsonUnquotedLiteral(...) is now stable. [1]
  • JSON APIs stabilized around unsigned primitives and some JSON DSL overloads. [1]
  • Marked for Kotlin 2.3.0’s “Return Value Checker” feature (warnings for ignored return values when enabled). [1]

Kotlin compatibility / which Kotlin version to use

  • The 1.10.0 release is explicitly based on Kotlin 2.3.0. [1]
  • The serialization compiler plugin is released in tandem with the Kotlin compiler, so you should use the matching plugin version (i.e., kotlin("plugin.serialization") version "2.3.0" when on Kotlin 2.3.0). [2]
  • In general, the project’s stated policy is that newer compiler plugins aim to stay backward-compatible with older runtimes, but some new compiler/plugin features may require a newer runtime (and the compiler will report incompatibilities). [3]

Sources: [1] [2] [3]


🌐 Web query:

ktlint-compose-rules 0.5.5 release notes ktlint version requirement

💡 Result:

I couldn’t find any ktlint-compose-rules (io.nlopez.compose.rules:ktlint) release/tag 0.5.5 in the public artifacts/docs I checked; the “0.5.5” you’re seeing may refer to an unrelated Gradle plugin version (uk.co.iotatech.gradle.ktlint 0.5.5). [3]

For the actual compose rules artifact, 0.5.3 is published on Maven Central and its POM shows it depends on ktlint 1.8.0 (ktlint-rule-engine and ktlint-cli-ruleset-core both at 1.8.0). [1] The project’s supported-versions matrix also indicates ktlint 1.8.0 support starting from compose-rules 0.4.28+. [2]

Answer: ktlint requirement is 1.8.0 (for current releases like 0.5.3); no public 0.5.5 release notes were found for this artifact. [1] [2]

References:
[1] Maven Central POM for io.nlopez.compose.rules:ktlint:0.5.3 (dependencies show ktlint 1.8.0) (central.sonatype.com)
[2] compose-rules “Using with ktlint” supported versions matrix (mrmans0n.github.io)
[3] Gradle plugin portal entry for uk.co.iotatech.gradle.ktlint version 0.5.5 (plugins.gradle.org)

Citations:


🏁 Script executed:

# Check the gradle/libs.versions.toml file for context on versions
cat gradle/libs.versions.toml | head -60

Repository: kkh725/Multi_Module_Template

Length of output: 1058


kotlinx-serialization-json 1.10.0을 Kotlin 2.2.20과 함께 사용 불가능

릴리즈 노트에 따르면 kotlinx-serialization-json 1.10.0은 Kotlin 2.3.0 기준으로 빌드되었습니다. 현재 프로젝트는 Kotlin 2.2.20을 사용하고 있어 호환성 문제가 발생할 수 있습니다. 공식 정책에서 "일부 새로운 컴파일러/플러그인 기능은 더 높은 런타임 버전을 요구할 수 있다"고 명시되어 있으므로, 다음 중 하나를 선택하세요:

  • Kotlin을 2.3.0으로 업그레이드, 또는
  • kotlinx-serialization-json을 더 낮은 버전(1.9.x)으로 유지

ktlint-compose-rules 0.5.5의 ktlint 14.0.1 호환성도 공식 문서에서 확인 필요합니다 (최신 공개 버전 0.5.3은 ktlint 1.8.0 기준).

🤖 Prompt for AI Agents
In `@gradle/libs.versions.toml` at line 5, The dependency entry
kotlinxSerializationJson = "1.10.0" is built for Kotlin 2.3.0 and may be
incompatible with our Kotlin 2.2.20; either upgrade the project's Kotlin version
to 2.3.0 (update Kotlin settings where Kotlin version is declared) or change the
kotlinxSerializationJson version to a 1.9.x release that supports Kotlin 2.2.x,
and ensure all serialization-related imports and usages still compile;
additionally verify ktlint-compose-rules (0.5.5 vs 0.5.3) compatibility with
ktlint 14.0.1 and adjust that dependency if it requires a different
ktlint/Kotlin combination.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In @.claude/settings.local.json:
- Around line 15-17: settings.local.json is being tracked despite its "local"
name and it contains the WebSearch permission which is undocumented; either
remove settings.local.json from source control by adding it to .gitignore and
revert the tracked file (so local-only settings like WebSearch aren’t
committed), or move the shared configuration (including "WebSearch") into a new
vetted file (e.g., settings.json) and remove that key from settings.local.json,
then add documentation (README or a settings.md) explaining why "WebSearch" is
required and what external access it enables; update any CI/automation configs
to reference the new shared file if you choose the latter.

In @.editorconfig:
- Around line 80-82: Remove the unnecessary trailing blank lines at the end of
.editorconfig so the file ends immediately after the last non-empty line; this
must align with the existing settings insert_final_newline = false and
trim_trailing_whitespace = true. Locate the insert_final_newline and
trim_trailing_whitespace entries and delete the extra empty lines (there are
three) so no final newline or trailing whitespace remains.

In `@gradle.properties`:
- Around line 45-53: These three gradle properties (android.uniquePackageNames,
android.r8.strictFullModeForKeepRules, android.disallowKotlinSourceSets) are
temporary workarounds for AGP 9.0; remove them once you migrate: update/replace
dependencies that cause duplicate package names so you can drop
android.uniquePackageNames=false, revise R8 keep rules/explicit constructors so
android.r8.strictFullModeForKeepRules=false is no longer needed, and convert
legacy Kotlin source set layout to the new built-in Kotlin layout so
android.disallowKotlinSourceSets=false can be removed; after each change, remove
the corresponding property and run a clean build to verify compatibility with
AGP 9.0 defaults.
♻️ Duplicate comments (1)
gradle/libs.versions.toml (1)

4-5: kotlinx-serialization-json 1.10.0은 Kotlin 2.3.0 이상을 요구합니다.

이전 리뷰에서 이미 언급된 문제입니다. Kotlin 2.2.20과 함께 사용하려면 kotlinx-serialization-json을 1.9.x 버전으로 다운그레이드하거나 Kotlin을 2.3.0으로 업그레이드해야 합니다.

🧹 Nitpick comments (2)
build-logic/convention/src/main/java/com/kkh/convention/extensions/AndroidCompose.kt (1)

15-76: Application과 Library 구성 로직의 코드 중복

ApplicationExtensionLibraryExtension 오버로드의 구성 로직이 거의 동일합니다. configureComposeCompiler()를 추출한 것은 좋은 접근이지만, buildFeatures, dependencies, testOptions 설정도 공통 헬퍼로 추출할 수 있습니다.

♻️ 중복을 줄이기 위한 리팩토링 제안
private fun Project.configureComposeDependencies() {
    dependencies {
        add("ktlintRuleset", libs.findLibrary("ktlint-compose-rules").get())

        val bom = libs.findLibrary("androidx-compose-bom").get()
        "implementation"(platform(bom))
        "androidTestImplementation"(platform(bom))
        "implementation"(libs.findLibrary("androidx-material3").get())
        "implementation"(libs.findLibrary("androidx-ui-tooling-preview").get())
        "debugImplementation"(libs.findLibrary("androidx-ui-tooling").get())
    }
}

internal fun Project.configureAndroidCompose(
    applicationExtension: ApplicationExtension,
) {
    applicationExtension.apply {
        buildFeatures { compose = true }
        testOptions { unitTests { isIncludeAndroidResources = true } }
    }
    configureComposeDependencies()
    configureComposeCompiler()
}

internal fun Project.configureAndroidCompose(
    libraryExtension: LibraryExtension,
) {
    libraryExtension.apply {
        buildFeatures { compose = true }
        testOptions { unitTests { isIncludeAndroidResources = true } }
    }
    configureComposeDependencies()
    configureComposeCompiler()
}
build-logic/convention/src/main/java/com/kkh/convention/extensions/Kotlin.kt (1)

12-92: 세 개의 오버로드에서 상당한 코드 중복

ApplicationExtension, LibraryExtension, TestExtension 오버로드가 거의 동일한 로직을 포함합니다. 주석에서 CommonExtension의 공통 기능을 언급하고 있지만, 실제 구현에서는 활용하지 않고 있습니다.

공통 설정 로직을 헬퍼 함수로 추출하여 중복을 줄이는 것이 좋습니다.

♻️ 공통 설정을 추출하는 리팩토링 제안
import com.android.build.api.dsl.CommonExtension

private fun Project.configureCommonAndroid(
    commonExtension: CommonExtension<*, *, *, *, *, *>
) {
    commonExtension.apply {
        compileSdk = libs.findVersion("projectCompileSdkVersion").get().toString().toInt()

        defaultConfig {
            minSdk = libs.findVersion("projectMinSdkVersion").get().toString().toInt()
        }

        compileOptions {
            isCoreLibraryDesugaringEnabled = true
            sourceCompatibility = JavaVersion.VERSION_17
            targetCompatibility = JavaVersion.VERSION_17
        }
    }

    configureKotlin()

    dependencies {
        "implementation"(libs.findLibrary("kotlinx-collections-immutable").get())
        "coreLibraryDesugaring"(libs.findLibrary("desugar.jdk.libs").get())
    }
}

internal fun Project.configureKotlinAndroid(
    applicationExtension: ApplicationExtension
) = configureCommonAndroid(applicationExtension)

internal fun Project.configureKotlinAndroid(
    libraryExtension: LibraryExtension
) = configureCommonAndroid(libraryExtension)

internal fun Project.configureKotlinAndroid(
    testExtension: TestExtension
) = configureCommonAndroid(testExtension)

Comment on lines 15 to +17
"mcp__github__get_pull_request",
"mcp__github__get_pull_request_files"
"mcp__github__get_pull_request_files",
"WebSearch"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify settings.local.json management and WebSearch usage

echo "=== Checking .gitignore for settings.local.json ==="
if [ -f .gitignore ]; then
  grep -n 'settings\.local\.json' .gitignore || echo "Not found in .gitignore"
else
  echo ".gitignore not found"
fi

echo ""
echo "=== Checking WebSearch references in .claude/*.json ==="
find .claude -name '*.json' -type f 2>/dev/null | while read file; do
  if grep -q 'WebSearch' "$file"; then
    echo "Found in: $file"
    grep -n 'WebSearch' "$file"
  fi
done || echo "No .claude directory or JSON files"

echo ""
echo "=== Checking WebSearch documentation in markdown files ==="
rg -n 'WebSearch' --type md . 2>/dev/null || echo "No WebSearch references in markdown files"

echo ""
echo "=== Listing .claude directory structure ==="
if [ -d .claude ]; then
  find .claude -type f | head -20
else
  echo ".claude directory not found"
fi

echo ""
echo "=== Checking if settings.local.json is tracked in git ==="
git ls-files | grep settings.local.json || echo "Not in git tracking"

Repository: kkh725/Multi_Module_Template

Length of output: 525


로컬 파일로 명명된 설정이 저장소에 추적되고 있으며 WebSearch 권한이 문서화되지 않음

settings.local.json이 저장소에 추적되는 공유 파일이면서도 "로컬" 파일로 명명되어 있습니다. WebSearch 권한 추가는 마크다운 문서에 설명이 없으므로, 자동화/CI에서 의도하지 않은 외부 통신을 유발할 수 있습니다. 다음 중 하나를 수행하세요:

  • settings.local.json.gitignore에 추가하여 진정한 로컬 전용 파일로 관리하거나
  • 공유 설정은 별도 파일(예: settings.json)로 분리하고 WebSearch 필요성을 문서화하기
🛠️ WebSearch 제거 제안
-      "mcp__github__get_pull_request_files",
-      "WebSearch"
+      "mcp__github__get_pull_request_files"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"mcp__github__get_pull_request",
"mcp__github__get_pull_request_files"
"mcp__github__get_pull_request_files",
"WebSearch"
"mcp__github__get_pull_request",
"mcp__github__get_pull_request_files"
🤖 Prompt for AI Agents
In @.claude/settings.local.json around lines 15 - 17, settings.local.json is
being tracked despite its "local" name and it contains the WebSearch permission
which is undocumented; either remove settings.local.json from source control by
adding it to .gitignore and revert the tracked file (so local-only settings like
WebSearch aren’t committed), or move the shared configuration (including
"WebSearch") into a new vetted file (e.g., settings.json) and remove that key
from settings.local.json, then add documentation (README or a settings.md)
explaining why "WebSearch" is required and what external access it enables;
update any CI/automation configs to reference the new shared file if you choose
the latter.

Comment on lines +80 to +82



Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

파일 끝의 불필요한 빈 줄을 제거하세요.

파일 끝에 여러 개의 빈 줄(3개)이 있습니다. 이는 14번 줄의 insert_final_newline = false 설정 및 9번 줄의 trim_trailing_whitespace = true 설정과 일관성이 없습니다. 파일 끝의 빈 줄을 제거하여 설정과 일치시키는 것이 좋습니다.

🧹 제안하는 수정
 ktlint_standard_trailing-comma-on-declaration-site = disabled
-
-
-
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
ktlint_standard_trailing-comma-on-declaration-site = disabled
🤖 Prompt for AI Agents
In @.editorconfig around lines 80 - 82, Remove the unnecessary trailing blank
lines at the end of .editorconfig so the file ends immediately after the last
non-empty line; this must align with the existing settings insert_final_newline
= false and trim_trailing_whitespace = true. Locate the insert_final_newline and
trim_trailing_whitespace entries and delete the extra empty lines (there are
three) so no final newline or trailing whitespace remains.

Comment on lines +45 to +53
android.experimental.lint.runBenchmarksInSeparateProcess=true
android.uniquePackageNames=false
android.r8.strictFullModeForKeepRules=false

# Suppress library constraints warning
android.generateSyncIssueWhenLibraryConstraintsAreEnabled=false

# Allow KSP to add Kotlin source sets (needed for Hilt/KSP with built-in Kotlin)
android.disallowKotlinSourceSets=false
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🌐 Web query:

AGP 9.0 android.uniquePackageNames migration

💡 Result:

In AGP 9.0.0 the Gradle property android.uniquePackageNames now defaults from falsetrue, meaning every Android library on the classpath must have a distinct manifest package name (the historical “package name” used for resource namespacing). If two AARs share the same package, AGP fails the build. [1]

What to do (migration)

  1. Identify the conflicting libraries
    The build typically fails with an error like “more than one library with package name …”. That package is the one duplicated.

  2. Fix the conflict (preferred)

    • Upgrade/replace the offending dependency versions so they no longer share a package (this often means moving off old Android Support libraries to AndroidX equivalents). A known historical example is support vector drawable artifacts sharing a package name. [2]
    • If the duplicates come from your own modules, ensure each Android library module has a unique:
      • android { namespace = "..." } (module-level), and
      • (if still present) distinct manifest package usage consistent with modern AGP guidance.
  3. Temporary escape hatch (while you migrate)
    Add to gradle.properties:

    android.uniquePackageNames=false

    Then remove it once you’ve made package names unique. [1]

Sources: AGP 9.0.0 release notes (property default change + guidance) [1]; AndroidX repo comment showing real-world duplicate-package conflict and opting out via android.uniquePackageNames=false [2].


🌐 Web query:

android.r8.strictFullModeForKeepRules AGP 9.0

💡 Result:

android.r8.strictFullModeForKeepRules is an AGP Gradle property that makes R8 “full mode” stricter about keep rules: a rule like -keep class A no longer implicitly keeps the default (no-args) constructor (<init>()). In other words, if you need the default constructor kept, you must spell it out in the keep rule. [1][2]

In Android Gradle Plugin (AGP) 9.0.0, the default changes from falsetrue. To preserve the older behavior while you migrate, set this in gradle.properties: [1]

android.r8.strictFullModeForKeepRules=false

To migrate “correctly” with the new default, update rules that relied on the implicit constructor keep, e.g.: [1][2]

-keep class com.example.A { <init>(); }

Sources: AGP 9.0.0 release notes [1], Android “Use R8 in full mode” doc (constructor behavior in full mode) [2].


🌐 Web query:

android.disallowKotlinSourceSets KSP Hilt configuration

💡 Result:

android.disallowKotlinSourceSets is an Android Gradle Plugin (AGP) migration flag: when it’s true, AGP rejects the “Kotlin source sets” wiring (the Kotlin-Android source set factory / legacy Kotlin source-set layout) and forces you onto Android’s source sets only. Google’s own AndroidX build currently pins it to false with a note that defaults will change in AGP 9.0.0. [1]

What to do for KSP + Hilt

  1. Prefer Android source sets (src/main/kotlin, src/androidTest/kotlin, etc.) and don’t rely on custom Kotlin source-set layout. If you’re coming from a legacy Kotlin MPP/Android layout, migrate to the “new Android source set layout” described by JetBrains. [2]

  2. Use KSP for Hilt by putting the compiler on ksp(...) (not kapt(...)), per Dagger’s KSP setup docs: [3]

plugins {
  id("com.android.application")
  id("com.google.dagger.hilt.android")
  id("com.google.devtools.ksp")
  // AGP < 9: also apply id("org.jetbrains.kotlin.android")
}

dependencies {
  implementation("com.google.dagger:hilt-android:<version>")
  ksp("com.google.dagger:hilt-compiler:<version>")
  // If you use AndroidX Hilt extensions (work, navigation, etc.):
  // ksp("androidx.hilt:hilt-compiler:<version>")
}
  1. Make sure your Kotlin + KSP versions match. With AGP 9.0, AGP has “built-in Kotlin” enabled by default and will align/upgrade KGP/KSP to compatible minimums unless you override. [4]

When to touch android.disallowKotlinSourceSets

  • If your build breaks after enabling it: set android.disallowKotlinSourceSets=false (or remove it if your AGP default is already false) while you migrate off Kotlin-source-set customization. [1][2]
  • If you don’t use custom Kotlin source sets: you typically don’t need this property at all.

Sources:
[1] AndroidX gradle.properties (shows android.disallowKotlinSourceSets=false and “will change in AGP 9.0.0”) https://android.googlesource.com/platform/frameworks/support/+/androidx-main/gradle.properties
[2] Kotlin docs: Android source set layout / migration https://kotlinlang.org/docs/multiplatform/multiplatform-android-layout.html
[3] Dagger docs: KSP setup for Dagger/Hilt https://dagger.dev/dev-guide/ksp.html
[4] AGP 9.0 release notes (built-in Kotlin + KSP alignment) https://developer.android.com/build/releases/agp-9-0-0-release-notes


AGP 9.0.0 마이그레이션: 임시 속성 설정 확인

새로 추가된 세 가지 속성은 AGP 9.0.0 마이그레이션을 위한 임시 설정입니다:

  • android.uniquePackageNames=false — AGP 9.0에서 기본값이 false → true로 변경되어 라이브러리 패키지명의 유일성이 강제됩니다. 이 설정은 중복된 패키지명을 가진 의존성들을 업그레이드하거나 교체할 때까지의 임시 완화입니다.

  • android.r8.strictFullModeForKeepRules=false — AGP 9.0에서 기본값이 false → true로 변경되어 R8의 keep 규칙이 더 엄격해집니다(예: 기본 생성자를 명시적으로 지정해야 함). 이 설정은 기존 keep 규칙들을 업데이트할 때까지의 임시 회피책입니다.

  • android.disallowKotlinSourceSets=false — 레거시 Kotlin 소스셋 레이아웃을 사용 중인 경우 빌드 호환성을 위한 플래그입니다. AGP 9.0의 built-in Kotlin 기능과 함께 사용할 때 기존 설정을 유지하도록 합니다.

향후 의존성을 업그레이드하고 코드를 AGP 9.0의 새로운 기본값에 맞게 수정한 후 이 속성들을 제거하는 것이 권장됩니다.

🤖 Prompt for AI Agents
In `@gradle.properties` around lines 45 - 53, These three gradle properties
(android.uniquePackageNames, android.r8.strictFullModeForKeepRules,
android.disallowKotlinSourceSets) are temporary workarounds for AGP 9.0; remove
them once you migrate: update/replace dependencies that cause duplicate package
names so you can drop android.uniquePackageNames=false, revise R8 keep
rules/explicit constructors so android.r8.strictFullModeForKeepRules=false is no
longer needed, and convert legacy Kotlin source set layout to the new built-in
Kotlin layout so android.disallowKotlinSourceSets=false can be removed; after
each change, remove the corresponding property and run a clean build to verify
compatibility with AGP 9.0 defaults.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants