ドキュメントimplementation
は、compile
/api
に比べてビルド時間を大幅に改善することに言及しています。 compileOnly
はどうですか?
私のユースケースは、マルチモジュール(Gradleのマルチプロジェクト用語が気に入らない)プロジェクトです。ここでは、Androidアプリと、アプリが依存する複数のライブラリ(implementation
)。一部のライブラリも相互に依存しています。ライブラリモジュールで依存関係を宣言するときにimplementation
またはcompileOnly
を使用する必要がありますか?アプリモジュールはimplementation
これらのアーティファクトに依存するため、ライブラリモジュールを介して推移的である必要はありません。
api
構成は、外部modules
(推移的依存関係)にエクスポートされる依存関係に使用する必要があります。 Vice-Versa implementation
構成は、コンポーネントの内部の依存関係(推移的依存関係ではない)に使用する必要があります。
実装vs compileOnly:
彼らの仕事に類似点はありません。compileOnly
は
したがって、compileOnly
はimplementation
構成ジョブを置き換えません。例:
implementation 'com.Android.support:appcompat-v7:25.1.0' // can't use compileOnly here
testCompile 'junit:junit:4.12'
compile "com.google.dagger:dagger:2.8" // can't use here also
annotationProcessor "com.google.dagger:dagger-compiler:2.8" // can't use here also
compileOnly 'javax.annotation:jsr250-api:1.0' // we can use compileOnly here because it's required on run time only.
ケースは「マルチモジュール」であるため、api
構成を使用する必要があります。最終モジュールに到達するまでは、implementation
を使用することをお勧めします。
次のグラフは、これらの構成を示しています。
パフォーマンス?
gradleはその中のすべてのクラスをスナップショットするため、api
はより多くのメモリを必要とすると思いますtransitivemodule、またはその逆implementation
は、(上記のように)独自の内部実装に使用されるため、推奨される構成です。
Android Gradleプラグイン3.0では、compile
キーワードはimplementation
およびapi
の代わりに廃止されました。
api
:独自のインターフェイスを介してこのモジュールのインターフェイスをリークします。つまり、古いcompile
依存関係とまったく同じです。
implementation
:このモジュールは内部でのみ使用し、インターフェースからリークしません
compileOnly
依存関係はprovided
と同様に機能し、コンパイル時にのみ使用される非推移的な依存関係を宣言できます。
コンパイルのみの依存関係は、次のような多くのユースケースに対応しています。
コンパイルのみの依存関係は、通常のコンパイルの依存関係とは明らかに異なります。これらはランタイムクラスパスに含まれておらず、非推移的です。つまり、依存プロジェクトには含まれていません。
続きを読む こちら