3年ぶりのオフライン
2022/10/05~07に開催されたDroid Kaigi 2022に参加しました。3年ぶりのオフライン参加でお祭り感をビジビジ感じました。
- 3年ぶりのオフライン
- 今年も公式アプリへコントリビュート
- オフライン参加での感想
- セッション
- Gradle Managed Virtual Devicesで変化するエミュレータ活用術
- Introduction to Wear OS Application Development
- Context Receiversに思いを馳せる
- 詳解Google Playの新しい定期購入 ~オファーの活用や実装例を添えて~
- コルーチンを使って処理の見通しをよくする - リアルタイム放送の品質を向上し、保つために
- Camera Xライブラリの魅力と最新機能を紐解く
- 今年リリースされたCTS-D (互換性テストスイート)をアプリ開発に活用しよう!
- 協賛企業LT大会
- アプリアーキテクチャガイド
- BLEを使ったアプリを継続的に開発するために
- All your Compose @Previews to screenshot tests without instrumentation
- 2022年の動画再生アプリの作り方
- ついにアプリ毎の言語設定がOSレベルでサポートされたぞ!
- はじめようビルドメトリクス
- Deep dive into Jetpack Compose Text
- Day3 Code lab & Fireside Chat
今年も公式アプリへコントリビュート
DroidKaigi参加は何回目かなんですが、今回も公式アプリへのコントリビュートしました。WelcomeTalkでコントビューターのアイコンを表示してもらえるのですがあの瞬間はテンション上がりますね。 今年は会社のチームでコントリビュート会を開いたこともあり、チームメンバー全員コントリビュートを果たせました。チームメンバー1人はDroidKaigiスタッフだったこともありチューターもやってもらったりして、同期的に取り組む利点を最大限に利用させていただきました。(ありがと〜)
オフライン参加での感想
オフラインならではの人に会える体験したり、ブースでの企業さんのプロダクトやその企業のことを知れたりすごい楽しめました。現同僚はもちろん、元同僚やカジュアル面談でお会いした人たちとも会えるのはオフラインならではですね。 オフラインで感じたことの1つとしてDroidKaigiスタッフの方々がみなさん優しいというか、周りで困っている方いたらサポートしていたりしていて素敵だなと感じたこと、参加者も皆さんルール守ったりしてあの会場にいた人たち全体であの場を作っている感じを受けました。
人が集まった時のパワーってすごいですね。楽しかったです。
あとは、オフラインの楽しみの1つでもあるノベルティ。公式や各社ノベルティもたくさんいただいて来た時より荷物パンパンになりました...!
セッション
day1, day2 とそれぞれ参加したセッションの簡単なメモです。見たいセッションばかりで被っていて見れなかったセッションは資料や動画公開を楽しみに待ってます!
Gradle Managed Virtual Devicesで変化するエミュレータ活用術
- GMVによって、gradleにセットアップ書いておけば、エミュレーター作成からテストまでコマンド1つで実行できてしまう
- バージョンなどによる制約もあったりはまりどころもあるので細かなTips紹介
- やりたいことによっては工夫が必要そうだけど、うまく活用できれば便利そう
Introduction to Wear OS Application Development
最近、技術書店でWear OS の同人誌書いたこともあってこちらのセッションを見た
- 日経電子版での事例
- Wear OSでのアプリは企画が難しい
- 通知だけなら開発不要で対応できるので何を作るか
- 円形デバイス・非円形デバイス、スタンドアロンにするか
- Wear OSアプリのリリースまでの話
Context Receiversに思いを馳せる
- Context Receiversを用いてFlowのCollectなど拡張関数化して省略できる
- 型システムで複数レシーバ
- コンストラクタの隠蔽
- 濫用が怖いイメージもある(導入はチームの方針にもよりそうだなという感想持った)
詳解Google Playの新しい定期購入 ~オファーの活用や実装例を添えて~
これは仕事でPBL5に対応する矢先だったので絶対聞きたかった
- 新しい定期購入の構造
- 既存の定期購入は新しい定期購入に自動で返還されているが理想の構造にはなってない
- 既存を無理に新しい構造にするのはおすすめしない
- 要件で無限にオファーが増えていったので新しいオファーの構造はいい感じだけど、既存はそのままにしておくのがよさそう
コルーチンを使って処理の見通しをよくする - リアルタイム放送の品質を向上し、保つために
- コードの見通しを良くしていく
- コードの見通しを良くしていくことで本来不要な処理などにも気付ける
- バグなどがあるときにも対応がスピーディーになる
Camera Xライブラリの魅力と最新機能を紐解く
- Camera API の遍歴の振り返り
- CameraXによりCamera 2と比較して圧倒的に少ないコード量でカメラ実装を実現できる
- CameraX動画の対応もきた
- ベンター提供の拡張機能を組み込める(ボケ・HDR・顔写真加工など)
- ExtensionManagerでサポートをチェック
- CameraXでは提供されてなくCamera2のみの場合もある
- LifecycleCameraControllerでより簡単に実装
今年リリースされたCTS-D (互換性テストスイート)をアプリ開発に活用しよう!
- Androidの持つエコシステムの1つ、さまざまなデバイスで動作するための互換性テストスイート
- Androidアプリ開発者もCTS-Dに参加可能なようにASOPで提供(私のメモ、これ認識誤解しているかも)
協賛企業LT大会
- 協賛企業から代表者のLT
- いろんな企業の話を聞けた
- 他の企業の規模感に驚き
アプリアーキテクチャガイド
ここから2日目のセッション。1日目の反省を生かして会場でスマホでメモ取ったのでちょっとメモが充実。
- なぜ、モバイルのクリーンアーキテクチャは研究しないの?
- そもそもクリーンアーキテクチャとはなんですか?
- デザインパターンでしたっけ?
- そうではない
- 課題に対する解決ではなくて哲学なので、パターンというには微妙
- クリーンアーキテクチャから得られるインサイトはレイヤーの構造の分け方
- solid原則、単一責務の原則は利用できるが、
- クリーンアーキテクチャの実現は重要ではない
- なぜ、ドメインレイヤーが大事なのか
- UI層とデータ層の仲介がないことによる設計の問題を解決する
- ドメイン層を実装しなくても考察は必要
- UI層に集中しすぎると
- 画面中心思考 画面の区別を超える対応が難しくなる
- アジャイル逆効果 画面の要素がそのままバックログ、featureになる
- コーヒーメーカーで設計を書いてみるワーク
- エンジニアやデザイナーでワークするの楽しそう
- コーヒーから考えて設計する
- データやエンティティ中心の設計ではいい設計はできない(画面中心も)
- 核心行為とactorを抽象化する形がもっと重要
- DDDに近い設計を考えるが、アプリでドメイン駆動設計は当てはまるケースあまりない
- ドメインロジックはサーバーサイドにあることが多い
- ではアプリではどうするのか
- Usecaseを利用
- non-domain mediator layer
- 自身のアプリだけで意味のある層( ゲートウェイ、マッパーなど)
- そもそもドメイン層ないパターン
- リポジトリにかく
- リポジトリ層の話
- リポジトリ層はデータ層
- ドメイン層またはUI層から呼び出す抽象を提供
- インターフェースの提供
- よくある誤解が単一責務に違反するなどな話がある
- 抽象化という観点で見ると問題ない
- DataSource
- データIOを実装
- 考察事項
- 簡単なCRUDなら
- repository datasource 両方が必要ないかも
- ViewModelは必要か?という議論
- 必要か必要ないかはどちらもありえる
- 一般的な実装に役立つ最小限の機能を提供
- 俺はViewModel好きだぞ
- ViewModelではないものを実装したとしても、AAC ViewModelのような振る舞いはしてくれないだろうから、自分のプロジェクトに合うものを採用すればいいけど、大体のアプリはAAC ViewModel使えばいい
- Google社内でもAAC ViewModel嫌いな人もたくさんいる
- ViewModelの問題のよくある例
- Viewからイベント作成
- ViewModel内のステート変更
- View側でステートを受け取る
- データバインディングで解決すればいい
- Composeならもっと解決のアプローチがある
- MVPは宣言型UIの場合は微妙
- remenberSavableの登場でViewModelが提供してきたステートがView側で可能に
- そのため、ViewModelがなくても動作可能なケースもありうる
- ここ結構考えどころだなあ
- バックグラウンドスケジューラでComposableのスナップショットステートを変更
- →クラッシュ
- コンストラクターで何かデータなどの変更は
- initを使うか、サブスクリプション時に実行が理想
- stateinでサブスクライズ指定できたのか!
- UIステートをVMに持たせるのはComposeではよくない
- アニメーションとかはComposeにもたせる
BLEを使ったアプリを継続的に開発するために
BLEの辛さは今もかわってないんだな
- コールバック地獄
- BLEは命令したらその結果が返ってくるまでは次の命令ができない
- コルーチンでコールバック地獄を回避して見通しをよくする
- BLEはコルーチンやフローはもうマストよなあ
- BLEは完全に沈黙することがある
All your Compose @Previews to screenshot tests without instrumentation
すごくいい、導入したい
- スクリーンショットテスト
- UIテストはメンテナンスするのがフラッキーでハード
- スクリーンショットテストはユニテに似てる
- 小さいUI単位
- プレビューを活用(意訳)
- parrazzi、フルComposeじゃなくてもいけるんかなあ
- showkase
- アンドロイドデベロッパーと次の人たちの間でコミュケーションを発生できる
- デザイナー
- QA
- PMs
- Parrazzi
- cash app
- インズドュルメンテーションなしでレンダリングする
- ユニテをターゲットにできそう?
- TestParameterInjector
- runwithで指定すればいいのか
- でも画面がすべてComposeで構成されてないとダメそうな気配を感じる
- Androidから切り離してComposeだけのカタログモジュール用意すればいけるかもな
- CIでPRでスクリンショットで違いをのせる方法
2022年の動画再生アプリの作り方
- 動画の機能はAPIレベル1のころからある
- 2014 MediaSessionが登場
- AndroidTVやAndroidAuto WearなどさまざまなAndroidデバイス登場が背景
- Android8からPIP登場
- ピクチャーインピクチャー
- Android10 大画面、折りたたみデバイスの最適化
- 動画アプリの要件がAndroidの進化とともに変化してきた
- ExoPlayer
- Jetpack Media3
- exoPlayerをServiceにもたせる
- 登録導線に動画あるのがそもそもしんどい
- セッショントークンを取得する
- PIPの実装
- マニフェストでアクティビティの設定変更
- サポートPIPをtrueにする
- configchangesの設定
- PIPモードへの遷移
- ホームに戻るときやボタンクリックなどで遷移できる
- デバイスのスペックにより無効化されている可能性ある
- スペックチェック必要
- 極一部の、端末では許可されててもランタイムクラッシュは発生する
- PIPモードのときにUIを更新する
- リスナーで行う
- fold featureを使ってUIを更新する
- ↑折りたたみデバイスの話
ついにアプリ毎の言語設定がOSレベルでサポートされたぞ!
- Android13からアプリの設定画面から言語切り替えが可能
- 言語切り替えのAPIが提供
はじめようビルドメトリクス
- ビルドとは何か?
- 仮説を立てた上で取り組みましょう
- ビルドで何が行われているか
- gradle task
- Build Analyzerで確認
- タスクごとの時間がわかる
- スキップされるタスクもある
- ビルド時間は毎回同じではない
- gradle-profier を使うとしっかりビルド時間を計測できる
- profile オプションとは別物
- 1日の総ビルド時間
Deep dive into Jetpack Compose Text
- Canvas の下にもまだレイヤーあるんだ
- ComposeのTextの下にBasicTextがいる
- Text マテリアルデザインあたる
- BasicText ほんとにテキストだけ
- BasicTextの下はParagraph
- letterSpacing はemで指定可能
- SelectionContainer
- Compose OSとは分離してるからOSのアプデ待たずComposeのアプデ利用できるのか
- 意識してなかったけど、いいですよねこれ
- lineHeightStyleが追加 experimental
- line BreakWordStyke
- グーグルフォントインテグレーション
Day3 Code lab & Fireside Chat
Day3もオフライン参加しました。FiresideChatではスタッフさんの話や公式アプリのことについて話を聞けました。FiresideであったRobot testing patternは導入してみたくなったり、コントリビュート以外でもこの場で勉強になる話が色々聞けました。同席だった人とは前日に予約開始されたPixel7について話できたりもしました。Codelabは自分でも進めていたので続きからやってしまったのですが、チューターさんがいたので、せっかくならすこし難易度高そうなものに取り組めばよかったなあとちょっと反省。
来年、京都開催できたらいいですね!