SerenadeというAndroidのTwitterクライアントを開発した

念願だったネイティブアプリ、やっと出せました。

Webかネイティブかに囚われることなくサービス開発を行いたいと思っていて、その一歩が踏み出せました。

せっかく作るんだから自分が使うものにしたいよね、てことで題材にはTwitterクライアントを選びました。公式にも非公式にも改善したい部分があったのでちょうど良かったです。

作り始めるにあたって考えたことを3行にまとめると、

  • Pull to Refreshあまり好きじゃないから、FABワンタップでリフレッシュしたい
  • もういっそのことタイムラインといいねだけで事足りるのでは
  • Twitterカードは表示したい、画面が賑やかになるし

となります。

home timeline and favorite list
タイムラインといいね

詳細については先日書いた一般向け告知をご参照いただければ。

tynmarket.hatenablog.com

開発期間

プロダクトのコードを書いていたのは主に12月末〜5月初旬です。総所要時間はバックエンドのAPIサーバも含めて450時間くらいと思います。

まず、昨年@karino2012さんがAndroidを支える技術という本を出されて、今がAndroidに取り組むべきタイミングなんだと思って開発に向けて動き出しました。

春から夏にかけて〈I〉と〈II〉を買って通勤中に読み、その後はWINGSさんのはじめてのAndroidアプリ開発とあんざいゆきさんのAndroid Pattern Cookbookの必要な部分を写経してAndroid開発の基本を覚えました。

言語

言語はJavaです。モダンなAndroid開発はほぼKotlinということは分かっていたのですが、今回は最短でリリースまで走りきることを優先して仕事で書いたことのあるJavaを選びました。

実際開発してみるとJavaでもそんなにストレスなく開発できて、多分Java 8でラムダ式が導入されたのとAndroid Studioが優秀だったからですね。

技術選定

アーキテクチャはMVPでもMVVMでもないです。

Android Architecture Components的にはMVVMがスタンダードになっていくのかなと思いつつ、リリース後に落ち着いたタイミングでMVVMでリファクタリングしようかなと。

ライブラリの選定などは@kobakeiさんのAndroid開発における定番ライブラリ22選にお世話になりました。

APIサーバ

Twitterカードに表示するタイトルや画像のURLを取得するクローラ兼キャッシュサーバをGoで書いてGCPに載せました。

Goをちゃんと使ったのは初めてなのですが、Goいいですね。何度か書き直していくとchannelを上手く使えば無闇にロック取る必要がないことに気がついて、なるほどこれが言語デザインなのかと感心します。

あとGCPも使いやすかったです。GitHubのレポジトリにDockerfileを置いておくと、pushしてContainer Registryでビルド ⇒ GCEにポチポチデプロイ ⇒ StackDriver LoggingからログをBigQueryに流し込む ⇒ Data Studioで可視化みたいなのがサクッとできます。

余計なサーバ建てなくてもいけるとか最高かよってなります。個人開発者にとっては福音です。

最後に

リリース直前にProGuardの設定で詰まった時にDroidKaigiのconference-app-2018を眺めてたら落ちる原因が分かって、ほぼオンスケで無事リリースできました。

作ってくれた人ありがとう!

Serenadeを作るまで使っていたTwidereに習って先のAPIサーバと合わせてソースコードGitHubに公開しました。

GitHub - tynmarket/Serenade: One tap refresh twitter client for android

GitHub - tynmarket/ogpserve: Open Graph Protocol / Twitter Cards meta data cache server written in go

それと、他の人に使ってもらうことを考えると通知機能は必要だったかなと思います。UI/UXも含めて今後の課題ですね。

play.google.com