FURYU Tech Blog - フリュー株式会社

フリュー株式会社の開発者が技術情報を発信するブログです。

AndroidAnnotationsからの移行を進めています -Dagger2の導入-

コンテンツ・メディア第1事業部の荒木です。ピクトリンクというプリントシール画像を使ったアプリのAndroid版を開発しています。最近、AndroidAnnotationsのDependency Injection部分をDagger2に移行したので、そのレポートを書きたいと思います。技術的な話よりも、なぜ移行に踏み切り、どのように進めていったかという過程について詳しく書いていきます。

移行する理由

AndroidAnnotationsとは、コード量を削減して開発効率を上げることを目的としたライブラリです。アノテーションをつけることで、さまざまなコードを自動生成してくれます。ピクトリンクのAndroidアプリでは、View Binding、クリックリスナーの設定、savedInstanceStateの管理、画面間の値渡し、Dependency Injection (以下、DI) にAndroidAnnotationsを利用していました。実際、コード量の削減に大きく貢献しているように思います。

 

では、なぜAndroidAnnotationsから移行するのか。一番の理由は、AndroidAnnotationsの影響範囲がアプリケーション全体に及んでいたからです。一つのライブラリの影響範囲が広いと、もし何らかの理由(人気が低下して更新がなくなる、他のライブラリとの相性が悪いなど)でそのライブラリ使えなくなった場合、アプリケーション全体に影響してしまうので大きな技術的負債となってしまいます。そこで、AndroidAnnotationsの各機能を少しずつ他のライブラリに移して影響範囲を減らしたいと考えました。もともとDI機能の一部にDagger2を導入していたので、今回はAndroidAnnotationsのDI部分を全てDagger2に移行することにしました。

 

また、

  • ビルド時間の増大
  • Hoge_のような Hogeを継承したクラスが自動生成される → 自動生成されたクラスを意識する必要がある

といった点も移行の理由として挙げられます。

移行の流れ

AndroidAnnotationsの@Bean@RootContextによってクラスやContextをインジェクトしている部分をDagger2を利用したコードに置き換えていきたいと思います。

前提

私の所属するチームでは、GitおよびGithubでコードを管理しています。書いたコードは、必ずPull Request(以下、PR)によるレビューを通してからプロジェクトにマージするというルールで開発をしています。今回は、PRを作成するときや、継続的にコミットするために意識したことを書きたいと思います。

方針を示すPRを作成する

完全に移行が完了した状態でPRを投げた場合、

  • 差分が大きくてレビューが大変になる
  • 指摘があった場合、修正箇所が大きくなる

といった問題が出てくると考えたので、まずは一部の画面にだけDagger2を導入したPRを投げることにしました。実際に投げたPRのメッセージは以下です。

今後のコードの書き方に大きく影響するので、他のメンバーに受け入れてもらえるように目的や動作について詳しく書きました。

継続的にコミットを進める

PRが無事マージされたので、次は移行作業に入りました。対象クラスが多くて一気に移行するのは難しい状況だったので、毎日少しずつ移行していくことにしました。一度パターンができてしまえば、移行作業は単純作業の繰り返しでつまらないものです。そのため、日々の業務の中でコツコツ進めるのはモチベーションの維持が大変でした。

そこで、1クラスだけ移行した状態でPRをあげて、PRのメッセージに移行すべきクラスのリストを作り、完了したものにチェックをしていくようにしました。こうすることで、いくつ終わったか、いつ終わりそうかが目に見えるようになったので、モチベーションを維持しながら毎日コツコツと移行を進めることができました。

さいごに

この記事では、Androidアプリ開発をする中でAndroidAnnotationsから移行する判断に踏み切ったこと、そして段階的に移行作業を進めたことについてレポートしました。一度に全てを移行することを考えると終わりがないように見えますが、段階的に取り組むことで確実に前に進むことができると思います。千里の道も一歩からという言葉があるようにリファクタリングも一歩ずつ確実に取り組んでいく必要があると感じました。今後は、View Bindingの部分や画面間の値渡しに対して、リファクタリングを進めていきたいです。