今年もDroidKaigi 2023にオフライン参加しました。 そのまとめブログです。
- Day1
- Modifier.Nodeを使いましょう
- よく見るあのUIをJetpack Composeで実装する方法〇選
- iOSとAndroidで定期購入の意図しない解約を防ぐ
- YouTubeへのライブ配信機能をリリースするまで
- Master of NestedScroll
- Day2
- MVIに基づくStateMachineアーキテクチャ:KMMとJetpack ComposeとSwiftUIを組み合わせる
- Androidの『音』を制御する
- Androidアプリの良いユニットテストを考える
- Jetpack Compose で Android/iOSアプリを作る
- 突撃!隣のコードレビュー
- Material 3 やめました
- その他・会場の様子・ブース
Day1
Modifier.Nodeを使いましょう
- 旧仕組みのModifierメソッドチェーンやcomposedの場合では管理するCompositionツリーが大きくなってしまいパフォーマンスに影響を与える
- Modifier.NodeではonAttach,onDetachなどが提供、isAttachなどいくつかのプロパティは onAttach~onDetachの間でしか呼び出されないことの注意
- composedを利用している箇所をModifier.Nodeに置き換える
よく見るあのUIをJetpack Composeで実装する方法〇選
- よく見るコンポーネントをComposeで作るのはどう書くのかUIレシピの紹介
- このセッションの中でVisualTransformationを始めて知った。クレカ番号に-(ハイフン)追加するユースケース例で紹介されていた
iOSとAndroidで定期購入の意図しない解約を防ぐ
今回全てのセッションを楽しみにしていましたが、中でも特に楽しみにしていたセンションの1つがこちらでした。
- 定期購入の非自発的解約と自発的解約がある
- 非自発的解約はクレカが止まったり期限切れだったりするケースで今回はこちらを救う話
- Grace PriodとAccount Holdがあり、iOS,Androidでの期間の定義がそれぞれの違いがある
- Grace Priodは支払いが失敗した場合に購読状態を一定期間保ち続ける機能
- Account Holdは支払いの失敗が解約されなかった場合にアカウントを一時停止する機能
- Google公式のブログ内ではGracePriodで57%復帰と効果があることを証明している
- GooglePlayBillingLibraryではshowInAppMessageが使え「アプリの中」で支払い情報の更新ができる
YouTubeへのライブ配信機能をリリースするまで
- YouTube Data APIはいくつか分割されている
- プロダクションでリリースすするにはGoogleの審査を受ける必要がある
- Youtube側での設定なども紹介されていた
- 自分はしなさそうだけど、最近エンジニアでもYoutube活動されている人もいるのでタメになりそうだなと思った
- ショップ店員など向けのtoB系のアプリで配信機能つけるような場合、このセッションの知見は活かせるかも...?
Master of NestedScroll
立見であんまりメモとれず - AndroidViewとComposeの相互運用でスクロールを伝達させる方法はいろんなシーンで役立つ情報に思った
Day2
MVIに基づくStateMachineアーキテクチャ:KMMとJetpack ComposeとSwiftUIを組み合わせる
- MVIアーキテクチャは経験なかったが、結構チーム人数が多い場合に有効そうなアプローチに思えた
- データレイヤーとUIレイヤーでチームが分かれている場合などに並行して作業を進められる利点がある
- Constractから渡されるStateに合わせてUIを構築する約束事ができるので漏れは少なそう
- 割とやりたいことに対しての工数が膨らみそうだったりバグ修正が辛そうな感想を持ったが、セッション内では小さい変更がしやすいと紹介されていたのでまだ自分の理解度は低いかもしれない
- UMLが仕様書になる点はメリットとして大きそうに思えた
Androidの『音』を制御する
- AndroidはStreamTypeがありストリームを個別に設定できる。音楽と通知音など。
- 端末やStearmTypeによって最大音量が違う
- 音量は絶対値ではなくて、最大音量 * % で設定する
- 最大音量の数値を複数端末で調べているのすごかった
Androidアプリの良いユニットテストを考える
DeNAのSWETチームの方の発表で今回特に楽しみにしていたセッションその2!
- いいユニットテストとは
- アプリの変更の容易性を保つため、アプリの成長 = ビジネスの成長。E2Eですべてをカバーするのはむずかしい。
- 開発者から信頼
- グリーンであることを保つ
- 変更が容易
- テストの実行が簡単
- リグレッションを検知しやすい
- テストダブルのトレードオフ
- 実装が変わった時にテストダブルも修正する必要がある
- 使い方しだいではリグレッションやご検知に悪影響をあたえる可能性がある
- 実オブジェクトとテストダブルの互換性を保つ維持するコストがかかることを理解する
- テストダブルの容易さが維持を忘れる危険性がある
- 改善方法
- HumbleObjectパターン
- オブジェクトからロジックをできるだけ切り離すパターン
- ViewModelからロジック部分を切り離したり
- Createtion Methodパターン
- テスト間でインスタンス共有
- 何をテストしているか理解しやすくする
- 準備、実行、確認を区切る
- 関数名を変える
- パラメタライズテスト
- 有効なケースと無効なケースなどでパラメタライズテストを分ける
- テストケースの意図を説明するパラメータを追加する
- HumbleObjectパターン
Jetpack Compose で Android/iOSアプリを作る
- Compose Multiplatform Wizardで楽々プロジェクト作成可能
- API通信はKamelを使う。中でKtorに依存している
- KamelImageでネットワーク上の画像を読み込み描画
- Voyagerでナビゲーションを実現
- KMPはナビゲーションが公式でライブラリがなく辛みを感じていたのでVoyagerいいなと思いつつ、導入したら依存性が高そうなので覚悟が入りそうだなと思った(ライブラリとして捨てにくそう)
突撃!隣のコードレビュー
個人的にはレビューファースト意識持っているので共感性高いセッションだった
- DMMポイントクラブ、DMM TV、DMM ブックスの3チームのレビューにアンケート
- 色々な取り組みを紹介されていたが、全てに共通していえることは「レビューする人にとってどんなPRがレビューしやすいか」というレビュー上でのコミュニケーションと思いやりに溢れる内容だった
- レビュータイムやレビュワーにアサインされた人に通知など仕組み的な施策も紹介
Material 3 やめました
「Material 3 やめたいか!おー!」で会場が1つになった笑
- Material 3のColorが辛いよという話
- 特にブランドカラーがあるプロダクト(大体あるよなあ)では辛い
- 独自のCompose デザインシステムを作った話を紹介
- 小さくデザインシステム(デザイントークン)を初めていく時に参考になりそう
その他・会場の様子・ブース
- 今回25分セッションがなかったためか、割とゆっくりセンションを視聴できた気がした
- 元同僚の方や、SNSでやりとりさせていただいた方にご挨拶ができた
- 協賛企業さまのブースをすごい楽しんだ!
- 普段使っていたサービスでも知らなかったこととかここだから聞ける話が聞けた面白かった
- 「ZOZOさんのARメイク」とか「STORESさんのコード見せます!」とか
- ARメイクは自分はメイクとかしないけど、妻に布教できたのがお土産になれてよかった
- 40分話すネタが全く思いつかなかったけど、来年はCfP出せるといいなあ
当日の写真
DroidKaigi2日間楽しめました!ありがとうございました&お疲れ様でした