63

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

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

8 回答 8

53

AndroidAnnotations
使用编译时注解处理。它生成一个带有下划线附加到原始名称(MyActivity_生成自MyActivity)的子类。所以要让它工作,你总是必须使用生成的类而不是你的原始类来引用。

它具有非常丰富的功能集,请参阅可用注释列表

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 等价于@ViewByIdand @ViewsById)和一些事件绑定(完整列表请参见此处的命名空间目录,仅计算OnXXX事件注释)。

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

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

我发现从匕首开始更难,但这可能只是我的经验。但是,请在此处查看一些视频以获得更好的开始1、2

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

总结
如果您比较易用性、测试支持和性能,我发现使用 AndroidAnnotation 和 ButterKnife+Dagger 之间没有太大区别。差异在于编程模型(使用类_而不是使用原始类并手动调用注入)和功能集。

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

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

于 2014-09-30T17:16:13.870 回答
19

这是Dzone 博客中的一篇不错的文章。

我们需要比较每个的特征,例如:

  • 所需的最小罐子
  • ActionBarSherlock 兼容性
  • 点击监听器的注入
  • POJO注入
  • 表现

在此处输入图像描述

黄油刀中仅缺少Pojo Injection!所以看起来Butterknife是赢家!

资源

于 2014-10-01T11:44:55.060 回答
7

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

但是通过阅读他们的请求,他们似乎更多地指的是Guice基于反射的 DI 库。诸如 android annotation 之类的库不使用反射,而是使用编译时生成的代码,而butterknifeanddagger使用为 android 优化的少量反射,但据说比android annotation. 这实际上取决于项目以及您愿意承担多少性能损失。在我看来,仅使用butterknife本身就足以加速代码开发。如果您需要更多的使用android annotation,最后如果您愿意因反射而受到轻微的性能影响,那么最好的选择是Guice使用基于强大的反射而不绝对破坏性能dagger+ butterknife

于 2014-09-26T22:57:52.490 回答
5

你应该试试牙签

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

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

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

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

于 2016-12-09T06:17:10.313 回答
3

使用 Android Annotations 或 Butterknife 来简化您的编码。但不要选择 Roboguice!Roboguice 强制您的活动、片段扩展到 roboguice 类。一点也不好玩!

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

于 2015-07-04T18:45:59.453 回答
1

似乎谷歌选择了匕首,因为他们正在与创建它的 Square 共同开发它。

关于 Butterknife 和 Dagger 本身,有一个 SO question difference-between-dagger-and-butterknife-android这阐明了它们如何相互补充。

于 2015-07-03T10:53:45.823 回答
1

@ChrLipp 提到的reddit-thread有人在同一个项目中使用了这三个,他高度评价 dagger+butterknife,但也给了 AndroidAnnotations 其位置:

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

Dagger 的设置和配置可能会很痛苦,但一旦你完成了它就非常值得。但是话又说回来,因为这些都彼此完全不同,这完全取决于您对项目的需求。

此外,说到每一个都非常不同,在你的项目中,如果你真的想的话,你可以在同一个项目中使用 ButterKnife、Android Annotations 和 Dagger。他们每个人都有相同的想法,但做的事情不同,因此您可以全部使用它们。

于 2015-07-03T10:56:50.110 回答
1

最终,如果您使用三者之一,您将很难过渡到 Android 的数据绑定。如果您需要考虑性能,那是最快的:

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

于 2016-04-28T15:24:24.843 回答