web-dev-qa-db-ja.com

なぜAndroid Gradle依存関係で 'compile'を 'implementation'構成に変更しますか?

Android Studio 3.0(canary 3.0))で見られるように、depedencies構成の代わりにimplementationを宣言してcompileを追加します。

// Before
compile 'com.Android.support:appcompat-v7:25.3.1'

// Currently
implementation 'com.Android.support:appcompat-v7:25.3.1'

compileを引き続き使用できますが、理解したいと思います。

  • implementationcompileの設定の違いは何ですか?
  • なぜAndroid Gradleビルドがデフォルトとしてimplementationを使用するように変更されるのですか?
14
Quang Nguyen

compileは非推奨になり、代わりにapiまたはimplementationを使用する必要があるようです。 The Java Library Plugin-Gradle User Guide Version 3.5

compile構成はまだ存在しますが、apiおよびimplementation構成が提供する保証を提供しないため、使用しないでください。

14
petter

@petterからの非常に便利なリンクのおかげで、次のように要約を追加したいと思います。

だということだ Android Gradle buildJava-library以前のJavaプラグインの代わりのプラグイン。このプラグインはexposed API依存関係を宣言する2つのconfigurationの概念。

  1. api

ライブラリAPIによってエクスポートされる依存関係を宣言するために使用する必要があります

たとえば、他のアプリで使用されるJava(またはAndroid)ライブラリを構築している場合。サードパーティライブラリを使用し、そのAPIを公開する場合ライブラリのコンシューマも、このように宣言する必要があります。

api 'commons-httpclient:commons-httpclient:3.1'
  1. 実装

コンポーネントの内部にある依存関係を宣言するために使用する必要があります。

Android app)を開発する場合、appモジュールは、一部を外部に公開する必要のないエンドポイントです。implementationを使用する必要があります。

implementation 'org.Apache.commons:commons-lang3:3.5'

以前のcompile設定はapiと同じように機能します。ただし、implementationには次の利点があります。

  • 依存関係がコンシューマのコンパイルクラスパスに漏れることはないため、推移的な依存関係に誤って依存することはありません
  • クラスパスサイズの縮小によるコンパイルの高速化
  • 実装の依存関係が変更された場合の再コンパイルの減少:コンシューマを再コンパイルする必要はありません
  • よりクリーンなパブリッシング:新しいmaven-publishプラグインと併用すると、JavaライブラリはPOMファイルを生成し、
    に対してコンパイルするために必要なものを正確に区別します
    libraryおよび実行時にライブラリを使用するために必要なもの(言い換えれば、ライブラリ自体をコンパイルするために必要なものと、
    ライブラリに対してコンパイルするために必要なもの)。
29
Quang Nguyen