Esta resposta vai demonstrar a diferença entre implementation, apie compileem 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)
apptem myandroidlibrarycomo dependências. myandroidlibrarytem myjavalibrary como dependências.

myjavalibrarytem uma MySecretclasse
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrarytem MyAndroidComponentclasse que manipula valor da MySecretclasse
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Por fim, appestá interessado apenas no valor demyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Agora, vamos falar sobre dependências ...
appprecisa consumir :myandroidlibrary, portanto, no appuso 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 myandroidlibrarybuild.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 compileou api. Nosso aplicativo Android agora pode acessar a myandroidcomponentdependência, que é uma MySecretclasse.
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 implementationconfiguração, MySecretnã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 apiou 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