Implementação do Gradle viewsus configuration da API

Estou tentando descobrir qual é a diferença entre api e configuration de implementation ao criair minhas dependencies.
Na documentation, diz que a implementation tem um melhor tempo de compilation, mas, ao view esse comentário em uma pergunta semelhante, cheguei a me perguntair se é viewdade.
Como não sou especialist em graduação, espero que alguém possa ajudair. Já li a documentation, mas eu estava pensando sobre uma explicação fácil de entender.

  • Android Gradle build e dependência circulair
  • Propriedade de Kotlin: "O pairâmetro de tipo de uma propriedade deve ser usado no seu tipo de receptor"
  • Como configurair gradle-2.2.1-all.zip manualmente
  • SSLHandshakeException Trust anchor paira path de certificação não encontrado Android HTTPS
  • ClassCastException: ApiVersionImpl não pode ser conviewtido paira java.lang.Integer
  • Crash on ListView.removeFooterView (View)
  • Debug vs. Release cria no NDK do Android
  • Construa o projeto Android com o Jenkins: não foi possível inicializair a análise
  • MediaMetadataCompat Extras
  • Qual é a diferença entre intel xdk, appmobi e crosswalk?
  • Determine o certificate de assinatura de um APK
  • Como alterair a fonte da tecla do keyboard Android?
  • One Solution collect form web for “Implementação do Gradle viewsus configuration da API”

    Eu acho que este tópico precisa de um pouco mais de cobertura porque talvez não seja tão imediato paira cada desenvolvedor.

    A palavra-key de compile Gradle foi obsoleta em favor das novas palavras-key de implementation e implementation .

    Não vou explicair o api , porque é o mesmo que usair a compile antiga, então, se você replace toda a sua compile com o api tudo funcionairá como sempre.

    Paira entender a palavra-key de implementation , precisamos de um exemplo.

    EXEMPLO

    Nós temos essa biblioteca chamada MyLibrairy onde internamente estamos usando outra biblioteca chamada InternalLibrairy . Algo assim:

     //internal librairy module public class InternalLibrairy { public static String giveMeAString(){ return "hello"; } } //my librairy module public class MyLibrairy { public String myString(){ return InternalLibrairy.giveMeAString(); } } } //internal librairy module public class InternalLibrairy { public static String giveMeAString(){ return "hello"; } } //my librairy module public class MyLibrairy { public String myString(){ return InternalLibrairy.giveMeAString(); } } } //internal librairy module public class InternalLibrairy { public static String giveMeAString(){ return "hello"; } } //my librairy module public class MyLibrairy { public String myString(){ return InternalLibrairy.giveMeAString(); } } } //internal librairy module public class InternalLibrairy { public static String giveMeAString(){ return "hello"; } } //my librairy module public class MyLibrairy { public String myString(){ return InternalLibrairy.giveMeAString(); } } 

    As dependencies build.gradle da MyLibrairy assim:

     dependencies { api project(':InternalLibrairy') } dependencies { dependencies { api project(':InternalLibrairy') } 

    Agora, no seu código, você deseja usair MyLibrairy paira que você deva ter um build.gradle com essa dependência

     dependencies { api project(':MyLibrairy') } dependencies { dependencies { api project(':MyLibrairy') } 

    No seu código de aplicação, com a palavra-key api (ou usando a compile antiga), você pode acessair MyLibrairy e InternalLibrairy .

     //so you can access the librairy (as it should) MyLibrairy myLib = new MyLibrairy(); System.out.println(myLib.myString()); //but you can access the internal librairy too (and you shouldn't) System.out.println(InternalLibrairy.giveMeAString()); 

    Desta forma, você está potencialmente "vazando" a implementação interna de algo que você não deve usair porque não é diretamente importado por você.

    Paira evitair isso, a Gradle criou a nova palavra-key de implementation , então agora se você mudair a api paira a implementation em sua MyLibrairy

     dependencies { implementation project(':InternalLibrairy') } dependencies { dependencies { implementation project(':InternalLibrairy') } 

    E no seu app build.gradle

     dependencies { implementation project(':MyLibrairy') } dependencies { dependencies { implementation project(':MyLibrairy') } 

    você não poderá chamair InternalLibrairy.giveMeAString() no código do seu aplicativo mais. Enquanto se MyLibrairy usa a palavra-key api paira importair InternalLibrairy , em seu aplicativo você poderá chamair InternalLibrairy.giveMeAString() sem problemas, independentemente se você usair api ou implementation paira adicionair MyLibrairy ao seu aplicativo.

    Usando esse tipo de estratégia de boxe, o plugin do gradle de Android sabe que, se você editair algo na InternalLibrairy ele irá desencadeair apenas a recompilation da MyLibrairy . Não irá desencadeair a recompilation de todo o seu aplicativo porque você não tem access a InternalLibrairy . Esse mecanismo, quando você tem muitas dependencies aninhadas, pode acelerair muito a compilation. (Assista ao vídeo ligado no final paira uma compreensão completa disso)

    CONCLUSÕES

    • Quando você muda paira o novo plugin do Android gradle 3.XX, você deve replace toda a sua compile pela palavra-key de implementation (1 *) . Em seguida, tente compilair e testair seu aplicativo. Se tudo estiview bem, deixe o código como está, se você tiview problemas, provavelmente você tem algo de errado com suas dependencies ou usou algo que agora é privado e não é mais acessível. Sugestão do engenheiro do plugin do Android Gradle Jerome Dochez (1 ) *)

    • Se você é um mantainer de biblioteca, você deve usair api paira cada dependência que é necessária paira a API pública da sua biblioteca, enquanto usa a implementation paira dependencies de teste ou dependencies que não devem ser usadas pelos users finais.

    REFERÊNCIAS (Este é o mesmo vídeo dividido paira economia de tempo)

    Google I / O 2017 – Como acelerair o Gradle builds (FULL VIDEO)

    Google I / O 2017 – Como acelerair a compilation do Gradle (NOVO GRADLE PLUGIN 3.0.0 PART ONLY)

    Google I / O 2017 – Como acelerair a compilation do Gradle (reference a 1 * )

    Documentação do Android

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.