Hilt 라이브러리를 적용하다 생긴 오류.
1번째 시도 : build.gradle.kts의 android {} 블록 내부에 META-INF 추가
StackOverFlow에서 답변을 찾아본 결과
build.gradle.kts의 android {} 블록 내부에 있는 packaging {} 블록에 annotation.processors 관련한 META-INF를 추가하라는 내용이 존재했다. 이를 보고 작성한 것인지 한 한글로 된 블로그에도 다음과 같은 해결법이 적혀있었다.
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
// ▽ Add this one.
excludes += "/META-INF/gradle/incremental.annotation.processors"
}
}
이 작업을 시행하면 안드로이드 스튜디오 자체에서 Build 할때는 오류가 발생하지 않게 된다.
하지만, 애플리케이션 실행시 다음과 같은 기나긴 오류가 발생하게 되었다.
[추가오류 발생]
unable to instantiate application cohttp://m.example.hilt test.application package com.example.hilttest: java.lang.classnotfoundexception: didn't find class "com.example.hilttest.application" on path: dexpathlist[[zip file "/data/app/~~_rkgaz6p445i7iy_yulfgw==/com.example.hilttest-d7s2gctjpg7gjk4zd4atsw==/base.apk"],nativelibrarydirectories=[/data/app/~~_rkgaz6p445i7iy_yulfgw==/com.example.hilttest-d7s2gctjpg7gjk4zd4atsw==/lib/x86_64, /system/lib64, /system_ext/lib64]]
2번째 시도: hilt-compiler를 annotationProcessor로 종속성 선언
이에 dagger-hilt 공식 홈페이지를 찾아가서 setup을 재확인 하였다.
https://dagger.dev/hilt/gradle-setup
dependencies {
implementation 'com.google.dagger:hilt-android:2.51.1'
annotationProcessor 'com.google.dagger:hilt-compiler:2.51.1'
// For instrumentation tests
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.51.1'
androidTestAnnotationProcessor 'com.google.dagger:hilt-compiler:2.51.1'
// For local unit tests
testImplementation 'com.google.dagger:hilt-android-testing:2.51.1'
testAnnotationProcessor 'com.google.dagger:hilt-compiler:2.51.1'
}
들어가자마자 바로 위처럼 annotationProcessor로 hilt-compiler를 추가하는게 있길래 작성해보았으나 오류는 매한가지였다.
[실패]
3번째 시도: kapt 플러그인 적용 및 kapt로 종속성 선언
이후, 해당 문서에 나와있는 Using Hilt with Kotlin 항목을 확인한 결과.
몇몇 StackOverFlow 답변에도 나와있는 kapt를 사용하라는 말과 동일하게 kapt 플러그인을 적용시킨 후, annotationProcessor 대신 kapt로 컴파일러 종속성을 선언하라는 것이었다.
kapt를 검색했더니 공식에선 저렇게 말하고.
다른 사용자들의 문서에선 kapt -> ksp 마이그레이션, ksp로 바꾸는 이유 등등 kapt 대신 ksp를 써야하는건가 싶었다.
https://kotlinlang.org/docs/ksp-overview.html#supported-libraries
하이퍼링크 되어있는 KSP에서 지원하는 라이브러리 목록을 참조하니, Koin은 완벽히 지원되지만, Dagger는 Alpha 버전, Hilt는 작업중에 있어서 KSP 적용은 하지 않기로 했다. 또한, kapt를 써도 되겠다고 마음 먹은 것에는 다음 블로그 글의 내용이었다.
https://velog.io/@jun34723/Android-Kapt-KSP
결국 이전에 Koin과 Hilt 중 뭘 써야할까에서 결론을 내린 것과 동일하게 프로젝트에 맞는걸 사용하라는 것이었다.
1. libs.version.toml에 다음 항목 추가
[versions]
kapt = "2.0.0"
...
[plugins]
jetbrainKotlinKapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kapt" }
2. build.gradle.kts(Project: @) 프로젝트 수준에 다음 항목 추가
plugins {
alias(libs.plugins.jetbrainKotlinKapt) apply false
}
3. build.gradle.kts(Module :app) 모듈 수준에 다음 항목 추가
plugins {
alias(libs.plugins.jetbrainKotlinKapt)
}
...
dependencies {
// Hilt
implementation(libs.hilt.android)
kapt(libs.hilt.compiler)
}
이전에 implementation / annotationProcesser로 hilt.compiler 추가했던 것을 kapt로 바꾼다.
[추가오류 발생]
그리고 빌드하면 hilt 관련 오류는 사라지고 다음 오류가 발생한다.
https://small-stepping.tistory.com/965
위 글과 해결법은 같다.
1. libs.version.toml에서 kotlin 버전을 2.0.0 이상으로 올리고, plugins에 composeCompiler를 추가하자.
[versions]
kotlin = "2.0.0" // <-- 버전 업
kapt = "2.0.0"
hilt = "2.51.1"
[libraries]
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" }
[plugins]
jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } // <-- 추가
jetbrainKotlinKapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kapt" }
daggerHiltAndroid = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
2. 마찬가지로 build.gradle.kts 프로젝트와, 모듈 수준의 plugins에 composeCompiler를 추가하자.
plugins {
alias(libs.plugins.jetbrainsKotlinAndroid) apply false
alias(libs.plugins.jetbrainKotlinKapt) apply false
alias(libs.plugins.daggerHiltAndroid) apply false
alias(libs.plugins.composeCompiler) apply false // <-- 추가
}
Sync Now, Build 등 여러 과정을 다 거친 이후 애플리케이션을 실행해보면 Hilt Annotaion을 추가한 상태임에도 불구하고 정상적으로 실행된다.
'개발 > Android Studio 에러' 카테고리의 다른 글
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!