依存関係を構築する際に、api
と の構成の違いは何かを理解しようとしています。implementation
ドキュメントではimplementation
ビルド時間が短縮されると書いてあるが、これを見るとコメント同様の質問で、それが本当かどうか疑問に思いました。
私はGradleの専門家ではありません。ドキュメンテーションすでにあるのですが、わかりやすい説明が気になりました。
ベストアンサー1
Gradleキーワードは非推奨となり、依存関係を構成するためのおよびキーワードがcompile
使用されるようになりました。api
implementation
を使用することapi
は非推奨の を使用することと同じなのでcompile
、 all をeverythingcompile
に置き換えるとapi
、常に動作します。
キーワードを理解するには、implementation
次の例を検討してください。
例
というライブラリがありMyLibrary
、それが内部的に という別のライブラリを使用しているとしますInternalLibrary
。次のようになります。
// 'InternalLibrary' module
public class InternalLibrary {
public static String giveMeAString(){
return "hello";
}
}
// 'MyLibrary' module
public class MyLibrary {
public String myString(){
return InternalLibrary.giveMeAString();
}
}
次のような構成MyLibrary
build.gradle
を使用するとします。api
dependencies{}
dependencies {
api(project(":InternalLibrary"))
}
MyLibrary
コード内で使用したい場合は、アプリにbuild.gradle
次の依存関係を追加します。
dependencies {
implementation(project(":MyLibrary"))
}
アプリケーション コードでアクセスできるapi
構成 (または非推奨の)を使用します。compile
InternalLibrary
// Access 'MyLibrary' (granted)
MyLibrary myLib = new MyLibrary();
System.out.println(myLib.myString());
// Can ALSO access the internal library too (but you shouldn't)
System.out.println(InternalLibrary.giveMeAString());
この方法では、モジュールはMyLibrary
何かの内部実装を潜在的に「漏らす」可能性があります。これは直接インポートされていないため、使用すべきではありません (使用できません)。
これを防ぐために設定implementation
が導入されました。implementation
代わりにapi
を使用すると、次のようになりますMyLibrary
。
dependencies {
implementation(project(":InternalLibrary"))
}
InternalLibrary.giveMeAString()
アプリコードを呼び出すことができなくなります。
この種のボックス化戦略により、Android Gradle プラグインは、 内の何かを編集した場合、へのアクセス権がないため、InternalLibrary
の再コンパイルのみがトリガーされMyLibrary
、アプリ全体の再コンパイルはトリガーされないことInternalLibrary
を認識できます。
ネストされた依存関係が多数ある場合、このメカニズムによりビルド速度が大幅に向上します。(これを完全に理解するには、最後にリンクされているビデオをご覧ください)
結論
新しい Android Gradle プラグイン 3.XX に切り替えるときは、すべてのコードをキーワード * (1 )
compile
に置き換える必要があります。その後、アプリをコンパイルしてテストしてみてください。問題がなければ、コードをそのままにしておきます。問題がある場合は、依存関係に問題があるか、現在は非公開でアクセスできないものを使用している可能性があります。 *Android Gradle プラグイン エンジニアの Jerome Dochez ( 1 )による提案implementation
ライブラリ管理者の場合は、
api
ライブラリのパブリック API に必要なすべての依存関係に を使用し、implementation
テスト依存関係や最終ユーザーが使用してはならない依存関係には を使用する必要があります。
役に立つ記事実装とAPIの違いを紹介
参考資料(これは時間節約のために分割された同じビデオです)
Google I/O 2017 - Gradle ビルドを高速化する方法 (フルビデオ)
Google I/O 2017 - Gradle ビルドを高速化する方法 (新しい Gradle プラグイン 3.0.0 部分のみ)