匕首和黄油刀与Android注释

时间:2014-06-22 13:39:01

标签: android dependency-injection dagger android-annotations butterknife

我正在评估Android应用的依赖注入(DI)框架。最有力的竞争者是:Dagger(有Butter Knife)和Android Annotations。据我所知,Dagger和ButterKnife来自同一个源头,他们相互补充。这里是我正在寻找的关键矩阵:

  1. 易于使用(我们的构建基于Gradle,我们使用Android Studio IDE)
  2. 测试支持(我们使用Robotium进行功能测试,使用RoboLectric进行单元测试)
  3. 性能(DI框架使用反射,哪一个更快?)

9 个答案:

答案 0 :(得分:53)

<强> AndroidAnnotations
使用编译时注释处理。它会生成一个子类,其下划线附加到原始名称(MyActivity_生成的MyActivity)。因此,为了让它工作,你总是必须使用生成的类来代替原始类。

它有一个非常丰富的功能集,请参阅list of available annotations

<强> Butterknife
还使用编译时注释处理,但它生成由中心类(ButterKnife)使用的查找器类。这意味着您可以使用原始类进行引用,但必须手动调用注入。 ButterKnife介绍的副本:

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

功能集不是很丰富,但ButterKnife支持视图注入(AndroidAnnotations等效于@ViewById@ViewsById)和一些事件绑定(有关完整列表,请参阅命名空间目录here ,只计算OnXXX事件注释。

<强> Dagger
是一个Android的DI实现,类似于Guice。它还使用编译时注释处理并生成用于手动注入的对象图。您可以区分应用程序对象图和范围对象图以便注入例如在活动中。在这里,您可以看到Application.onCreate示例:

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

我发现用匕首开始更难,但这可能只是我的经验。不过请在此处查看一些视频以获得更好的开端:12

从功能设置的角度来看,我会说Dagger实现的功能可以与AndroidAnnotation的@EBean@Bean功能进行比较。

<强>摘要
如果您要比较易用性,测试支持和性能,我发现使用AndroidAnnotation和ButterKnife + Dagger之间没有多大区别。编程模型中存在差异(使用具有_的类而不是使用原始类并手动调用注入)和功能集中的差异。

AndroidAnnotation为您提供了完整的功能列表,但将您与某些库联系在一起。例如,如果你使用它的rest api,你必须使用Spring Android。无论是否使用OrmLite,您还可以获得OrmLite(@OrmLiteDao)等功能的注释。

最后,这是一个品味问题,至少在我看来。

答案 1 :(得分:19)

以下是Dzone blog中的好文章。

我们需要比较每个的功能,例如:

  
      
  • 所需的最低罐子
  •   
  • ActionBarSherlock兼容性
  •   
  • 点击侦听器的注入
  •   
  • POJO注射
  •   
  • 性能
  •   

enter image description here

只有Pojo注射液在奶油刀中丢失!看起来像Butterknife是赢家!

Source

答案 2 :(得分:6)

谷歌确实特别要求不要使用依赖注入。

但是通过阅读他们的请求,他们似乎更多地指的是Guice和基于反射的DI库。诸如android注释之类的库不使用反射而是使用编译时生成的代码,而butterknifedagger使用针对android优化的少量反射,但据称比android annotation稍微强大一些。这实际上取决于项目以及您愿意采取多少性能影响。在我看来,只使用butterknife就足以加速代码开发本身。如果您需要稍微多用android annotation,最后如果您愿意因为反射而略微受到性能影响,那么最佳选择就是使用强大的基于Guice的反射使用dagger +而不会完全破坏性能butterknife

答案 3 :(得分:5)

你应该试试Toothpick

牙签是(根据自述文件):

  • 纯java
  • 快,它不使用反射而是使用注释处理
  • 简单,灵活,可扩展&amp;强大,强大和测试
  • 线程安全
  • 记录&amp;开源
  • 范围安全:它强制执行无泄漏的应用程序
  • 面向测试:它使测试更容易
  • 它适用于Android或任何其他基于上下文的框架(例如Web容器)

在大多数情况下,它甚至比Dagger 2更快,而且更简单。

注意:是的,我是作者之一。

答案 4 :(得分:3)

使用Android Annotations或Butterknife来简化您的编码。但不要去Roboguice! Roboguice强迫你的活动,碎片扩展到roboguice类。根本不好玩!

Dagger 2是一个更好的选择。如果您愿意,可以将它与Android Annotations一起使用。我只是将Android Annotations用于一个简单的应用程序,但是现在使用Dagger可以更好地工作。

答案 5 :(得分:1)

似乎Google选择了创建它的匕首they are developing it jointly with Square

关于Butterknife和Dagger本身,有一个问题difference-between-dagger-and-butterknife-android澄清了它们如何相互补充。

答案 6 :(得分:1)

@ChrLipp提到的reddit-thread有一个人在同一个项目中使用了所有三个,高度赞扬dagger + butterknife,但也给了AndroidAnnotations:

  

对于依赖注入,butterknife用于Views,Dagger是   用于所有对象,强烈推荐和Android注释   创建更多用于开发Android的框架而不是   将对象注入到类中,因此每个库都是完整的   彼此不同。 Dagger相当于Guice,但是很多   快多了。 Dagger比ButterKnife和Android更强大   注释,因为它注入所有对象而不是ButterKnife和   Android注释只注入一组特定的对象。

     

Dagger可能很难设置和配置,但值得一试   你完成了。但话说回来,因为这些都是相当的   彼此不同,这完全取决于您的需求   该项目。

     

另外,在你的项目中,每个人都有很大的不同   可以使用ButterKnife,Android Annotations和Dagger   项目,如果你真的想。他们每个人都有相同的想法,但做到了   不同的东西,所以你可以使用它们。

答案 7 :(得分:1)

最终如果您使用其中一个,您将很难转换到Android的数据绑定。如果您需要考虑性能,那就是最快的:

https://developer.android.com/tools/data-binding/guide.html

答案 8 :(得分:0)

我认为(在性能方面)ButterKnife和AndroidAnnotation之间的差距更大。 ButterKnife使用编译时Annotation(RetentionPolicy.CLASS),但它在运行时注入代码,从而产生更多的时间。相反,AndroidAnnotations在编译时处理所有注释。