1. ホーム
  2. gradle

[解決済み] Gradleのimplementation, api, compileの違いは何ですか?

2022-03-18 23:23:27

質問

Android Studio 3.0にアップデートし、新しいプロジェクトを作成した後、次のことに気づきました。 build.gradle の代わりに、新しい依存関係を追加する新しい方法があります。 compile があります。 implementation の代わりに testCompile があります。 testImplementation .

 implementation 'com.android.support:appcompat-v7:25.0.0'
 testImplementation 'junit:junit:4.12'

ではなく

 compile 'com.android.support:appcompat-v7:25.0.0'
 testCompile 'junit:junit:4.12'

その違いと、何を使えばいいのか?

どのように解決するのですか?

tl;dr

置き換えるだけ。

  • compileimplementation (他動性が必要ない場合)または api (他動性が必要な場合)
  • testCompiletestImplementation
  • debugCompiledebugImplementation
  • androidTestCompileandroidTestImplementation
  • compileOnly はまだ有効です。3.0で追加されたもので、providedを置き換えてコンパイルしないようにしたものです。( provided Gradleがそのユースケースに対応する設定名を持たず、Mavenのprovided scopeにちなんで名付けた時に導入されました)。

これは Android Gradle プラグイン 3.0 そのGoogleが IO17で発表された .

は、以下の通りです。 compile の構成は 現在では非推奨 で置き換える必要があります。 implementation または api

から Gradleのドキュメント :

dependencies {
    api 'commons-httpclient:commons-httpclient:3.1'
    implementation 'org.apache.commons:commons-lang3:3.5'
}

に現れる依存関係 api 構成は ライブラリのコンシューマに移行して公開されます。 は、コンシューマのコンパイルクラスパスに表示されます。

で見つかった依存関係は implementation 一方 一方、コンシューマには公開されず、したがって は、コンシューマのコンパイルクラスパスに含まれます。これにはいくつかの利点があります。

  • 依存関係がコンシューマのコンパイルクラスパスに漏れることがなくなるので、誤って過渡的な 依存関係
  • クラスパスサイズの縮小により、コンパイルの高速化を実現
  • 実装の依存関係が変わったときの再コンパイルが少ない:コンシューマを再コンパイルする必要がない。
  • よりクリーンなパブリッシング:新しい maven-publish プラグインと組み合わせて使用すると、Java ライブラリは、以下のような POM ファイルを生成します。 に対してコンパイルするために必要なものを正確に区別します。 ライブラリと、そのライブラリを実行時に使用するために必要なもの(言い換えれば つまり、ライブラリ自体をコンパイルするために必要なものと、そのライブラリに含まれる に対してコンパイルするために必要です)。

コンパイル設定もまだ存在しますが、これは apiimplementation コンフィギュレーションを提供します。


アプリモジュール内でライブラリだけを使用する場合(一般的なケース)、何の違いも感じないでしょう。
モジュール同士が互いに依存しているような複雑なプロジェクトや、ライブラリを作成している場合のみ、その違いがわかります。