いまからAndroidアプリを作るならこうしたい

仕事でandroidアプリを作ったので感想 + こうしたかったとかあるので記録がてらメモ

前提

  • フリーランスとして知り合いからandroidアプリ作ってよって言われて作ったが、自分自身androidアプリ作成経験はない
    • とりあえずandroid studio落としてきてkotlinでサンプルコード書いて動いたことあるレベル
    • そんな人間になんで仕事来たのかは謎だがやりきった
  • すでにiOSアプリはあるので、呼び出すApiやロジック等はswiftのコード見ながらいい感じにやる
  • 周りに相談できる人がほぼいない
    • たまにTwitterでギャーギャー言ってたら @konifar さんが助けてくれてマジで神と思った
  • kotlin 1.3. + android studio 3.3. で開発
    • Javaは全くわからない
  • android端末自体はプライベートで持ってないのでデフォルトの挙動がいまいちわからない

アプリ自体はとあるサービスの有料会員限定で使えるサービスのものなので、URL等は貼らない

アーキテクチャ

Amazon.co.jp: 黒帯エンジニアが教えるプロの技術 Android開発の教科書 やネット上の記事を読んだりしてMVPで作ることにした。 結果的に良かったのかがあんまり実感がない。

githubだとこの辺を参考に

技術書典で売ってた本が結構良かったが、開発が終わりそうなタイミングで読んだのが微妙だった
これらのと出会って、あーもっとこう書けばよかったと思うことがめちゃくちゃあったので、先に読みたかった

JSONのparseについて

ApiRetrofit + JSON parseにgoogle/gson を使っていたが、サーバー側で正常時は配列なのにエラー時は空文字みたいな感じで同じキーなのに状態によって中身が変わることがあった。
型が持てないので悩んだ結果、Anyにして受けれるようにしてLinkedTreeMapをcastしてvalueを取り出すことにした

data class Item(
  var id: String,
  var data: Any
)

square/moshi は使ってないんだけど、こっちならこの辺対応できるのかもしれない

ハマったところ

エミュレータのhostの書き換え

ローカルのサーバー環境がlocalhostではなく、http://development.hogehoge.com 的な感じでアクセスする必要があったので、android端末が持つhostを書き換える必要があった。
Android エミュレータの hosts ファイルを編集 - なんとなくな Developer のメモ みたいな感じでやると書き換わるんだが、その後エミュレータが起動しないという現象になる

悩みまくった結果、 $HOME/Library/Android/sdk/emulator/emulator -avd XXX(エミュレータ) -writable-system で立ち上げた状態なら起動するので毎回ターミナルからコマンドを叩いてからエミュレータ起動という流れで開発していたが、これ以外のやり方がわからなかった

data classについて

JSONをパースするclassを最初は data class で作っていた

data class Item(var id: String,
                var title: String,
                var url: String)
                
interface ItemInterface {
    @GET("v2/items.json")
    fun items(): Call<List<Item>>
}

しかし、データによって条件を出し分けたいみたいな関数をどうしても欲しくなって結局classにするみたいなケースが頻繁してdata classと普通のclassが混ざってすごい気持ち悪くなった
data classのベストプラクティスがよくわからない…。

アプリのクラッシュ

プッシュ通知と分析とアプリのクラッシュにfirebaseを使ってる
設定を入れるだけでパッと使えるのですげー便利
ただ最初のリリースでユーザー ID を設定し忘れたのはミスった。
ついでにクラッシュした際のログにどの画面を見ていたかみたいな操作ログも入れた
Firebase Crashlytics のクラッシュ レポートのカスタマイズ  |  Firebase

debugビルドの場合は hyperion-crash ってライブラリを使ってる。
Firebase Crashlyticsの場合は若干ラグがありリアルタイムで見れるほうが便利なので、こっちを使ってる

参考にしたモノ

小技


他にもlistの更新とかレイアウトの違いやandroid独特の動きやデザイン、ディレクトリ構成とかいろいろあるが、一旦はこんな感じで