今年もDroidKaigi2024にオフライン参加してきました
今年は転職したこともあり、自社のブースに立ってコミュニケーションとったりしたのが大きな変化だった。 後は、前職の人とも会えたり、SNS上でだけご存じだった人と話したりできた。
- Workshop Day
- Day1
- Welcome Talk
- Contextを理解する | DroidKaigi 2024
- パネルトーク 〜Androidエンジニアのキャリアとスキルアップ〜 | DroidKaigi 2024
- Jetpack Compose Modifier徹底解説 | DroidKaigi 2024
- Action
- Alignment
- Drawing
- Padding
- Pointer
- Semantics
- Size
- Test
- Transformation
- その他
- 仕組みから理解する!Composeプレビューを様々なバリエーションでスクリーンショットテストしよう | DroidKaigi 2024
- Day2
- Welcome Talk
- アプリをリリースできる状態に保ったまま段階的にリファクタリングするための戦略と戦術 | DroidKaigi 2024
- Jetpack ComposeにおけるShared Element Transitionsの実例と導入方法 またその仕組み | DroidKaigi 2024
- 分析に裏打ちされたアプリウィジェット開発 - Jetpack Glanceとともに | DroidKaigi 2024
- 2024年最新版!Android開発で役立つ生成AI徹底比較 | DroidKaigi 2024
- 使って知るCustomLayout. vs DailyScheduler | DroidKaigi 2024
- Debugging: All You Need to Know | DroidKaigi 2024
- Android開発以外のAndroid開発経験の活かしどころ | DroidKaigi 2024
- ブース
- HONDA さん
- FlutterKaigi さん
- FULLER さん
- ROLLCAKE さん
- 転職ドラフト さん
- Sansan さん
- 会場の様子
- After Party
- 自社ブースにも立った
Workshop Day
Workshop Day参加したので3日間いました。
- kmp, cmp(Compose Multiplatform) をしっかり目に学ぶ
- kmpを用いて、Android, JVM, WASM を動かしていくワーク
- kmpはちょっとかじってたので当日はそれなりに理解できた
- expect と actual でほげほげする
- JVMが地味に一番むずかったかも
- cmp のリソース管理や、ViewModel, Navigationなどが扱いやすくなってて進化を感じた
- 1年前は諸々しんどかった記憶(Androidの知見、資産が使えずぐぬぬとなった記憶)
- cmpでいろいろできるようになっているので改めて入門してみたくなった
- Fleetは発展途上中感は否めないけど、なんかシンプルでAndroidStudioみたいにごちゃついてないのはいい感じだった
- ただPreviewがバグったり、スクショをIDEからとる方法がわからなかったりちょっと使い心地はまだまだかも
Day1
Welcome Talk
- 毎年OPムービーがすごい、曲もおしゃれかわいい
- DroidKaigiは祝10周年
Contextを理解する | DroidKaigi 2024
Contextとは
アプリがアプリ内外の情報や機能にアクセスする窓口
なぜContextが必要か
- 文字列リソースの取得
Contextは現在の環境に基づき、適切な情報を取得
eg. 日本語、英語、スペイン語でリソースを定義している状態
それぞれの端末の言語設定に合わせて文字を表示できる - 通知作成、表示
システムサービスにアクセス
通知チャネルや通知を表示するため
リソースの取得のため
種類と使い分け
Context
- Activityのライフサイクルに依存
用途
- Activity内の短期的な処理に向いている
- Activityの情報が必要な時
ApplicationContext
- アプリのライフサイクルに依存
用途
- Activityのライフサイクルを超える処理
- DBへのアクセス
誤用するとどうなるか
Activityが必要なときにApplicationContextを使ったら
- クラッシュする
Applicationが必要な時にActivityContextを使ったら
- Workerでバックグラウンドで処理
- クラッシュせず
- Workerは内部でApplicationContextを取得していたのでクラッシュしなかった
メモリリーク
- ViewModelにAcitivityContextを保持すると、ViewModelの方がActivityよりライフサイクルが長いのでメモリリークが起きる
Contextの取得方法
AndroidView
- Activity
- this
- applicationContext
- Fragment
- getContext
- requierContext
- getActivity
requireActivity
get
- 存在しない場合null
require
- 存在しない場合は例外
Contextが存在しない場合とは - Fragmentがアタッチされてない状態の時
アタッチが確実な場合はrequire
- onAttach ~ onDettach の間
- コールバックなどですでにデタッチされていることが想定される場合はget の方がいい
Fragment.isAddedでアタッチされているかどうかを確認できる
Activity特有の機能にアクセスしたい時
- Activityの起動、メソッド呼び出し
Activityである必要がないとき
- Activity
Compose
- LocalContext.current
- LocalContext.current.applicationContext
- ComposetionLocalの仕組みでContextを提供されている
パネルトーク 〜Androidエンジニアのキャリアとスキルアップ〜 | DroidKaigi 2024
どんな会社で働くのがいいか
- よく言われるのは大きな会社は、意思決定のスピードは遅いが、社会に与えるインパクトは大きい
中小や小さい会社は、自分が担当する範囲は広くなる。世に出したものの中で自分が関わる部分が大きくなる
好きなように働きたいで起業
- いろんな会社を見てきた経験から、大きい新しいものの導入が遅い
規模感や会社文化にマッチ
- 一緒には働く人の雰囲気がマッチする
- 今の環境は穏やかな人が多い
転職活動で会社の選び方
- 直近2回はリファラル
- 知り合い(自分と会う人)のいる会社は結局似たような人が集まっているので自分とマッチ
エンジニアとして求められる技術
Androidエンジニアになる前に身につけるとよかったこと
Androidの学習でいっぱいなので、ビジネス視点、デザイナー、英語などAndroid以外のこと
勉強という意識を持たないくらいに好きなことを学ぶ
汎用的なソフトウェアエンジニアの知識
キャッチアップはどのようにしているか
AndroidDagashi
- Androidできる人たちが発信しているものがある
- 何が優先的なのかがわからない
- Xでキャッチアップ速い人をフォローして自分にも取り入れる
テックリードなので1 on 1の場で、技術トピックをメンバーと話してキャッチアップ
勉強中の自分の理解があっているか自信持てない時の解決
- 中のソースコードをみるか、niaを見に行く、公式を見に行く
Android以外のものだと、Readmeを見に行く
Xやコミュニティで聞いてみる
忙しい中でスキルアップ
- 曜日、時間は勉強する予定を決めている
- スケジュールに勉強を組み込む、他の予定を調整する
- どうしても時間取れない場合は、無理しない
自分にストレスを溜めないようにする
スキルアップしたい内容で忙しくする
- 不具合調査などでPythonで書くようにする
- 忙しくならないように調整
1人で見れる範囲は限界がある
忙しくならないようにしている
- DroidKaigiの前はセッション準備で忙しいので仕事を入れないようにしている
質問
5~10年後
- 後輩を育成していく
- 指導は逆算で考えてアドバイスしていく
- 勉強やキャリアに積極的ではなくて、会社や世の中からの求められているところを狙っていく
優秀なエンジニア
- 手が早くて、実際にやってみる人は伸びる
- 表面的に動くものだけではなくて、多面的に考慮して設計や実装ができる人、考えられる人
- コミュニケーション能力が高い、自分で閉じてなく。人とのつながりが意識的な人
- パソコンに向き合うのが苦にならない人、仕事って意識がない人、他の人の何倍も向き合っている人
副業の見つけ方、やってみてよかった
- リファラル
- 簿記を知らないといけないので、学べるきっかけになった
- 知り合いから仕事がもらえることがある
- 仕事がない時は勉強していた
Flutterについて
- FlutterKaigiのブースがあるので、ブースで聞くがいい
Androidエンジニアの友達を作るには
- DroidKaigiがまさにその場
- 懇親会
- 勉強会
- Xで発信して、カンファレンスで繋がっている人と実際に合う
- 勉強会で登壇する
バックエンドを学ぶべきか
- 組み込みや統計もしてきたので、いろんなことをすると役にたつ
- 一般的な知識として学んで行った方がいい
- アプリから先でなにが起きているのかを把握する
Jetpack Compose Modifier徹底解説 | DroidKaigi 2024
Action
- Clickable
- Draggable
- selectable
- combinedClickable 長押しやダブルクリックなど複数のクリックアクションを定義できる
- Draggable2D 水平、垂直どちらにもドラッグ可能
- triStateToggleable 不確定もふくめたToggle
Alignment
- alignByBaseline
Drawing
- clipToBounds 子がはみ出さないように切り取る
- drawBehind drawLineで描画可能
Padding
- paddingFromBaseline ベースラインからパディングする
Pointer
- pointerInput
Semantics
- semantics
- clearAndSetSemantics 自身と小要素のセマンティクスをクリアして、セットする
- progressSemantics プログレスの進行状況を伝える
Size
- defaultMinSize 他のサイズがなく、親からもサイズの制約がない場合に有効
- animatedContentSize コンテンツのサイズを変更するときにアニメーションさせる
Test
- testTag
Transformation
- rotate
- scale
- transformable ユーザーの操作に応じて変更できる
その他
- basicMarquee 文字が収まらない時にマーキーアニメーションさせる
- blur
- hoverable マウスのホバーを定義
- magnifier 虫眼鏡ぽい、拡大鏡
- (WearOS) placeholder
- (WearOS) placeholderShimmer
仕組みから理解する!Composeプレビューを様々なバリエーションでスクリーンショットテストしよう | DroidKaigi 2024
テスト種類
- ScreenShotTest
- アプリの画面をスクリーンショット
- VRT
- 差分を表示する
ツール
Previewを集まるツール
- Showkase Showkaseが集めたPreviewを取得する関数がある
- Composable Preview Scanner Previewとメタデータに特化したツール Previewのプロパティ全てが取得できる
集めたPreviewのスクリーンショットを撮影する
以下全てが必要 1. ComposeTestRule 1. Robolectric 1. Roborazzi
Showkase
- file名はユニークにする
- LocalInspectionMode = true
- Android Studioでは常にtrue
BuildScriptの設定だけ 自動生成されたクラスを使う
さまざまな設定でテストする
- 全部同じ設定でスクリーンショットを撮りたい
カスタムプレビューアノテーションを使う
ComposePreviewScanner
Compose
- CompositionLocal
- Robolectric
- Configuration
- ComposeTestRule
- Configuration
ComposePreviewTester
VRT
- 比較する
- validate
Day2
Welcome Talk
アプリをリリースできる状態に保ったまま段階的にリファクタリングするための戦略と戦術 | DroidKaigi 2024
なぜリファクタしたい
- ライブラリが古いので変えたい
- 使いたいライブラリがある
- 何かを改善したいと思っているから
我々は何を解決したいのか
- ”わかりにくさ”を改善したい
わかりにくいとは
- 前提知識が使えない
- 一般的な知識
- 英単語の意味
- 命名から中身を想像する
- Android特有のもの
- 以前のプロジェクトの知識
- 公式が推奨するアーキテクチャにつながる
- プロジェクト固有の知識
前提知識の限界
- 一度に把握するものの数を減らす
- グループ化
- モジュール化
- 人間の把握できる限界は7個
- モジュールの数は7個
- さらにグループ化
- 無闇にモジュールを増やさないために
- ビルド改善
- カプセル化
- 依存関係の強制
- これらのメリットがないならモジュール化する意味はない
リファクタをどう進めるか
- 環境整える
- 順番を吟味して、末端から行う
- いつでも中断できるようにする
環境整える
お勧めしない方法 - モジュールは必要になったら追加する
順番
- アプリをいつでもリリースできる状態でリファクタする
- 変更箇所でデグレしていないかが重要
- A > B でAをリファクタしたいのに、Bに依存しているからBからテスト書かないといけなくなる
Bが末端になる
サーバーと通信 > 上流の末端
- UI > 下流の末端
Gradleを上げたい場合
7.xの場合 7.4.1に上げてから8系にあげる
Lint
- 設定で対象外を定義する
- 既存のコードで大量にエラーがでないようにする
- CIでチェックする
データ
- サーバーから来るレスポンス、ApiServiceはinternalにする
- coreモジュールに定義しているモデルに変換する
Kotlin化
- おおきいファイルはKotlin化しない
- ~ 300lines
- インナークラスをstacic化する
Compose化
- AbstractComposeViewを継承したカスタムViewを作る
- Composeを用意して↑にsetsuru
RecyclerView
- 各アイテムを先にCompose化する
全体をLazyにする
ViewHolder単位で行う
- ViewHolderを先にリファクタする
- bindメソッドを用意する
Jetpack ComposeにおけるShared Element Transitionsの実例と導入方法 またその仕組み | DroidKaigi 2024
設定
- debuggable は falseにしないと、遷移時に画面がガクガクする
Modifier
- Modifier.sharedElement
- SharedTransitionLayout内でしてか呼べない
- 遷移の前後を括る必要がある
- stateのkeyは遷移前後で同じものを渡す必要がある
- animatedVisibilityScope
- 3つの方法
- AnimatedVisibility
- AnimatedContent
- NavigationCompose
- this@composable
sharedElement / sharedBounds
sharedElement
- 遷移前後で全く同じものを使う
- 遷移後のものを描画してからアニメーションする
sharedBounds
- 遷移前後で見た目が異なるものを使う
- 遷移前後どちらも描画しつつアニメーションする
SharedTransionLayout
setContentやNavHostの前で呼ぶ
引数渡し
- ComposionLocal
- 上書き可能なので思わないバグをうむデメリット
- クラッシュするが、これがおすすめ
- context reciever - バージョンによって安定しない
SharedContentState
- data class, sealed classで指定するのがいい
他のジェスチャーとのコンフリクト
- LocalSharedElement.current.isAcitive
- 遷移前後で対象物がないとアニメーションが発生しない
分析に裏打ちされたアプリウィジェット開発 - Jetpack Glanceとともに | DroidKaigi 2024
動機
- 最近、ウィジェット周りの動向がある
- Android12でウィジェット周りに追加点がある
Glanceの登場
ユーザーエンゲージメントの向上
- ユーザーの気を引く情報を配置、アプリの利用頻度の向上
- Duoringoの事例
- 優先度バケット
分析と施策
- UIやレイアウトの変更によって、ウィジェットの設置率や利用率が変わる
- 小さい端末で利用している場合、アプリのアップデートしてない人が一定数いる可能性
- ウィジェットの設置数を指標にした
- 検索を利用しているユーザーがエンゲージメントが高いので、検索のウィジェットを作成
- アプリの設定画面にウィジェットの設置する動線を配置
実装Tips
- codelab
- composeとは異なるGlance の Comsepableを使用する
- Modifierの関数が少ない
- 書き順の適応もComposeとは異なる
- OS差分
- dyanmic color
- 角丸
- GlansModifier.cornerRadius
- Android12以上
- Android11以下ではワーニングが出るので、分岐する
- Widget Picker
- title
- description
- Preview
- 画像での指定 all
- xml >= 12
- generated preview >=15
2024年最新版!Android開発で役立つ生成AI徹底比較 | DroidKaigi 2024
- Gemini,8月にGeminisというチャットも生成できるようになった
導入時の注意点
セキュリティ
- 機密除法、個人情報を入力しない
- オプトアウトする
- Gemini オフでも72時間保持される
- 提案コードの脆弱性
- Copilot Autofixで脆弱性を自動修正、チェック
ライセンス侵害
- Copilot Autofixで脆弱性を自動修正、チェック
- 設定でBlockedにする
- 利用規約の確認をする
活用方法
- 開いているファイルの情報を取得するので、ファイルを全部開いておく
- copilot chat /test でテストコード書いてくれる
- colilot chat で細かい指定ができる
- コードレビュー
- ペルソナ化する
- copilot の公式のベストプラクティスとして紹介されている
- kdocはcopilot chatで日本語で書くように指示すると書いてくれる
使って知るCustomLayout. vs DailyScheduler | DroidKaigi 2024
https://sasasaiki.github.io/slidev_droidkaigi2024/1
CustomLayoutとは
今セッションではComposeのライフサイクルのLayoutフェーズを独自実装する
方法
- Layout
- 要素をレイアウトできる
- 複数の要素をレイアウトできる
- 親を参照できる
- modifier.layout
- 単一の要素をレイアウトできる
- SubcomposeLayout
- Layout + レイアウトフェーズでコンテンツそのものを変えることもできる
BoxWithConstraint
- 親の制約参照できる
time label
- ParentDataModifier
- 親に渡したいデータを送れる
Lazy
Debugging: All You Need to Know | DroidKaigi 2024
モチベ
- 27%はコードを書く
- 40~60%はデバッグ
デバッグとは
- 不具合修正のみではなく、コードが動くか試すこともデバッグ
プリントデバッグ
- 自分たちが触れないとできない
- 信頼値か
- 試しやすいが、思うより時間をかけてしまう
別の手札を増やすべき
- frames
- メソッド呼び出しの列
ブレークポイント
- サードパーティライブラリの実行も追える
- Android Frameworkも追える
Method ブレークポイント
- 呼び出し、終了時に呼び出せる
Field ウォッチポイント
- フィールドの読み書きも検知できる
Watch Variables / Watch Expression
Variable Modification
- 値を書き換える
Force Return
- 強制的に値を返すことができる
ブレークポイントの設定
ロギング
- ブレークポイント通過したらメッセージを表示
- stack trace
条件付きブレークポイント
- Expression
- trueの時だけ
- Pass count
- 通過回数になるまで動かない
- N回目で見たい時、2回目以上で通過しない処理の検知
- depandency
- 複数のブレークポイントの依存で絞り込める
こんかれっしょん
マルチスレッド
- 特定のスレッドで止める
- 並列計算のチェック
Coroutine
- debbable on にして、coroutineNameをつけると
- coroutineにユニークな名前をつけることができる
- coroutineの値が見れない時は
- 最適化をはずす -Xdebug
- デバッグの時のみにする
Compose
- パフォーマンスチューニング
- layout inspectorでレコンポーズ回数
- pass count でステートをチェックする
アタッチ
- デベロッパーオプション (端末側)
- 起動時にデバッガー状態にする
- 待機状態になる
- コードでピンポイントで止めたい時
- Debug.waitForDebugger()
他のプラットフォーム
- Flutterではrelease flavorではデバッガブルはonにできない
- JVMであればできる
Android開発以外のAndroid開発経験の活かしどころ | DroidKaigi 2024
開発
- 手を挙げる
- AndroidもiOSも両方やる
- 設計知識
- DDD, アーキテクチャの話がサーバサイドでも活きている
- ユニットテスト
- JUnitの考え方が基本的な部分は変わらない
- Androidでいうアレ
- 基準として他の技術のキャッチアップがしやすくなる
- ORMの技術選定
- クエリをコードに自動生成するアプローチが筋いいかも
- codelabによるキャッチアップ
- 手を動かしながら作るのが一番早い
- backend master class
- 他分野を広く浅くやってみるといい
マネジメント
- 他チームとのコミュニケーション
- 画面実装が多い分、デザイナーやCSとのやりとりが多い
- 開発のリードした経験、意思決定してきた経験はマネジメントに活かせた
- 小さいことでもいいので、エンジニアとしての意思決定をしていく
- 実感としてはない
- マネジメントに活かせることは、マネジメントを勉強、経験するしかない
- プレイヤーをやりながらざっくりキャッチアップして擬似体験していく
- HIGH OUTPUT MANAGEMENT(おすすめ)
DroidKaigiでコミュニティとの関わり方
Android開発に集中して大丈夫
- 1つ自信のある領域をもっておくと楽
ブース
HONDA さん
- バイクについて色々聞いた
- eクラッチの話をしたら「まさかDroidKaigiでeクラッチのワードが出るとは」と驚いていただいた
- なぜHONDAさんがDroidKaigiに出展しているのか聞いたら、バイクからナビゲーションシステムを動作させたりできるようになっているらしい
- 車にもすごい機能を搭載しているらしくその母体がAndroidとのこと(ざっくり理解)
FlutterKaigi さん
- FlutterKaigiとしてブース出てるのと、最近Flutter入門したので聞いてみた
- 11月に有明で開催らしく、チケット販売時にお得になるクーポンゲット
FULLER さん
- おみくじ引いて凶だったけど、ハッピータンいただけた
ROLLCAKE さん
- 体験設計書を元に進める開発体験について聞いた
- 体験設計書は誰でも提案できるものらしい
- 体験設計書に基づいてプロダクトを開発するので、ぶれることがないのが利点とのこと
転職ドラフト さん
- 2019年を境に前後で転職ドラフト上での年収やオファー率の変化を見れた
- 業界全体で年収は60万ほどあがっていて、サーバーサイドが高め
- 転職ドラフトでエンジニアを探す企業側の特性にもよる
- 転職ドラフトにモバイル系のエンジニアが少なめ
Sansan さん
- KMP導入したばかりとのことで、導入までの経緯や導入の進め方について話を聞いた
- OS差分がネックになっていたらしく、差分解消されることで20%ほど生産性が向上することを試算して導入にいたる
- iOSエンジニアに対しても、ペアプロやAndroidエンジニアからのサポートもあり導入していけた
会場の様子
After Party
自社ブースにも立った
転職してZOZO所属になったので、セッションの合間時間でZOZOブースにも立ちました。
- 自社アプリのファッション診断などを案内して、結構みなさんしてくれてうれしい
- せっかくなのでファッションの困りごととかも聞けばよかったかな~?と思ったものの、エンジニア技術イベントなのでちょっと自粛した
- 「アプリ入れてます!」「iOSDCでやりました」的なことも言ってくれる人もいて認知度強いなあと謎の感想を持った