きょこみのーと

技術に関係ないほうのブログ

AnnictのAndroidアプリをKotlinでつくった

Kotlinの入門がてら作ったのですが、リリースに至るまでの流れとか利用してるライブラリとかの話しをしようかなと思います。

play.google.com

ざっくり以下の話しをしようと思います。

  • 作ったものについて
  • 開発期間について
  • Kotlinについて
  • 利用したライブラリなどについて
  • CIについて
  • タスク管理について

作ったものについて

f:id:kyokomi:20180110223121p:plain

画面はこんな感じで普通にRecylerViewでのリスト表示です。 今回は、Android Architecture ComponentsPagingLibraryを使ってかなり楽できました。(またあとで説明します)

このアプリの自分の用途について

毎クール30作品とか全部見てると時間がいくらあっても足りないので、 視聴中アニメでモチベーションが低くなってる作品のステータスを(見てる -> 一時中断 -> 視聴中止)にちゃんと更新したかった。 というモチベーションで作りました。

どのアニメ観ようかな〜とかの用途ではなく、観てる前提で自分は何を観るきなくしているのか?や自分が次に観るべきアニメはどれなんだというのを把握して確実に消化していく用途です。

ちなみに視聴時の自分ルールはこんな感じ

  • 今期で3話以上未視聴が溜まったら一時中断にする
  • 一時中断にしたものはクールの終わったときに振り返って見るかどうか?を他の人のレビューなどを参考に決める
  • ここで見ないを選択した場合は、視聴中止にする

アプリ利用の前提条件

  • Annictを結構使ってるユーザー
  • 大体今期やってるアニメを把握してる
  • Annictのチャンネル登録をちゃんと設定している
  • まとめて視聴したりせず、毎日今期アニメを消化しつづけているアニメ好き

「今期はこれだ!」みたいな1点読みとかしないで、ほぼ毎クール7割近くの作品の数話を観て徐々に観る作品を削っていく感じの人だと尚良い

開発期間について

最初に12/2くらいに開発をスタートして、最低限の機能を1日〜2日くらいで作ってちょこっとバグ直したりしてたのが12月前半。
年末までちょこちょこ触って、1/4〜1/8で一気に仕上げました。

12中旬くらいの時点でそこそこ動いてたので、わりと毎日個人的に使ってドッグフーディングできてたのは結構モチベーションにつながってよかった。 後は「やるぞ!」って気持ちと一気にやる時間があるのがやっぱり大事ですね。

f:id:kyokomi:20180110223819p:plain

f:id:kyokomi:20180110223058p:plain

f:id:kyokomi:20180110223050p:plain

Kotlinについて

Kotlinについてですが、とにかく書きやすくてコード書いてて気持ちよかったなぁ〜という感じでした。事前に以下の書籍を読んでいたので、ひとまずほとんど困らず開発できました。 ただ、もっとうまく書けたのかな〜とか思いながら書いたコードが結構あるので、今後もリファクタリングしていければと思います。

Kotlinイン・アクション

Kotlinイン・アクション

Kotlinスタートブック -新しいAndroidプログラミング

Kotlinスタートブック -新しいAndroidプログラミング

利用したライブラリなどについて

PagingLibraryについて

今回特に役立ったこちらについてもうちょっと説明。 とは言え、以下の図を見るのが一番早いw

https://developer.android.com/images/topic/libraries/architecture/paging-threading.gif 画像引用元: https://developer.android.com/topic/libraries/architecture/paging.html

今回で言うとRoom経由でSQLiteのデータがそのままRecyclerViewのリストに対応している感じになってます。 例えば、新しいデータをInsertすると参照しているRecyclerViewはハンドリングするコード等書かずにPagingLibrary内で notifyItemInserted(position) を呼び出してくれます。Deleteした場合は同様に notifyItemRemoved(position) ですね。

つまり、SQLite側のデータをどう更新するかを意識するだけでViewにはいい感じに反映してくれるという感じで最高でした。 もちろんLiveDataなので、画面回転時などにActivityが再生成されてもちゃんとobserveするコードが再度呼び出されてクラッシュするようなことも無くかなり楽でした。

ただ、かなりレールに乗ってる感はあるのでちょっとレールを外れるようなことをしようとすると、SQLiteに変なデータを突っ込んで無理やりViewHolderの処理でハンドリングして〜みたいな感じしかできなさそうな点などある程度諦めが必要かもしれません。

が、めっちゃ開発は楽になったので今後も使っていきたいと思います!

CIについて

www.bitrise.io

今回、Bitriseを初めて使いました。とにかく最高でした。 過去にWerckerやCircleCIでAndroidのbuildをしていたときに比べてやることが全然無くて、殆どがWebコンソール上で完結してとにかく最高でした。 keytoolの管理等もいつも悩まされていたのを管理してくれたりGooglePlayStoreへUploadするstepも用意されていたりなど助かりました。

CircleCIやwerckerだとたまに謎のメモリ不足?とかのbuild失敗があったのですが、それも発生しなくなった気がします。

タスク管理について

Zenhubを使ってやりました。ポイントの見積もりは結構雑だったんですが、 サクッと終わらせられる粒度にタスクを分割してたのでまあまあいい感じだった気がします。

f:id:kyokomi:20180110231734p:plain

タスクの一部を抜粋したものがこちらです。最初にばーっと10タスクつくら作って優先度決めて開発を進めていくうちにドンドンタスクを追加して、その都度優先度を変えてみたいな感じでガンガンやってました。

f:id:kyokomi:20180110231925p:plain

今後

ひとまず細かいバグ修正を優先していこうと思います。 現状AnnictのWeb側で設定する前提になっているチャンネル設定とか視聴状況の変更とかもアプリ内で出来るように〜とかも気が向いたらやるかもしれません。

バグ報告とかお気軽にお待ちしておりますので〜何卒お手柔らかに〜