#1 ๋ฌธ์ ์ํฉ
#1-1 Hilt ๋์
[Android] Dagger2 - Hilt๋ก ๋ง์ด๊ทธ๋ ์ด์
#1 Hilt ๊ฐ์ Hilt๋ฅผ ์ฌ์ฉํ ์ข ์ ํญ๋ชฉ ์ฝ์ | Android Developers์ด ํ์ด์ง๋ Cloud Translation API๋ฅผ ํตํด ๋ฒ์ญ๋์์ต๋๋ค. Hilt๋ฅผ ์ฌ์ฉํ ์ข ์ ํญ๋ชฉ ์ฝ์ ์ปฌ๋ ์ ์ ์ฌ์ฉํด ์ ๋ฆฌํ๊ธฐ ๋ด ํ๊ฒฝ์ค์ ์ ๊ธฐ์ค์ผ
kenel.tistory.com
์ ๊ฒ์๊ธ์ ๊ธฐ๋ฐํด, ๊ฐ๋ฐ ์ค์ธ ์ฑ์ Hilt๋ฅผ ๋์ ํ๊ณ ์์๋ค.
#1-2 Application ํด๋์ค
package com.example.nutri_capture_new.di
import android.app.Application
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class HiltApplication : Application()
"com.example.nutri_capture_new"๋ ๋ด๊ฐ ๊ฐ๋ฐ ์ค์ธ ํ๋ก์ ํธ ์ด๋ฆ์ด๋ค. ์ฌ๊ธฐ์ "di" ํจํค์ง๋ฅผ ๋ง๋ค๊ณ HiltApplication.kt๋ฅผ ๋ฃ์๋ค. Hilt๋ Application ํด๋์ค๋ฅผ ์๊ตฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
#1-3 ์๋ฌ ๋ฉ์์ง
java.lang.RuntimeException: Unable to instantiate application com.example.nutri_capture_new.di.HiltApplication package com.example.nutri_capture_new: java.lang.ClassNotFoundException: Didn't find class "com.example.nutri_capture_new.di.HiltApplication" on path: DexPathList[[zip file "/data/app/~~V6g0-RtfopAougO3sWY7bA==/com.example.nutri_capture_new-blpUDwYEKGYG8Zyat-1NKA==/base.apk"],nativeLibraryDirectories=[/data/app/~~V6g0-RtfopAougO3sWY7bA==/com.example.nutri_capture_new-blpUDwYEKGYG8Zyat-1NKA==/lib/arm64, /data/app/~~V6g0-RtfopAougO3sWY7bA==/com.example.nutri_capture_new-blpUDwYEKGYG8Zyat-1NKA==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]]
at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1574)
at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1503)
...
์์ฝํ๋ฉด, HiltApplication ํด๋์ค๋ฅผ ์ฐพ์ ์ ์์ด ๋ฐํ์ ์๋ฌ๊ฐ ๋๋ค๋ ๋ง์ด๋ค.
์ ์ฒด ์๋ฌ ๋ฉ์์ง
java.lang.RuntimeException: Unable to instantiate application com.example.nutri_capture_new.di.HiltApplication package com.example.nutri_capture_new: java.lang.ClassNotFoundException: Didn't find class "com.example.nutri_capture_new.di.HiltApplication" on path: DexPathList[[zip file "/data/app/~~V6g0-RtfopAougO3sWY7bA==/com.example.nutri_capture_new-blpUDwYEKGYG8Zyat-1NKA==/base.apk"],nativeLibraryDirectories=[/data/app/~~V6g0-RtfopAougO3sWY7bA==/com.example.nutri_capture_new-blpUDwYEKGYG8Zyat-1NKA==/lib/arm64, /data/app/~~V6g0-RtfopAougO3sWY7bA==/com.example.nutri_capture_new-blpUDwYEKGYG8Zyat-1NKA==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]]
at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1574)
at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1503)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7558)
at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2400)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8762)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.nutri_capture_new.di.HiltApplication" on path: DexPathList[[zip file "/data/app/~~V6g0-RtfopAougO3sWY7bA==/com.example.nutri_capture_new-blpUDwYEKGYG8Zyat-1NKA==/base.apk"],nativeLibraryDirectories=[/data/app/~~V6g0-RtfopAougO3sWY7bA==/com.example.nutri_capture_new-blpUDwYEKGYG8Zyat-1NKA==/lib/arm64, /data/app/~~V6g0-RtfopAougO3sWY7bA==/com.example.nutri_capture_new-blpUDwYEKGYG8Zyat-1NKA==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
at java.lang.ClassLoader.loadClass(ClassLoader.java:637)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
at android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:76)
at androidx.core.app.CoreComponentFactory.instantiateApplication(CoreComponentFactory.java:51)
at android.app.Instrumentation.newApplication(Instrumentation.java:1232)
at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1566)
at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1503)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7558)
at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2400)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8762)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
Suppressed: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/example/nutri_capture_new/di/Hilt_HiltApplication;
at java.lang.VMClassLoader.findLoadedClass(Native Method)
at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:1276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:621)
... 16 more
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.nutri_capture_new.di.Hilt_HiltApplication" on path: DexPathList[[zip file "/data/app/~~V6g0-RtfopAougO3sWY7bA==/com.example.nutri_capture_new-blpUDwYEKGYG8Zyat-1NKA==/base.apk"],nativeLibraryDirectories=[/data/app/~~V6g0-RtfopAougO3sWY7bA==/com.example.nutri_capture_new-blpUDwYEKGYG8Zyat-1NKA==/lib/arm64, /data/app/~~V6g0-RtfopAougO3sWY7bA==/com.example.nutri_capture_new-blpUDwYEKGYG8Zyat-1NKA==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
at java.lang.ClassLoader.loadClass(ClassLoader.java:637)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
... 19 more
#2 ์์ธ - kapt์ ๋ถ์ฌ
plugins {
...
// KSP (์ด๋
ธํ
์ด์
์ฝ๊ธฐ์ฉ)
id("com.google.devtools.ksp")
// Hilt
id("com.google.dagger.hilt.android")
}
android {
...
}
dependencies {
...
// Hilt
implementation("com.google.dagger:hilt-android:2.46")
ksp("com.google.dagger:hilt-compiler:2.46")
}
KSP๊ฐ kapt์ ์์ ํ ์์ํธํ์ด๋ผ๊ณ ์๊ฐํ ๊ฒ์ด ๋ฌธ์ ์๋ค.
Hilt๋ dagger2๋ฅผ ๋ ์ฝ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ ์ถ์ํ ๊ณ์ธต์ด๋ค. ๋ฐ๋ผ์ Hilt๋ ๋ด๋ถ์ ์ผ๋ก๋ dagger2๋ผ๊ณ ๋ณผ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ dagger2๋ ๊ธฐ๋ณธ์ ์ผ๋ก kapt๋ฅผ ํตํด ์ด๋ ธํ ์ด์ (@)์ ์ฒ๋ฆฌํ๋ค. ์ดํ์ KSP๊ฐ ๋์๋๋ฐ, KSP๋ kapt๊ฐ ์ฝ์ ์ ์๋ ์ด๋ ธํ ์ด์ ์ ์ ๋ถ ์ปค๋ฒํ์ง ๋ชปํ๋ค. ์ฆ, plungins { ... } ๋ฐ dependencies { ... }์ kapt ๋์ KSP๋ง ์ฐ๋ฉด ์ฝ์ง ๋ชปํ๋ ์ด๋ ธํ ์ด์ ์ด ์กด์ฌํ๊ฒ ๋๋ค. #1-2์ ์๋ ์ด๋ ธํ ์ด์ ์ธ @HiltAndroidApp์ KSP๋ก ์ฝ์ ์ ์๊ณ ๋ฐ๋์ kapt๋ก๋ง ์ฝ์ ์ ์๋ ์ด๋ ธํ ์ด์ ์ด๊ธฐ์, ์๋๋ก์ด๋ ๋ฐํ์์ด ๊ทธ ์กด์ฌ๋ฅผ ๊ฐ์งํ์ง ๋ชปํ๋ ๊ฒ์ด๋ค.
ํธํ์ฑ๊ณผ ์ฑ๋ฅ์ ๋ ๋ค ์ฑ๊ธฐ๋ ค๋ฉด KSP์ kapt๋ฅผ ๋๋ค ์ถ๊ฐํ๋ฉด ๋๋ค (#3 ์ฐธ์กฐ). ์ด๋ฌ๋ฉด kapt๋ก ์ฒ๋ฆฌํด์ผ๋ง ํ๋ ์ด๋ ธํ ์ด์ ์ kapt๊ฐ ์ฒ๋ฆฌํ๊ณ , ๋น๊ต์ ๋ ๋น ๋ฅธ KSP๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ๋ถ๋ถ์ KSP๋ก ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
#3 ํด๊ฒฐ
plugins {
...
// KSP ๋ฐ kapt (์ด๋
ธํ
์ด์
์ฝ๊ธฐ์ฉ)
id("com.google.devtools.ksp")
id("org.jetbrains.kotlin.kapt")
// Hilt
id("com.google.dagger.hilt.android")
}
android {
...
}
dependencies {
...
// Hilt
implementation("com.google.dagger:hilt-android:2.46")
kapt("com.google.dagger:hilt-android-compiler:2.46")
ksp("com.google.dagger:hilt-compiler:2.46")
}
#4 ์์ค ์ฝ๋
GitHub - Kanmanemone/nutri-capture-new
Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.
github.com
์๋ฌ๊ฐ ํด๊ฒฐ๋ ์ ์ฒด ์์ค ์ฝ๋ (๊ฐ๋ฐ ์ค์ธ ์ฑ์ ํต์ง ์์ค์ฝ๋)