Gradle 実装と API 構成 質問する

Gradle 実装と API 構成 質問する

依存関係を構築する際に、apiと の構成の違いは何かを理解しようとしています。implementation

ドキュメントではimplementationビルド時間が短縮されると書いてあるが、これを見るとコメント同様の質問で、それが本当かどうか疑問に思いました。

私はGradleの専門家ではありません。ドキュメンテーションすでにあるのですが、わかりやすい説明が気になりました。

ベストアンサー1

Gradleキーワードは非推奨となり、依存関係を構成するためのおよびキーワードがcompile使用されるようになりました。apiimplementation

を使用すること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を使用するとします。apidependencies{}

dependencies {
    api(project(":InternalLibrary"))
}

MyLibraryコード内で使用したい場合は、アプリにbuild.gradle次の依存関係を追加します。

dependencies {
    implementation(project(":MyLibrary"))
}

アプリケーション コードでアクセスできるapi構成 (または非推奨の)を使用します。compileInternalLibrary

// 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 部分のみ)

Google I/O 2017 - Gradle ビルドを高速化する方法 ( 1 * を参照)

Android ドキュメント

おすすめ記事