minne 事業部モバイルチームのエンジニアリングリードをしております、@mataku です。
Android/Kotlin の Google Developer Expert である star_zero さんによる 2020年1月におけるandroid開発状況を受け、minne の Android アプリで利用している技術も定期的に紹介しないとと思い立ちましたので、紹介しようと思います。
開発体制
Android エンジニア 2 名で開発しています。
minne 事業部は Android/iOS/Web といったプラットフォームにデザイナーは属しておらず、プロダクトデザインとコミュニケーションデザインというくくりで、プラットフォームをまたいで課題への対処をしています。そのため、基本的にはデザインの相談はプロダクトデザインのデザイナーに相談しています。
ペパボでは GitHub Enterprise を用いてソースコードの管理をしています。minne の Android アプリでも同様です。
開発言語
Java と Kotlin を用いています。
言語比率は 2020 年 8 月時点で以下のようになっています。CI でのワークフローで Fastlane や様々なスクリプトを用いているので、それらが Other として現れているようです。
新規クラスは Kotlin で書き、既存クラスはできるだけ Kotlin 化を行った上で改修する、というルールがあります。
minSdkVersion
23 です。Android OSバージョン6.0未満サポート終了のお知らせ にありますように、2020 年 7 月に minSdk を 21 から 23 に変更しています。Google Play Console で aab/apk を保持できる機能があるため、minSdkVersion を上げる際にはそちらを利用しています。
minne では iOS アプリも含め OS のサポートバージョンを切る基準を利用比率を用いて明確化しており、個人個人の判断に依存しないようにしています。
targetSdkVersion
29 です。できるだけ早く追従するようにしています。
Android App Bundle
対応済みです。2019 年に対応しており、このおかげで Google Play Instant の対応がスムーズにいきました。
AndroidX
対応済みです。
ライブラリについて
HTTP リクエスト
HTTP Client として OkHttp + Retrofit を主に使っており、一部で apollo-android を用いています。JSON のレスポンスを扱うために Gson を利用しています。
画像表示のリクエストでは Glide を利用しています。
Rx
RxJava/RxAndroid をスレッド管理として利用しています。RxJava に関しましては、presentation レイヤーから UI へデータをバインドするためのつなぎとして rx.Single も用いています。
Kotlin 化も進んでいるのと、Single 以外ほとんど使っておらず持て余しているため、現在進行系でスレッド管理を Kotlin Coroutines、つなぎの部分を LiveData で置き換えています。
ユニットテスト
JUnit, Robolectric, Mockito を用いています。
CI/CD
ワークフローの実行及び Google Play Console への自動リリースを行うタスクランナーとして Fastlane、様々な静的解析の実行及び通知を行うために Danger を利用しています。Danger には以下のような項目のチェックをお願いしています。
- レビュワーのアサイン
- マイルストーンの設定チェック
- danger-android_permissions_checker によるアプリに付与される権限の変化の検知
- danger-android_lint による Android lint の実行
- danger-findbugs による SpotBugs の実行
その他開発環境
アーキテクチャ
Model-View-Presenter (MVP) を採用していましたが、新規で作成する場合は Android Architecture Components の ViewModel を利用した作りにするほうが自然で取り入れやすいと判断し、Model-View-ViewModel (MVVM) の構成で作成しています。
Firebase
クラッシュの早期検知サービスとして、Firebase Crashlytics を利用しています。
Firebase Test Lab も利用しており、サポート下限と上限の OS バージョンを指定し、日次で robo test を実行しています。
導入していないものなど
Dependency Injection のためのライブラリ導入です。
ViewModel を導入したこともあり、ライフサイクルを考慮した初期化処理や ViewModelFactory など考えることが増えたため、Dagger Hilt が stable になったら導入しようと考えています。ViewModel に関わらず、Constructor Injection を用いて外部の依存を容易に差し替えられる作りにしているので、現状テスト時に困っていることはありません。
まとめ
minne Android アプリでの開発状況を紹介しました。唐突な紹介になってしまいましたが、今後は定期的にお届けできればと思っています。
新しい技術を取り入れつつも移行途中のものもあり、まだまだ技術的にもやっていかないといけないところはあります。より良いアプリを作るにあたり、技術的にもやっていきたいという方を募集しています。