@Provides メソッドはすべて static に - Dagger2

👉 Dagger 2 on Android: The Official Guidelines You Should Be Following 

any module whose @Provides methods are all static, the implementation doesn’t need an instance at all.

すべてのモジュールの @Provides メソッドはすべて static。実装部分にインスタンスは必要ない。

👉 User's Guide 

モジュールの @Provides メソッドが static であれば、Daggerはそれをインスタンス化する必要がない。

もし、そうできないのならそのモジュールは「状態」を持っているので修正するべき。

Warning: it’s discouraged for modules to have state; this can lead to unpredictable behavior. Moreover, module instances in general are rarely useful. We have considered removing them.

警告: モジュールが「状態」を持つことは推奨されません。これにより、予期しないふるまいが発生する可能性があります。

👉 Dagger Core Semantics 

Kotlin で static なメソッドを書く場合2つの方法があります。

トップレベルで object を使う方法。


@Module
object DataModule {
  @JvmStatic @Provides fun provideDiskCache() = DiskCache()
}

companion object を使う方法。


@Module
abstract class DataModule {
  @Binds abstract fun provideCache(diskCache: DiskCache): Cache

  @Module
  companion object {
    @JvmStatic @Provides fun provideDiskCache() = DiskCache()
  }
}

👉 Kotlin+Dagger best practices/documentation/pain points · Issue #900 · google/dagger 

この2つの方法に対してJakeさんがコメントしています。

First of all, this speed benefit will be extraordinarily minor. If you are looking to make your app faster then use a profiler. You will find 100 easier optimization targets.
Beyond that, don't use companion object for modules. Use object. In that case the instance will be unused and its initialization code will be removed by R8 and the methods will be truly static and can also be inlined just like Java.

まず第一に、この速度の利点は非常にわずかです。アプリをより高速にしたい場合は、プロファイラーを使用してください。 100の簡単な最適化ターゲットがあります。
さらに、モジュールには「コンパニオンオブジェクト」を使用しないでください。オブジェクトを使用します。その場合、インスタンスは使用されず、その初期化コードはR8によって削除され、メソッドは真に静的であり、Javaと同様にインライン化することもできます。

👉 Kotlin+Dagger best practices/documentation/pain points · Issue #900 · google/dagger 

インスタンスが不要な場合、R8の静的化によりオブジェクトのメソッドを静的にすることができますが、Daggerはコンパイル時にそれらを静的にする必要があるため、@JvmStaticアノテーションは必要です。


関連ワード:  AndroidKotlin開発


さらば proguard、ようこそ R8。

DSL element 'useProguard' is obsolete and will be removed soon. Use 'android.enableR8' in gradle.properties to switch between R8 and Proguard..

DSL要素「useProguard」は廃止されており、まもなく削除されます。 gradle.propertiesで「android.enableR8」を使用して、R8とProguardを切り替えます。

gradle.properties


android.enableR8=true

build.gradle

とりあえずは、いけるが。

以下、編集風景。



しかし、minify とか、proguardFiles とか、どうなるの?

👉 Android Developers Blog: R8, the new code shrinker from Google, is available in Android studio 3.3 beta 


Studio does not have write access to /private/var/folders/Android Studio.app/Contents. Please run it by a privileged user to update. で Android Studio が更新できない。

これ。

Studio does not have write access to /private/var/folders/Android Studio.app/Contents. Please run it by a privileged user to update.

と表示されて、新バージョンに更新できません。

Toolbox App のトッラカーにて。

👉 Android 3.5.0 not available many hours after release : TBX-3894 

Toolbox App 公式ブログ。


👉 JetBrains Toolbox 2019.2 | JetBrains Blog 

こういうところで、Google と JetBrains 間で微妙にズレちゃうんでしょう。

今現在私のMac版は最新で。

Toolbox App 側が更新されるのをじっと待つのが吉でしょうな。

追記:2019-08-21 20:07

Toolbox App のバージョンはそのままだけども、Android Studio 3.4 の「UPDATE」ボタンが有効になって3.5へのアップデートが可能となりました!

そして、何度かのダイアログ「OK」→「Restart」を経てやっとアップデート完了できましたとさ。

👉 さらば proguard、ようこそ R8。 

(👉つづく...)