Cuál es la diferencia entre la implementación y la compilation en gradle

Después de actualizar a Android Studio 3.0 y crear un nuevo proyecto, noté que en build.gradle hay una nueva forma de agregar nuevas dependencies en lugar de compile hay implementation y en lugar de testCompile hay testImplementation .

ejemplo:

  implementation 'com.android.support:appcompat-v7:25.0.0' testImplementation 'junit:junit:4.12' 

en lugar de

  compile 'com.android.support:appcompat-v7:25.0.0' testCompile 'junit:junit:4.12' 

¿Cuál es la diferencia entre ellos y qué debería estar usando?

Es uno de los cambios más importantes que viene con gradle: 3.0 que Google anunció en IO17 gradle: 3.0

la configuration de compile ahora está en desuso y debe ser reemplazada por la implementation o api

De los documentos gradle :

 dependencies { api 'commons-httpclient:commons-httpclient:3.1' implementation 'org.apache.commons:commons-lang3:3.5' } 

Las dependencies que aparecen en las configuraciones de api se verán transitoriamente expuestas a los consumidores de la biblioteca y, como tales, aparecerán en la ruta de compilation de classs de los consumidores.

Las dependencies que se encuentran en la configuration de implementation , por otro lado, no estarán expuestas a los consumidores y, por lo tanto, no se filtrarán en el classpath de compilation de los consumidores. Esto viene con varios beneficios:

  • las dependencies ya no se filtran en la ruta de compilation de class de los consumidores, por lo que nunca dependerá accidentalmente de una dependencia transitiva
  • compilation más rápida gracias al tamaño networkingucido de classpath
  • less recomstackciones cuando cambian las dependencies de implementación: los consumidores no necesitarían ser recomstackdos
  • Publicación más limpia: cuando se utiliza junto con el nuevo complemento maven-publish, las bibliotecas Java producen files POM que distinguen exactamente entre lo que se requiere comstackr contra la biblioteca y lo que se requiere para usar la biblioteca en time de ejecución (en otras palabras, no mezcle lo que se necesita para comstackr la biblioteca y lo que se necesita para comstackr contra la biblioteca).

La configuration de compilation aún existe, pero no debe utilizarse, ya que no ofrecerá las garantías que ofrecen la API y las configuraciones de implementación.


tl; dr:
simplemente reemplace la compile con la implementation , debugCompile con debugImplementation , testCompile con testImplementation y androidtestcompile con androidTestImplementation

Compile configuration de Compile quedó en desuso y debe ser reemplazada por la implementation o api .

Puede leer los documentos en https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation .

La parte breve es-

La diferencia key entre el plugin estándar de Java y el plugin de la biblioteca Java es que este último introduce el concepto de una API expuesta a los consumidores. Una biblioteca es un componente de Java destinado a ser consumido por otros componentes. Es un caso de uso muy común en las comstackciones de proyectos múltiples, pero también tan pronto como tenga dependencies externas.

El complemento expone dos configuraciones que se pueden usar para declarar dependencies: api e implementación. La configuration de la API se debe usar para declarar las dependencies que exporta la API de la biblioteca, mientras que la configuration de la implementación se debe usar para declarar las dependencies que son internas al componente.

Para una explicación más detallada, consulte esta image. Breve explicacion