Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
[Jetpack Compose] 原理から見るSkippable対応
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Swimmy
January 18, 2024
Programming
370
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
[Jetpack Compose] 原理から見るSkippable対応
Swimmy
January 18, 2024
More Decks by Swimmy
See All by Swimmy
Android16 Migration Stories ~Building a Pattern for Android OS upgrades~
reoandroider
0
250
違いがワカルKotlinプログラマーへの道
reoandroider
0
170
違いのワカル Kotlinプログラマーへの道
reoandroider
0
270
Androdアプリ開発におけるネストスクロール問題と向き合うの説明用途
reoandroider
0
3.4k
Androdアプリ開発におけるネストスクロール問題と向き合うの説明用途
reoandroider
0
3.2k
Androdアプリ開発におけるネストスクロール問題と向き合うの説明用途~NestedScrollInteropConnectionは何してるの?編~
reoandroider
0
2.9k
Roborazziを最大限に活用する(導入編)
reoandroider
0
360
Master of NestedScroll
reoandroider
0
16k
Jetpack_Composeで_半円のプログレスバーを作った話
reoandroider
0
470
Other Decks in Programming
See All in Programming
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.6k
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
440
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
920
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
240
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
170
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
200
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
200
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
190
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
660
自作OSでスライド発表する
uyuki234
1
3.9k
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
150
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
170
Featured
See All Featured
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
350
The Cult of Friendly URLs
andyhume
79
7k
Designing Powerful Visuals for Engaging Learning
tmiket
1
460
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1k
30 Presentation Tips
portentint
PRO
1
350
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
660
Scaling GitHub
holman
464
140k
GitHub's CSS Performance
jonrohan
1033
470k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
390
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
The SEO identity crisis: Don't let AI make you average
varn
0
520
Transcript
Harada Reo @ すいみー 2024/1/18 LT新年会 [Jetpack Compose] 原理から見るSkippable対応
すいみー CyberAgent Inc. Ameba どすこい塾 DroidKaigi Staff RunningReo 自己紹介 /
Introduction
このLTのゴール Composeフレームワークが 開発者に対して与える 恩恵を把握する
理想状態 Skippable対応をどこまで やるべきかの基準を 持てるようになる
Skippableとは? Composeのレンダリング段階は3つあるが パフォーマンス向上のため更新時に 飛ばす(skipする)工夫ができる Skippableとは?
話さないこと 細かいSkippable対応の tipsは特に話しません ※以下の赤い部分を話します
Composeフレームワークが やってくれること
Composeのフレームワークがやってくれること @Composable fun Title() { Column(modifier = Modifier.fillMaxWidth()) { Text(“Hello
World”) Button(onClick = { ... }) } }
Composeのフレームワークがやってくれること 普通の関数との違い ・何度も再実行可能である ・Skippableである ・リアクティブである
Composeのフレームワークがやってくれること 普通の関数との違い ・何度も再実行可能である ・Skippableである ・リアクティブである
Composeのフレームワークがやってくれること Compose Compilerは Stateを読み込むComposable関数を検出して それをCompose Runtimeに伝える 逆にStateを読み込まないComposable関数は Compose Runtimeに伝えない
Composeのフレームワークがやってくれること Compose Compilerは Stateを読み込むComposable関数を検出して それをCompose Runtimeに伝える 逆にStateを読み込まないComposable関数は Compose Runtimeに伝えない Compose
Compiler = Kotlin CompilerのPlugin
Composeのフレームワークがやってくれること Compose Compilerは Stateを読み込むComposable関数を検出して それをCompose Runtimeに伝える 逆にStateを読み込まないComposable関数は Compose Runtimeに伝えない Compose
Runtimeってなに?
Composeのフレームワークがやってくれること その前に・・・
Composeのフレームワークがやってくれること @Composable fun Title() { Column(modifier = Modifier.fillMaxWidth()) { Text(“Hello
World”) Button(onClick = { ... }) } }
Composeのフレームワークがやってくれること 普段書いているComposable関数ですが 実は見えない引数がコンパイル時に合成されている
Composeのフレームワークがやってくれること @Composable fun Title($composer: Composer<*>) { Column(modifier = Modifier.fillMaxWidth(), $composer)
{ Text(“Hello World”, $composer) Button(onClick = { ... }, $composer) } }
Composeのフレームワークがやってくれること @Composable fun Title($composer: Composer<*>) { Column(modifier = Modifier.fillMaxWidth(), $composer)
{ Text(“Hello World”, $composer) Button(onClick = { ... }, $composer) } } すべてのcomposable関数にcomposerが渡される ツリー構造をcompose runtimeに伝える
Composeのフレームワークがやってくれること @Composable fun Title($composer: Composer<*>) { Column(modifier = Modifier.fillMaxWidth(), $composer)
{ Text(“Hello World”, $composer) Button(onClick = { ... }, $composer) } } すべてのcomposable関数にcomposerが渡される ツリー構造をcompose runtimeに伝える コードを自由に書き換えられるのはKotlinの恩恵! Javaでこのような柔軟な言語プラグインを作るのが難しい
Composeのフレームワークがやってくれること @Composable fun Title($composer: Composer<*>) { Column(modifier = Modifier.fillMaxWidth(), $composer)
{ Text(“Hello World”, $composer) Button(onClick = { ... }, $composer) } } すべてのcomposable関数にcomposerが渡される ツリー構造をcompose runtimeに伝える コードを自由に書き換えられるのはKotlinの恩恵! Javaでこのような柔軟な言語プラグインを作るのが難しい Compose Runtimeってなに?(再び)
Composeのフレームワークがやってくれること ツリー構造をメモリ配列で見てみる
@Composable fun Title($composer: Composer<*>) { $composer.start(123) Column(modifier = Modifier.fillMaxWidth(), $composer)
{ Text(“Hello World”, $composer) Button(onClick = { ... }, $composer) } $composer.end() } Composeのフレームワークがやってくれること
Composeのフレームワークがやってくれること Composable関数はUIの実体を返すわけではく Compose Runtimeを通じて メモリ内のツリー構造を構築したり 更新したりするので 高速なレンダリングが可能になっている
Composeのフレームワークがやってくれること Compose Runtimeは Composable関数のコードとSlot Tableを繋げる Interfaceのようなものでありそう メモリ内にDataのツリー構造を作っている 仕組みは素晴らしい!
Composeのフレームワークがやってくれること Composeフレームワークは Kotlinのオブジェクト指向に 関数型の概念を加える
Composeのフレームワークがやってくれること 関数型の特徴として 関数名・型・引数によって一意のkeyを生成する 関数の返り値をキャッシュすることができる 先ほどのSlot Tableの例から分かるように Composeフレームワークはソース内の 位置関係をキャッシュすることで どのような依存関係があるのかを明確にしている
振り返り
このLTのゴール Composeフレームワークが 開発者に対して与える 恩恵を把握する
このLTのゴール Composeフレームワークが 開発者に対して与える 恩恵を把握する 難しかった・・・
振り返り Compose内部の仕組みは難しく これだけでComposeのフレームワークの 恩恵を把握したというには早計・・・
振り返り とはいえ、原理からComposeを見ると Skippable対応が自然と実践できたり 今までの取り組みが腑に落ちることがある
「Jetpack Compose internals」 https://jorgecastillo.dev/book/ 「Under the hood of Jetpack Compose
— part 2 of 2」 https://medium.com/androiddevelopers/under-the-hood-of-jetpack- compose-part-2-of-2-37b2c20c6cdd 「KotlinConf 2019: Leland Richardson が解き明かす Compose ランタイム」 https://www.youtube.com/watch?v=6BRlI5zfCCk&t=153s 「Thinking in Compose」 https://developer.android.com/jetpack/compose/mental-model?hl=ja 参考資料
「Jetpack Compose internals」 https://jorgecastillo.dev/book/ 「Under the hood of Jetpack Compose
— part 2 of 2」 https://medium.com/androiddevelopers/under-the-hood-of-jetpack- compose-part-2-of-2-37b2c20c6cdd 「KotlinConf 2019: Leland Richardson が解き明かす Compose ランタイム」 https://www.youtube.com/watch?v=6BRlI5zfCCk&t=153s 「Thinking in Compose」 https://developer.android.com/jetpack/compose/mental-model?hl=ja 参考資料 誰か一緒に輪読会しませんか?
本年も よろしくお願いします