Infinito Nirone 7

白羽の矢を刺すスタイル

WorkManager Migration to 2.9.0

AndroidX WorkManager の 2.9.0 がリリースされました。以前のバージョンからこのバージョンに上げるにはマイグレーションが必要です。

https://developer.android.com/jetpack/androidx/releases/work?hl=en#2.9.0

Configuration.Provider の実装

2.8.x 以前は次のような定義でした。

interface Provider {
  fun getWorkManagerConfiguration(): Configuration
}

この定義が 2.9.0 では次のように変わりました。

interface Provider {
  val workManagerConfiguration: Configuration
}

このインタフェースは Application クラスで実装せよとあるので、2.8.x 以前であれば次のような実装になるはずです。

class MyApp : Application(), Configuration.Provider {
  override fun getWorkManagerConfiguration(): Configuration = Configuration.Builder()
    .setMinimumLoggingLevel(Log.VERBOSE)
    // ... do your configuration customization
    .build()
}

2.9.0 へのアップデートでは、次のように書き換わります。

class MyApp : Application(), Configuration.Provider {
  override val workManagerConfiguration: Configuration = Configuration.Builder()
    .setMinimumLoggingLevel(Log.VERBOSE)
    // ... do your configuration customization
    .build()
}

HiltWorkerFactory と組み合わせる

次の記事で紹介した方法で、WorkManager と Hilt を組み合わせることができます。

blog.keithyokoma.dev

Hilt は各種 Worker に依存を注入するために独自の WorkerFactory を使います。そのため、Application クラスで次のように WokerFactory を注入して Configuration に渡しているはずです(2.8.x 以前)。

class MyApp : Application(), Configuration.Provider {
  @Inject
  lateinit var workerFactory: HiltWorkerFactory

  override fun getWorkManagerConfiguration(): Configuration = Configuration.Builder()
    .setWorkerFactory(workerFactory)
    // ... do your configuration customization
    .build()
}

WorkManager 2.9.0 へアップデートするとき、Hilt と組み合わせている場合は先程の書き換え方をそのまま適用すると workerFactory が注入される前に Configuration を作ってしまうためアプリがクラッシュします。

class MyApp : Application(), Configuration.Provider {
  @Inject
  lateinit var workerFactory: HiltWorkerFactory

  override val workManagerConfiguration: Configuration = Configuration.Builder()
    .setWorkerFactory(workerFactory)
    // ... do your configuration customization
    .build()
}

正しく動作するよう書き換えるには次のように getter で Configuration を作成します。

class MyApp : Application(), Configuration.Provider {
  @Inject
  lateinit var workerFactory: HiltWorkerFactory

  override val workManagerConfiguration: Configuration
    get() = Configuration.Builder()
      .setWorkerFactory(workerFactory)
      // ... do your configuration customization
      .build()
}