Bonfire Android #5 で発表した資料です。 https://yj-meetup.connpass.com/event/136481/
マネーフォワードMEにおけるJetpackの活用事例2019/08/19 (Mon.)Bonfire Android #5@syarihu
View Slide
Taichi Sato (@syarihu)● 株式会社マネーフォワード○ Androidエンジニア○ TechBooster
Android Jetpack
Android Jetpack● 高品質のAndroidアプリを開発者が簡単に作成するための一連のライブラリ、ツールおよびガイダンス
Android Jetpack● Jetpackの各コンポーネントは個別に導入できる● 生産性を高めるためのKotlin言語機能が利用されており、うまく組み合わせて使用する
AndroidX
AndroidX● Jetpack内でのライブラリの開発、テスト、パッケージ、バージョン管理、リリースに使用されているオープンソースプロジェクト
AndroidX● v28で終了したSupport Libraryを大幅に改良している● Support Libraryのパッケージはandroidx.* にマッピングされた
https://developer.android.com/jetpack/androidx/migrate/artifact-mappings
AndroidX● AndroidXのパッケージはすべてandroidx.* パッケージで構成され、Support Libraryと同様にPlatform APIから独立している
AndroidX● すべてのAndroidバージョンで可能な限り一貫して動作する機能を提供する● Support Libraryとは異なり、AndroidXのパッケージは個別に管理され、更新される
https://developer.android.com/jetpack/androidx/versions
AndroidX● Support Libraryの新規の開発はすべてAndroidXライブラリ内で行われる● 元のSupport Libraryアーティファクトのメンテナンスや新しいJetpackコンポーネントの導入も含まれる
AndroidXに移行する
AndroidXに移行する● Android Studioにあるマイグレーションツールを利用して移行する○ Refactor -> Migrate to AndroidX
AndroidXに移行する● マイグレーションツールは機械的にパッケージをすべて置き換えてくれるが、いくつかの問題がある
AndroidXに移行するパッケージフルで参照されてしまう
AndroidXに移行する● このまま放置してしまうと、見つけたら都度修正する手間が発生し、PR毎に関係の無い差分ができてしまう➢ すべて手動で修正することで、ほぼimport文の差分だけになった
AndroidXに移行するうまく置き換わらない
AndroidXに移行するandroid.support.design -> com.google.android.materialandroid.support.v7.appcompat -> androidx.appcompat
AndroidXに移行する● AndroidXが登場してから結構経っているので、OSSも既にAndroidX移行が完了しているケースが多い
AndroidXに移行する● プロジェクト内で利用しているOSSをすべてAndroidX対応のバージョンへ上げたほうがよい
Jetpackを利用した設計に置き換える
● 新しい設計を一気にすべて適用するのは難しい● 必要なライブラリを導入できたら、UI刷新やリファクタ時などに画面単位で新しい設計を適用していくJetpackを利用した設計に置き換える
Jetpackを利用した設計に置き換える● 2018年6月ごろに手入力画面のUIを全面的に刷新することになった● 新しい設計を適用する良い機会だったので、新しい設計でリファクタすることにした
1. Dagger2の導入2. JetpackのViewModel, LiveDataを導入3. 手入力画面を実装Jetpackを利用した設計に置き換える
● チームメンバーには新しい設計を適用した画面のコードを見ながら説明● 新卒のメンバーには、ある画面をリファクタする際にペアプロすることで理解を深めてもらったJetpackを利用した設計に置き換える
Jetpackを使った機能の例手入力画面編
● 電卓部分を別のFragmentにして、計算ロジックはViewModelへ● 電卓のViewModelでは計算結果などをLiveDataに流す● ViewModelのスコープはActivityにするJetpackを使った機能の例
● 手入力画面の各項目の入力画面は別のFragment○ 電卓のViewModelのスコープはActivity○ 電卓のViewModelのLiveDataをobserveするだけJetpackを使った機能の例
https://sh.syarihu.net/2Z6DdoM
Jetpackを使った機能の例課金機能編
● マネーフォワードMEでは3月に年額課金をリリースしたJetpackを使った機能の例
● 月額課金はAIDLによって実装されており、新しく実装するのであればPlay BillingLibraryを使って実装するべきだと判断し、リファクタすることにしたJetpackを使った機能の例
● Play Billing LibraryはBillingClientと呼ばれる抽象クラスを介してPlay Billingと連携し、課金機能を提供する● Play Billingの接続や接続解除などの処理を毎回実装するのは手間がかかるJetpackを使った機能の例
● JetpackのLifecycle, ViewModel, LiveDataを活用してBillingClientの処理を実装することにしたJetpackを使った機能の例
● JetpackのLifecycle, ViewModel, LiveDataを活用することで、BillingViewModelを使えばどの画面でも簡単に課金機能を実装できるようになったJetpackを使った機能の例
https://sh.syarihu.net/2TGyGZb
https://sh.syarihu.net/2HdmZUO
Jetpackを使った機能の例入出金履歴編
● マネーフォワードMEでは2019年8月のリリースで入出金がボトムナビゲーションに追加されたJetpackを使った機能の例
● 入出金のボトムナビゲーションでは、新着の入出金があった場合にバッジをつける必要がある● 入出金に何か変化が合った場合は履歴一覧を更新する必要があるJetpackを使った機能の例
ややこしい…
● 入出金履歴画面に戻ってきたときに更新してくれるように更新リクエストを送りたい…Jetpackを使った機能の例
● RxJavaのBehaviorProcessorとLiveDataを組み合わせて使うことにしたJetpackを使った機能の例
● これで別の画面にいても更新リクエストを行うことができ、入出金履歴に戻ってきたタイミングでLiveDataをobserveすることで履歴が更新されるJetpackを使った機能の例
● ボトムナビゲーションのバッジも似たような処理でリクエストを送り、LiveDataにリクエストが流れてくればバッジが更新されるようになったJetpackを使った機能の例
Jetpackを利用して1年経った今
● マネーフォワードMEではViewModelやLiveData、Lifecycleを設計に適用してから1年ほど経ったJetpackを利用して1年経った今
● 新しい設計を入れてから、古い機能を刷新して新しくする機会が多かった● 設計を適用するためにリファクタするといったことをしなくても、多くの部分に新しい設計を適用することができているJetpackを利用して1年経った今
● Dagger2を使ったDIによりViewModelをinjectすることで自然とViewとロジックが分離し、テストも書きたいときに書けるようになったJetpackを利用して1年経った今
おまけ: Kotlin率
宣伝
https://moneyforward.connpass.com/event/140296/
● 2019/08/23 (金) 13:00 ~ 17:30● マネーフォワードのサービス開発に関する技術や手法だけでなく、スタンスや想いを共有する場です● 私も入社してから今までのマネーフォワードのAndroidエンジニアとしての活動をお話しますMoney Forward Developers’ Stories
ありがとうございました