web-dev-qa-db-ja.com

Android Gradle Implementation vs CompileOnly Performance

ドキュメントimplementationは、compile/apiに比べてビルド時間を大幅に改善することに言及しています。 compileOnlyはどうですか?

私のユースケースは、マルチモジュール(Gradleのマルチプロジェクト用語が気に入らない)プロジェクトです。ここでは、Androidアプリと、アプリが依存する複数のライブラリ(implementation)。一部のライブラリも相互に依存しています。ライブラリモジュールで依存関係を宣言するときにimplementationまたはcompileOnlyを使用する必要がありますか?アプリモジュールはimplementationこれらのアーティファクトに依存するため、ライブラリモジュールを介して推移的である必要はありません。

25
Eliezer

api構成は、外部modules(推移的依存関係)にエクスポートされる依存関係に使用する必要があります。 Vice-Versa implementation構成は、コンポーネントの内部の依存関係(推移的依存関係ではない)に使用する必要があります。

実装vs compileOnly

彼らの仕事に類似点はありません。compileOnly

  • javaプラグインから継承された構成
  • コンパイル時に必要
  • また、ランタイムクラスパスに含まれていないか、依存プロジェクトに公開されていません。

したがって、compileOnlyimplementation構成ジョブを置き換えません。例:

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を使用することをお勧めします。

次のグラフは、これらの構成を示しています。

enter image description here

パフォーマンス?

gradleはその中のすべてのクラスをスナップショットするため、apiはより多くのメモリを必要とすると思いますtransitivemodule、またはその逆implementationは、(上記のように)独自の内部実装に使用されるため、推奨される構成です。

21
user6490462

Android Gradleプラグイン3.0では、compileキーワードはimplementationおよびapiの代わりに廃止されました。

  • api:独自のインターフェイスを介してこのモジュールのインターフェイスをリークします。つまり、古いcompile依存関係とまったく同じです。

  • implementation:このモジュールは内部でのみ使用し、インターフェースからリークしません

APIと実装の詳細を読む here および here

compileOnly依存関係はprovidedと同様に機能し、コンパイル時にのみ使用される非推移的な依存関係を宣言できます。

コンパイルのみの依存関係は、次のような多くのユースケースに対応しています。

  • ソースのみの注​​釈や注釈プロセッサなど、コンパイル時には必要ですが、実行時には必要とされない依存関係。
  • コンパイル時には必要ですが、特定の機能を使用する場合にのみ実行時に必要な依存関係 オプションの依存関係使用する );
  • コンパイル時にAPIが必要であるが、実装が消費ライブラリ、アプリケーション、またはランタイム環境によって提供される依存関係。

コンパイルのみの依存関係は、通常のコンパイルの依存関係とは明らかに異なります。これらはランタイムクラスパスに含まれておらず、非推移的です。つまり、依存プロジェクトには含まれていません。

続きを読む こちら

7
yoAlex5