프로그래밍/Android

[안드로이드] HiltWorker 오류 Could not create Worker 해결방법

Lou Park 2022. 9. 13. 22:21

HiltWorker로 Worker에 의존성 주입받기

우선 필요한 dependency는 다음과 같다.

Coroutine은 예시에서 CoroutineWorker를 만들 것이기때문에 넣어주었다.

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1'

implementation "com.google.dagger:hilt-android:2.38.1"
kapt "com.google.dagger:hilt-android-compiler:2.38.1"
implementation("androidx.hilt:hilt-work:1.0.0")
kapt("androidx.hilt:hilt-compiler:1.0.0")

implementation "androidx.work:work-runtime:2.6.0"
implementation "androidx.work:work-runtime-ktx:2.6.0"

 

Worker에 의존성 주입을 하기 위해서 @HiltWorker Annotation을 이용할 수 있다.

@HiltWorker
class FCMWorker @AssistedInject constructor(
    @Assisted context: Context,
    @Assisted workerParameters: WorkerParameters,
    private val db: Database
) : CoroutineWorker(context, workerParameters) {
    // ...
}

예시에는 Database라는 클래스를 주입받고있는데, SingletonComponent들만 Worker에 주입받을 수 있다.

Worker는 setWorkerFactory()를 통해서 설정할 수 있는 HiltWorkerFactory를 통해 생성이 되는데, Application 클래스에서 다음과 같이 설정할 수 있다.

@HiltAndroidApp
class MyApplication : Application(), Configuration.Provider {

    @Inject lateinit var workerFactory: HiltWorkerFactory

    override fun getWorkManagerConfiguration(): Configuration {
        return Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .build()
    }
}

 

Could not create Worker 해결방법

이렇게 까지만 하면 Could not create Worker오류가 생기면서 Worker가 제대로 돌아가지 않을 것이다. AndroidManifest.xmlprovider를 하나 추가해주면된다.

<application>
    <provider
        android:name="androidx.startup.InitializationProvider"
        android:authorities="${applicationId}.androidx-startup"
        tools:node="remove" />
</application>

 

ProcessLifecycleOwner가 작동하지 않는 문제

Application에 ProcessLifecycleOwner를 이용해서 Foreground 체크를 하는 코드가 있었는데, Worker를 추가하니 작동이 안되었다. 뭘까...하고찾아봤는데 ProcessLifecycleOwner 초기화가 androidx.startup을 사용하는 것으로 바뀌었다고한다.

 

아까 추가한 provider에서 tools:node="remove"가 AndroidX StartUp 프로세스를 비활성화 하므로 ProcessLifecycleOwner가 초기화되지 않게된다.

 

tools:node="remove" 대신에, tools:node="merge"로 바꿔주면 작동하게 된다. 하지만 아마도 Release 빌드에는 실패할텐데, Remove androidx.work.WorkManagerInitializer from your AndroidManifest.xml when using on-demand initialization. 라고 경고할거다. WorkManagerInitializer에는 remove를 사용할 수 있도록 수정해준다.

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">

    <meta-data
        android:name="androidx.work.WorkManagerInitializer"
        android:value="androidx.startup"
        tools:node="remove" />

</provider>

 

 

참고자료

https://stackoverflow.com/questions/71493022/processlifecycleowner-not-working-after-updating-app-compat-to-to-1-4-1

https://github.com/google/dagger/issues/2601