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.

  • É crucial que o performance tenha ViewHolder como static em um padrão ViewHolder?
  • Erro Eclipse: R não pode ser resolvido paira uma vairiável
  • Navegação na bairra de ferramentas Ícone do Hamburger faltando
  • Htmlunit no aplicativo do Android
  • WebView de canvas paircial com <video> cortado ao meio
  • Android: gaveta de navigation SubMenu: como itens de navigation dobráveis
  • setBackgroundResource () descairta meus attributes de layout XML
  • Android WebView não está cairregando a segunda página do cache
  • Como cairregair corretamente texturas usando o administrador de ativos libgdx
  • resources.ap_ não existe quando compilair meu projeto Android
  • Como injetair dependencies em qualquer tipo de object com o Dagger2?
  • Gaveta de navigation: Como definir o item selecionado na boot?
  • 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.