2019夏メディアプロダクト開発部の安部(@STAR_ZERO)です。cookpadLiveで採用してる技術について紹介したいと思います。料理上手な有名人や料理家がクッキングLiveを生配信しています。一緒に、Live配信でリアルタイムに料理が楽しめるアプリです。28AndroidX特別な箇所はないですが、最新に追随するように努めています。比較的新しいアプリなので、最初からすべてKotlinで記述されています。targetSdkVersionについてはそろそろ29に対応する予定です。29にすることでの影響を調査している状況です。3.5はbetaの段階から導入しています。processingを使いたかったためです。cookpadLiveでは全面的にDataBindingを採用しているため、これの恩恵は非常に大きいものになります。これまでは、レイアウトファイルを変更してビルドし直さなければコードが生成されず効率がよくありませんでした。3.5からはレイアウトファイルを変更すると同時にコード生成も行われるのでビルドによる待ち時間が減り効率よく開発できるようになりました。Jetpack現在、cookpadLiveではJetpackを積極的に採用しています。DataBindingLiveDataViewModelPagingNavigationRoomDataBinding、LiveData、ViewModelについては、最初は使用されていなかったのですが、徐々に導入を進めて今では全面的に使用しています。意外と便利だったのが、ViewModelをActivityに関連付けることでActivityとFragment間、それぞれのFragment間でのデータやイベントのやりとりが可能になる機能です。この機能のおかげ実装がだいぶ楽になったこともありました。以下のようにActivityのイベントをFragmentでも受け取ることが簡単にできます。}}Pagingはだいぶ癖があるライブラリですが、ちゃんと理解して使う非常に便利です。これも早い段階から導入しています。現状ではネットワークにはライブラリ側で対応はされてないですが、今後される予定らしいので、楽しみにしています。Navigationについてはそこまで活用できないですが、部分的に使っています。Activityにすることは考えてないですが、出来る箇所はFragmentに移行していきたいと考えています。SafeArgsは画面間の値の受け渡しが便利になるので積極的に使っていこうと思います。RoomはDBまわりの処理には欠かせないくらい便利です。RoomはLivaData、RxJavaと簡単に連携することができるため、既存の実装に組み合わせることが簡単にできました。SQLも補完とシンタックスハイライトが効くので非常に助かります。こちらも最初は使用されてなかったのですが、徐々に導入をすすめました。Daggerについては非常に難しい印象がある人が多いと思いますが、一度使うと便利すぎて手放せません。DaggerでRepositoryクラスなど生成するようにして、あとは使いた箇所でInjectするだけです。ViewModelなどで必要なRepositoryが増えた場合も、生成するコードを意識せずパラメータに追加するだけ済みます。最初の設定さえうまくやってしまえば、あとは楽になるはずです。以前、部内でやったDagger勉強会のチュートリアルコードのリンクを貼っておきます。この部分が一番特徴的かもしれません。AppSyncはAWSのマネージド型GraphQLサービスです。ユーザーが送信したコメントやハートをAppSync(GraphQL)のSubscriptionの機能を使い受信するようにしています。ライブによって非常に多くのコメントやハートを受信することになりますが、受信のたびに画面に描画するのではなくRxJavaのbufferを使ってある程度まとめて画面に描画するようにしています。このあたりはうまくRxJavaと組み合わせて実装しています。AppSyncの話は以下の記事の後半部分を見ていただければと思います。RxAndroidExoPlayerこのあたりよく使われてるライブラリですね。これらももちろん活用しています。Repositoryパターンを採用しています。元々はVIPERだったのですが、DataBindingやLiveDataとViewModelを導入していくと同時にMVVMに移行していきました。今ではすべてMVVMで実装されています。私個人の経験からもJetpackを導入することで、開発効率と品質に大きく貢献することは明確だったので、これらを導入しました。VIPERはAndroidではあまりの馴染みがないかもしれませんが、MVPパターンのようにInterfaceを使って各レイヤー間の処理を呼び出します。すごく簡単な例ですが、以下のような感じです。}}このようにViewへの処理を呼び出すのにInterfaceを使ってPresenterからViewへの処理を呼び出しています。問題がなさそうですが、この時点で既に問題があります。Presenterでデータ取得中にActiivty/Fragmentが破棄された場合はどうなるでしょう。破棄されてるオブジェクトにアクセスすることになり、場合によってはクラッシュします。これはPresenterがActivity/FragmentのLifecycleについて何も知らないからです。これを解決するにはPresenter側に破棄されたことを教えてあげる必要があります。これを今の実装で書き換えた場合です。/></layout>ここではDataBindingを使用していて、ViewModelが保持しているLiveDataとバインドしています。このLiveDataの値を変更すると自動的にView側にも反映される仕組みになっています。ここで重要なのは、LiveDataはLifecycleのことを知っているので、Activity/Fragmentがアクティブな状態のときしかデータを流しません。そのため、さきほど説明したActivity/Fragmentが破棄されたときの対応を特別にせずとも問題が起こることがありません。ViewModelおいては回転でActivityが再生成されたときもViewModelは状態をもっているため、データ取得を中断することなく処理を継続することができます。この設計にすることでActivity/FragmentはViewModelの状態を反映すれば良いだけになり、責務もしっかり分かれて見通しが良くなりました。単純にVIPERはファイル数が多くなるため、コードを追う時にコードジャンプであちこち飛ばなければならず、個人的にはコードが追いにくい感じでした。他にも様々な面で効率・品質を向上させるのに貢献してくれています。その他便利なJetpackライブラリも簡単に導入できるようになっています。今ではすべての画面が同じような感じになってるので、どういう処理をしてるのかを理解しやすくなっています。この設計変更ですが、新規画面については新しい設計でやり、既存については少しずつ進めていました。UIを大きく変更するタイミングもあったので、その時に一気に直した箇所もありました。出来ることからコツコツやってこともあり、大きくコストをかけることなく変更できました。CI環境CIに関しては、Jenkinsを使っています。やってることは以下になります。Play内部テストへアップロード可能な限り早い段階でリリース版をビルドして触ることで、問題があったときに早めに気づくことができるようにしています。Proguardまわりは見落としがちになるを防げます。リリースするときは内部テスト版を製品版へ昇格するだけになっています。今ここは手作業でやってるのですが、ChatOps等で出来るようにしたいと考えています。マルチモジュール現状では、スマホ、AndroidTV、FireTVで共有するようなモジュールと、featureモジュールをいくつか分割しています。図にすると以下のような感じです。共通View、ログ、リソースなどandroidtvAndroidTVメインfiretvFireTVメインまだfetureモジュールは分割できる箇所があるので、少しずつでも進めていきたいと思います。課題と今後テスト正直、まだそこまでうまく書けてる状況ではないので、なんとかしていきたいと思っています。ライブラリの選定から考えようとも思っています。StyleとThemeStyleとThemeについては結構ちらかってる状態なので、整理したい思っています。画面数もそこそこあるので、だいぶ大変な作業になる気配がしています。いうふうに整理するかを検討してから少しずつやっていく感じになりそうです。Navigation前に書きましたが、まだまだ活用できる箇所があります。すべてSingleActivityとは考えてないですが、Fragmentでの遷移で良い箇所もあるので、そういった箇所に対応していきたいと考えています。CoroutinesCoroutinesについては、どうするかを検討している段階です。現状でCoroutinesじゃないと困るような場面は出てきていませんが、JetpackもCoroutinesの対応が進んでいて実装するのに困ることはないと考えています。今後Coroutinesによって実装コストが下がるような機能なんかも出てくる可能性ありそうです。メンバーと会話して、導入する気持ちはありますが、進め方やどこから導入するのかを考えています。まとめcookpadLiveでは積極的にJetpackを使っていき、Googleが推奨しているやり方にどんどん乗っかっていっています。今後もJetpackも改善されていくと思うので、それにいつでも追随できるような状態を保つようにしています。これからもcookpadLiveでは新しい技術を積極的に取り入れていきますし、やりたいこともまだまだたくさんあります。興味がある方いらっしゃいましたら、気軽にお声がけください。一緒に色々チャレンジしていきましょう。クライアントアプリ開発の裏側こんにちは。メディアプロダクト開発部の柴原(@nshiba310)です...2019-11-08クックパッド採用説明会「クックパッドはサービスの作り手を採用したいんです。」を開催しました!こんにちは、メディアプロダクト開発部の長田(おさだ)です。...2019-06-25SwiftUIで使用されているSwift5.1の新機能こんにちは。参加しましたこんにちは、技術部品質向上グループの加藤です。使ったセキュリティログ検索基盤の構築サービス特性にあった検索システムの設計戦略クックパッド採用説明会「クックパッドはサービスの作り手を採用したいんです。/*}*/スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。