この答えは、違いを実証するimplementation
、api
とcompile
のプロジェクトに。
3つのGradleモジュールを含むプロジェクトがあるとします。
- アプリ(Androidアプリ)
- myandroidlibrary(Androidライブラリ)
- myjavalibrary(Javaライブラリ)
app
持っているmyandroidlibrary
依存関係として。myandroidlibrary
持っているmyjavalibrary
依存関係として。
myjavalibrary
持っているMySecret
クラスを
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrary
持っているMyAndroidComponent
から値を操作するクラスMySecret
クラスを。
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
最後に、app
からの値にのみ興味がありますmyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
さて、依存関係について話しましょう...
app
消費する必要がある:myandroidlibrary
ので、app
build.gradleで使用しますimplementation
。
(注:api / compileも使用できます。ただし、しばらく考えてみてください。)
dependencies {
implementation project(':myandroidlibrary')
}
myandroidlibrary
build.gradleはどのように見えると思いますか?どのスコープを使用する必要がありますか?
3つのオプションがあります。
dependencies {
// Option #1
implementation project(':myjavalibrary')
// Option #2
compile project(':myjavalibrary')
// Option #3
api project(':myjavalibrary')
}
それらの違いは何ですか?何を使うべきですか?
コンパイルまたはAPI(オプション#2または#3)
compile
またはを使用している場合api
。Androidアプリケーションがmyandroidcomponent
依存関係にアクセスできるようになりましたMySecret
。これはクラスです。
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
実装(オプション#1)
implementation
設定を使用している場合、MySecret
は公開されません。
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
では、どの構成を選択する必要がありますか?それは本当にあなたの要件に依存します。
あなたは場合は、依存関係を公開する使用しapi
たりcompile
。
依存関係を公開したくない場合(内部モジュールを非表示にする場合)は、を使用しますimplementation
。
注意:
これはGradle構成の要旨です。表49.1を参照してください。Java Libraryプラグイン-より詳細な説明のために依存関係を宣言するために使用される構成。
この回答のサンプルプロジェクトはhttps://github.com/aldoKelvianto/ImplementationVsCompileにあります