Esta resposta vai demonstrar a diferença entre implementation
, api
e compile
em um projeto.
Digamos que eu tenho um projeto com três módulos Gradle:
- app (um aplicativo Android)
- myandroidlibrary (uma biblioteca Android)
- myjavalibrary (uma biblioteca Java)
app
tem myandroidlibrary
como dependências. myandroidlibrary
tem myjavalibrary
como dependências.
myjavalibrary
tem uma MySecret
classe
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrary
tem MyAndroidComponent
classe que manipula valor da MySecret
classe
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Por fim, app
está interessado apenas no valor demyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Agora, vamos falar sobre dependências ...
app
precisa consumir :myandroidlibrary
, portanto, no app
uso build.gradle implementation
.
( Nota : você também pode usar api / compile. Mas mantenha esse pensamento por um momento.)
dependencies {
implementation project(':myandroidlibrary')
}
Como você acha que o myandroidlibrary
build.gradle deve ser? Qual escopo devemos usar?
Temos três opções:
dependencies {
// Option #1
implementation project(':myjavalibrary')
// Option #2
compile project(':myjavalibrary')
// Option #3
api project(':myjavalibrary')
}
Qual a diferença entre eles e o que devo usar?
Compilar ou API (opção 2 ou 3)
Se você estiver usando compile
ou api
. Nosso aplicativo Android agora pode acessar a myandroidcomponent
dependência, que é uma MySecret
classe.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
Implementação (opção 1)
Se você estiver usando a implementation
configuração, MySecret
não será exposto.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
Então, qual configuração você deve escolher? Isso realmente depende da sua exigência.
Se você deseja expor dependências, use api
ou compile
.
Se você não deseja expor dependências (ocultando seu módulo interno), useimplementation
.
Nota:
Esta é apenas uma essência das configurações de Gradle, consulte a Tabela 49.1. Plug-in da Biblioteca Java - configurações usadas para declarar dependências para obter explicações mais detalhadas.
O projeto de amostra para esta resposta está disponível em https://github.com/aldoKelvianto/ImplementationVsCompile