android dependency-injection dagger android-annotations butterknife

Dagger and Butter Knife vs. Android Anotaciones



dependency-injection android-annotations (9)

Aquí está el artículo de Niza en el blog Dzone .

Necesitamos comparar las características de cada uno, como por ejemplo:

  • Se requieren frascos mínimos
  • Compatibilidad con ActionBarSherlock
  • Inyección para oyentes clic
  • Inyección POJO
  • Actuación

¡Solo falta la Inyección de Pojo en el cuchillo de mantequilla! ¡Así que parece que Butterknife es el ganador!

Source

Estoy evaluando marcos de Inyección de Dependencia (DI) para una aplicación de Android. Los principales contendientes son: Daga (con cuchillo de mantequilla) y Anotaciones de Android. Entiendo que Dagger y ButterKnife son del mismo origen-cuadrado y se complementan entre sí. Aquí están las matrices clave que estoy buscando:

  1. Facilidad de uso (nuestra compilación se basa en Gradle y utilizamos Android Studio IDE)
  2. Compatibilidad con pruebas (usamos Robotium para pruebas funcionales y RoboLectric para pruebas unitarias)
  3. Rendimiento (los marcos DI usan la reflexión, ¿cuál es más rápido?)

Creo que el mejor entre (en términos de rendimiento) ButterKnife y AndroidAnnotation es el segundo. ButterKnife utiliza anotación en tiempo de compilación (RetentionPolicy.CLASS), pero inyecta código en tiempo de ejecución, lo que resulta en un mayor esfuerzo de tiempo. En cambio, AndroidAnnotations procesa todas las anotaciones en tiempo de compilación.


Deberías intentarlo en Toothpick .

Toothpick es (según el README):

  • java puro
  • rápido, no utiliza el proceso de reflexión sino el de anotación
  • simple, flexible, extensible y potente, robusto y probado
  • a salvo de amenazas
  • documentado y de código abierto
  • alcance seguro: aplica aplicaciones sin fugas
  • orientado a la prueba: facilita las pruebas
  • funciona muy bien con Android o cualquier otro marco basado en contexto (como contenedores web)

Incluso puede ser más rápido que Dagger 2 en la mayoría de los casos, y es mucho más simple.

Nota: Sí, soy uno de los autores.


El reddit.com/r/androiddev/comments/28vlrt/… mencionado por @ChrLipp tiene a alguien que utilizó los tres en el mismo proyecto , habla muy bien de dagger + butterknife pero también le da a AndroidAnotaciones su lugar:

Para la inyección de dependencia, butterknife se usa para Views, Dagger se usa para todos los objetos y es muy recomendable. Android Annotations crea más un marco para desarrollar Android en lugar de inyectar objetos en tus clases, por lo que cada biblioteca es bastante diferente. Dagger es equivalente a Guice pero es mucho más rápido. Dagger es más poderoso que ButterKnife y las anotaciones de Android, ya que inyecta todos los objetos en lugar de anotaciones de ButterKnife y Android que solo inyectan un cierto conjunto de objetos.

Dagger puede ser difícil de configurar y configurar, pero vale la pena una vez que lo hayas hecho. Pero, una vez más, dado que estos son muy diferentes entre sí, todo depende de cuáles sean sus necesidades para el proyecto.

Además, hablando de que cada uno es bastante diferente, en su proyecto puede usar ButterKnife, Android Annotations y Dagger, todo en el mismo proyecto si realmente lo desea. Todos tienen la misma idea pero hacen algo diferente para que pueda usarlos todos.



Google solicita específicamente no usar la inyección de dependencia.

Pero al leer su solicitud, parecen referirse más a la biblioteca DI de Guice y basada en la reflexión. Las bibliotecas, como la anotación android, no usan ninguna reflexión sino que emplean código generado en tiempo de compilación, mientras que butterknife y dagger usan una pequeña cantidad de reflejo optimizado para Android, pero supuestamente son ligeramente más poderosas que la android annotation . Realmente depende del proyecto y de la cantidad de rendimiento que está dispuesto a asumir. En mi opinión, solo usar butterknife es suficiente para acelerar el desarrollo del código por sí mismo. Si necesita un poco más de uso de la android annotation y, por último, si está dispuesto a obtener un pequeño golpe de rendimiento debido a la reflexión, la mejor opción sin destruir por butterknife rendimiento con una reflexión basada en Guice butterknife use dagger + butterknife .



Use las anotaciones de Android o Butterknife para facilitar su codificación. ¡Pero no vayas por Roboguice! Roboguice fuerza tus actividades, fragmentos para extender a las clases de roboguice. No es divertido, en absoluto!


AndroidAnnotations
utiliza el proceso de anotación de tiempo de compilación. Genera una subclase con un guión bajo que se agrega al nombre original ( MyActivity_ generated from MyActivity ). Para que funcione, siempre debe usar la clase generada para las referencias en lugar de su clase original.

Tiene un conjunto de características muy completo, consulte la lista de anotaciones disponibles .

Butterknife
también utiliza el proceso de anotación de tiempo de compilación, pero genera clases de buscador que son utilizadas por una clase central ( ButterKnife ). Esto significa que puede usar su clase original para hacer referencia, pero debe llamar a la inyección manualmente. Una copia de la introducción de ButterKnife:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_activity); ButterKnife.inject(this); // TODO Use "injected" views... }

El conjunto de características no es tan rico, ButterKnife admite la inyección de vistas (las Android @ViewById son @ViewById y @ViewsById ) y algunas vinculaciones de eventos (para obtener una lista completa, consulte el directorio del espacio de nombres here , solo cuente las anotaciones del evento OnXXX ).

Dagger
es una implementación DI para Android, similar a Guice. También utiliza el proceso de anotación en tiempo de compilación y genera gráficos de objetos que se utilizan para la inyección manual. Se distingue entre gráfico de objeto de aplicación y gráfico de objeto con ámbito para inyectar, por ejemplo, en actividades. Aquí puede ver un ejemplo de Application.onCreate :

@Override public void onCreate() { super.onCreate(); objectGraph = ObjectGraph.create(getModules().toArray()); objectGraph.inject(this); // use injected classes }

Descubrí que es más difícil comenzar con la daga, pero esta podría ser solo mi experiencia. Sin embargo, vea algunos videos aquí para un mejor comienzo: 1 , 2

Desde el punto de vista del conjunto de características, diría que Dagger implementa funcionalidades que se podrían comparar con la funcionalidad @EBean y @Bean AndroidAnnotation.

Resumen
Si comparas la facilidad de uso, el soporte y el rendimiento de las pruebas, no encuentro mucha diferencia entre usar AndroidAnnotation y ButterKnife + Dagger. Las diferencias están en el modelo de programación (use clases con _ lugar de usar las originales y llame a la inyección de forma manual) y en el conjunto de características.

AndroidAnnotation le brinda una lista completa de funcionalidades, pero lo vincula a ciertas bibliotecas. Por ejemplo, si usa su api de descanso, debe usar Spring Android. También tiene anotaciones para funciones como OrmLite ( @OrmLiteDao ) independientemente de si usa OrmLite o no.

Al final es una cuestión de gusto, al menos en mi opinión.