web-dev-qa-db-ja.com

ダガーアンドバターナイフvs. Androidアノテーション

AndroidアプリのDependency Injection(DI)フレームワークを評価しています。上位の候補は、ダガー(バターナイフ付き)およびAndroidアノテーションです。 DaggerとButterKnifeは同じソーススクエアからのものであり、互いに補完し合うことを理解しています。私が探している主要なマトリックスは次のとおりです。

  1. 使いやすさ(ビルドはGradleに基づいており、Android St​​udio IDEを使用しています)
  2. テストサポート(機能テストにはRobotiumを、ユニットテストにはRoboLectricを使用します)
  3. パフォーマンス(DIフレームワークはリフレクションを使用しますが、どちらが速いですか?)
63
user3277846

AndroidAnnotations
コンパイル時の注釈処理を使用します。元の名前にアンダースコアを付けたサブクラスを生成します(MyActivity_MyActivityから生成されます。そのため、元のクラスではなく、生成されたクラスを参照用に常に使用する必要があります。

非常に豊富な機能セットがあります。 使用可能な注釈のリスト を参照してください。

バターナイフ
コンパイル時の注釈処理も使用しますが、中央クラス(ButterKnife)が使用するFinderクラスを生成します。つまり、参照には元のクラスを使用できますが、手動でインジェクションを呼び出す必要があります。 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)およびいくつかのイベントバインディング(完全なリストについては、ネームスペースディレクトリ here を参照してください。OnXXXイベントアノテーションをカウントしてください)。

短剣
は、Guiceに似たAndroidのDI実装です。また、コンパイル時の注釈処理を使用し、手動注入に使用するオブジェクトグラフを生成します。たとえば、アプリケーションオブジェクトグラフとスコープオブジェクトグラフを区別して注入します。活動中。ここには、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は機能の完全なリストを提供しますが、特定のライブラリに結び付けます。たとえば、残りのAPIを使用する場合は、Spring Androidを使用する必要があります。また、OrmLite(@OrmLiteDao)OrmLiteを使用するかどうかに関係なく。

最後に、少なくとも私の意見では、それは好みの問題です。

53
ChrLipp

Dzone blog の素敵な記事をご覧ください。

次のようなそれぞれの機能を比較する必要があります。

  • 最小ジャー
  • ActionBarSherlockの互換性
  • クリックリスナーのインジェクション
  • POJOインジェクション
  • 性能

enter image description here

バターナイフに欠けているのはポージョ注射だけです!バターナイフが勝者のようです!

ソース

19
LOG_TAG

Googleは、依存性注入を使用しないように特に求めています。

しかし、彼らのリクエストを読むことで、彼らはGuiceとリフレクションベースのDIライブラリをもっと参照しているように見えます。 Android注釈などのライブラリは、コンパイル時に生成されたコードを使用する代わりにリフレクションを使用しませんが、butterknifeおよびdaggerはAndroidしかし、おそらくAndroid annotation。それは、プロジェクトと、どれだけのパフォーマンスヒットを許容するかにかかっています。私の意見では、butterknifeを使用するだけで、コード開発自体を高速化するのに十分です。さらに少し必要な場合は、Android annotationそして最後に、リフレクションによるわずかなパフォーマンスヒットを望んでいる場合は、強力なGuiceベースのリフレクションでパフォーマンスを完全に破壊することなく最適なオプションを使用しますdagger + butterknifeを使用します。

6
ChadJPetersen

Toothpick で試してみてください。

つまようじは(READMEによる):

  • 純粋なJava
  • 高速、リフレクションは使用せず、注釈処理
  • シンプル、柔軟、拡張可能、強力、堅牢、テスト済み
  • スレッドセーフ
  • 文書化されたオープンソース
  • スコープセーフ:リークのないアプリを強制します
  • テスト指向:テストを簡単にします
  • Androidまたは他のコンテキストベースのフレームワーク(Webコンテナーなど)で非常にうまく機能します

ほとんどの場合、Dagger 2よりも高速であり、はるかに簡単です。

注:はい、私は著者の1人です。

5
Snicolas

Android AnnotationsまたはButterknifeを使用して、コーディングを容易にします。しかし、Roboguiceには向かないでください!Roboguiceは、アクティビティ、フラグメントをroboguiceクラスに拡張します。

ダガー2は、はるかに優れたオプションです。必要に応じてAndroid Annotationsと一緒に使用できます。シンプルなアプリにはAndroid Annotationsを使用しますが、最近はうまく機能していますダガーでもっと。

3
Juan Mendez

@ -ChrLippが言及した reddit-thread には、同じプロジェクトで3つすべてを使用した誰かがいます。 AndroidAnnotationsにも場所を与えます:

依存性注入では、ビューにバターナイフが使用され、すべてのオブジェクトにダガーが使用され、強く推奨されます。Androidアノテーションは、代わりにAndroid DaggerはGuiceと同等ですが、はるかに高速です。DaggerはButterKnifeよりも強力で、すべてのオブジェクトを注入する際のAndroidアノテーションButterKnifeとAndroidではなく、特定のオブジェクトセットのみを挿入するアノテーション。

Daggerはセットアップと構成に苦労する可能性がありますが、一度実行すると価値があります。しかし、これらはすべて互いに非常に異なるため、プロジェクトのニーズに依存します。

また、それぞれがまったく異なると言えば、プロジェクトでButterKnife、Android AnnotationsとDaggerをすべて同じプロジェクトで使用することができます。それらをすべて使用できるように、何か異なるものがあります。

1
serv-inc

彼らはSquareと共同で開発している のように、Googleは短剣を選択しているようです。

ButterknifeとDagger自体については、SO質問 difference-between-dagger-and-butterknife-Android があり、これらが互いに補完する方法を明確にします。

1
serv-inc

最終的に3つのうちの1つを使用すると、Androidのデータバインディングに移行するのが難しくなります。パフォーマンスを考慮する必要がある場合、これが最速です。

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

1
Pier Betos

(パフォーマンスの点で)ButterKnifeとAndroidAnnotationのほうが良いと思います。 ButterKnifeはコンパイル時の注釈(RetentionPolicy.CLASS)を使用しますが、実行時にコードを挿入するため、時間の労力が大きくなります。代わりに、AndroidAnnotationsはコンパイル時にすべての注釈を処理します。

0
ech0s7r