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
タップルでComposeの段階的な導入を進めている話
Search
Yamashita Shun
August 19, 2022
Programming
0
910
タップルでComposeの段階的な導入を進めている話
Yamashita Shun
August 19, 2022
Tweet
Share
Other Decks in Programming
See All in Programming
AtCoder Conference 2025
shindannin
0
800
Patterns of Patterns
denyspoltorak
0
390
愛される翻訳の秘訣
kishikawakatsumi
3
350
안드로이드 9년차 개발자, 프론트엔드 주니어로 커리어 리셋하기
maryang
1
140
re:Invent 2025 のイケてるサービスを紹介する
maroon1st
0
150
Grafana:建立系統全知視角的捷徑
blueswen
0
250
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
460
AIエージェントの設計で注意するべきポイント6選
har1101
6
2.7k
[AtCoder Conference 2025] LLMを使った業務AHCの上⼿な解き⽅
terryu16
6
920
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
600
SwiftUIで本格音ゲー実装してみた
hypebeans
0
520
Context is King? 〜Verifiability時代とコンテキスト設計 / Beyond "Context is King"
rkaga
10
1.5k
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.9k
Paper Plane (Part 1)
katiecoart
PRO
0
2.3k
Facilitating Awesome Meetings
lara
57
6.7k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
130
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.7k
Statistics for Hackers
jakevdp
799
230k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
2.8k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.5k
Transcript
タップルでComposeの 段階的な導入を進めている話 CA.aab #1 2022 / 08 / 16 株式会社タップル
/ 山下俊 / やましゅん
サクッと自己紹介 ・ 山下俊 / やましゅん ・ 2022/04 株式会社サイバーエージェント新卒入社 ・ Android
エンジニア @タップル ・ Flutterも好き
今日話すこと タップルでComposeを導入した際の 流れや取り組み、課題について
目次 " Composeをプロダクトに導入するまで 2. Activityの中身をComposeリプレイス 3. リストのアイテムをComposeリプレイス 4. チームでの取り組み 5.
感想
Composeをプロダクトに導入するまで
デバッグメニューで技術検証 ・Composeのバージョンがalphaだったため ユーザーに露出しないデバッグメニュー画面でお試し ・リップルエフェクトがうまく動かない ・xmlで定義されているリソースを Composeで扱えるようにしなければいけない 検証で見つかった課題など
テーマのマイグレーション xmlで定義されていたstyleをComposeで再構築 ・カラー / color.xml ・フォント / text_appearance.xml ・ボタン /
style_button.xml TappleTheme TappleThemeに統合することで が使える IDEの補完機能
・マテリアルデザインは採用していない ・共通の を実装 TappleColorPalette ・ を見据えた実装 ダークモード ・compose.materialのカラーロールは使用しない ダーク /
ライトテーマ共通のカラーパレットを定義 カラー
フォント ・既存のxml定義から簡単にComposeに変更できるように @style/TextAppearance.Size14.Bold.Large TappleTheme.typography.size14BoldLarge ・ を実装しTappleThemeに統合 TappleTypography
ボタン ・ を定義しTappleThemeに統合 ButtonStyle カラー、サイズ、フォント、リップルエフェクトを TappleThemeで定義 ・ を意識したカスタム性のあるボタン スロットベース ・フォントサイズも
で定義 ButtonStyle
Activityの中身をComposeにリプレイス
・ネットワーク通信 ・エラーハンドリング ・ページング処理(無限スクロール) 簡単な画面をComposeでリプレイス Activityの中身をComposeに移行
・カスタムビューは作らずにrememberLazyListState( )を拡張した を実装し を持たせる rememberInfiniteScrollList( ) 拡張性 ・Composeは簡単にカスタムビューを作ることができるので、 拡張性や保守性を維持するために無作為にカスタムビューを作らない ページング処理(無限スクロール)
最初はDroidkaigiを参考にflowを使って として イベント/エラーを処理するパターンも考えた one-shotなeffect イベント/エラー処理について stateの設計
公式ドキュメントで紹介されていたstateにイベント/エラーを持たせる設計を採用 ・ をもつアプリを実装しやすい KMMでstateを共通化したiosと同じ挙動 ・ライフサイクルを意識せずにイベント/エラー処理ができる ・イベント/エラーを含めて画面の状態を復元できる ・ の原則に従う single source
of truth エラー stateの値を見てエラーハンドリング イベント https://developer.android.com/jetpack/guide/ui-layer?hl=ja#consume-ui-state ※一部略
リストのアイテムをComposeでリプレイス
最終的には画面のフルComposeを見据えて、Groupieの各Itemをリプレイス xml Compose xml Compose Compose xml RecyclerView
・ しやすい 作業分担 ・MVVMを採用している場合、stateは既存のまま変更せず 可能 UIだけリプレイス ・画面全体のリプレイスに比較して実装コストが低く、デグレも発生しづらい メリット
パフォーマンス低下問題 ・画面の描画時間(リストのレンダリング時間) ・スクロールパフォーマンス ・アニメーションがカクつく GroupieのアイテムをComposeにしたところ してしまった... パフォーマンスが低下 補足 : フルComposeにすればxmlと同程度のパフォーマンスが見込める
レンダリング時間 / スクロールパフォーマンス低下の原因 ・AndroidViewの中にComposeを埋め込む際にComposeラッパーや recomposerの 。 (ensureCompositionCreated( )など) 初期化関数がたくさん実行される ※
基本的にAndroidViewの中にComposeを埋め込む場合、 レンダリングパフォーマンスはxmlよりも低下する ・Groupieが毎回Composeを初期化するのでうまくviewをリサイクルできていない
レンダリングパフォーマンス Android Profilerでリリースビルドにてデバッグ RecyclerViewの描画にかかった時間 Composeをxmlに 埋め込むために必要な処理 xmlと比較して+500ms ※一部略
スクロールパフォーマンス 開発者メニューのCPU利用率可視化でリリースビルドにてデバッグ ・明らかにCompose + xmlの方が CPU利用率が高くなっている AndroidViewのみの場合 Composeを利用した場合
解決策 ・Splash画面でComposeのsetContentを呼び出し、 させておく 初期化関数をプリロード 補足 : 初期化するタイミングはComposeを導入する画面が 表示される前であればどこでも良い ・PoolingContainerを使ってcompositionを破棄しないでスクロールさせる (RecyclerView:
1.3.0-alpha02 以上かつ compose.ui: 1.2.0-beta02 以上が必要) viewCompositionStrategy: DisposeOnDetachedFromWindowOrReleasedFromPool
AndroidViewのみの場合 AFTER (スプラッシュでプリロード) BEFORE (Compose + xml) Composeを利用した場合 結果 ・画面の起動時間は
xmlと比較して-80ms ・リプレイス前と ほぼ同等の起動時間 ・スクロールも ほぼ同等のCPU使用率
アニメーションがカクつく原因 ・LayoutInspectorのRecomposition Countを 使ってデバッグ&調査 ・アニメーションを実行した際に、 データ変更によるrecompositionも実行されるとカクつく ・ てカクついていた recompositionの回数が多すぎ https://developer.android.com/jetpack/compose/tooling
解決策 ・ を使うことでアニメーション中に発生していた データ更新によるrecompositionの回数を減らすことで解決 @Stable 補足 : タップルではComposeの 、
ただしアニメーション周りではrecompositionの問題が発生しやすい 開発中にrecompositionは意識せず 問題が発生したらデバッグして対応するという方針
チームでの取り組み
・Composeを導入すべき理由やメリデメについてチームで認識をそろえた上で導入を進めた ・作業分担することでチームメンバーがComposeに触れる機会を積極的に作った 社内勉強会にて ・導入の最初は、 リプレイスの一例を作った上でチームメンバーに展開した 少人数で進め迅速にComposeの基盤を作り上げ チームでの取り組み
今後の課題 ・RecyclerViewの計測ログの移行 ・xmlで作成されているカスタムビューをComposeに移行する ・コーディング規約の策定 ・Figma x Compose によるコンポーネント自動生成 ・画面全体をリプレイスするComposeマラソンなどの取り組み
感想
良かったところ ・UIに集中できるためリストのitemごとにComposeリプレイスがおすすめ ・画面状態が複雑な画面でもUIを構築しやすい ・アニメーションを直感的に記述できる
大変だったところ ・アニメーションを入れると@Stableを意識しなければならなくなる場面が多い ・recomposition起因のバグはレビューで気づきにくい ・xmlの一部をComposeにする場合はパフォーマンスが少し不安
Thankyou