Slide 1

Slide 1 text

Jetpack Composeを 本番導入してみた結果と課題 pixiv App Night pixiv Inc. makun / 齊藤 2022.10.27

Slide 2

Slide 2 text

2 概要 ● 「パルシィ」にCompose導入をした ● 導入は今年(2022年)5月から ● 既存のAndroidViewを徐々に置き換えた ● 6ヶ月間での課題とその対応のいちぶを紹介

Slide 3

Slide 3 text

パルシィとは

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

5 makun wcaokaze akira

Slide 6

Slide 6 text

6 Compose 導入の理由 ● 単純にメリットが大きい ● ラージスクリーンやフォルダブルの対応 ● 導入を進め開発経験と基盤を整える ● 気持ち

Slide 7

Slide 7 text

課題①

Slide 8

Slide 8 text

8 うちらのComposable、
 パフォーマンス悪くね?


Slide 9

Slide 9 text

@Composable fun ComicLineItem( comic: Comic, onItemClick: () -> Unit = {}, ..., ) {...} Composableの例 9

Slide 10

Slide 10 text

data class Comic( val id: String, val title: String, val summary: String, val authors: List, val imageUrl: String, ..., ) 受け取っているデータの例 10 Composableの引数にしたとき、 必要のない再コンポーズが 起こるようになる List やその中身が Immutableではない

Slide 11

Slide 11 text

@Immutable data class Comic( val id: String, val title: String, val summary: String, val authors: List, val imageUrl: String, ..., ) 11 @Immutable を宣言することで、Compose Compilerが安定したクラスと 判断できる 全てのデータで @Immutable を宣言すれ ば良さそう? 良くない

Slide 12

Slide 12 text

@Immutable data class Comic( val id: String, val title: String, val summary: String, val authors: List, val imageUrl: String, ..., ) 12 MutableList の可能性があり 運用を間違えると壊れる Kotlin でいう「 !! 」と同じ

Slide 13

Slide 13 text

data class Comic( val id: String, val title: String, val summary: String, val authors: ImmutableList, val imageUrl: String, ..., ) 13 Kotlin / kotlinx.collections.immutable を利用し ImmutableList を定義ができる 安定化の強制が可能

Slide 14

Slide 14 text

data class Comic( val id: String, val title: String, val summary: String, val authors: ImmutableList, val imageUrl: String, ..., ) 14 クラスの利用先も ImmutableList に依存 Composeとは無関係のモジュールも Composeに依存してしまう

Slide 15

Slide 15 text

15 Model Tracker Compose Feature Compose Common Repository Compose 依存

Slide 16

Slide 16 text

とにかく依存が増える、なので

Slide 17

Slide 17 text

17 Composableごとに
 「必要なデータのみ」を受け取る


Slide 18

Slide 18 text

@Composable fun ComicLineItem( comicId: String, comicTitle: String, comicImageUrl: String, comicSummary: String, onItemClick: (...) -> Unit = {}, ..., ) {...} ComicLineItemの例 18 必要なデータのみを Immutable な値として 受け取るようにする 引数が多く扱いにくくなる

Slide 19

Slide 19 text

data class ComicLineModel( val comicId: String, val comicTitle: String, val comicImageUrl: String, val comicSummary: String, ..., ) { constructor(comic: Comic) : this(...) } ComicLineItem用のModelを定義 19

Slide 20

Slide 20 text

20 Model Tracker Compose Feature Compose Common Repository Compose 依存

Slide 21

Slide 21 text

21 Model Tracker Compose Feature Compose Common Repository Compose 依存 Viewに関心のあるモジュー ルだけがComposeに依存

Slide 22

Slide 22 text

22 課題①まとめ Composableごとに必要なデータのみを受け取るように することで、Composableが安定し、Composeに依存す るモジュールをViewに関心のあるものだけにできた。

Slide 23

Slide 23 text

課題②

Slide 24

Slide 24 text

24 機能開発、遅れてね?


Slide 25

Slide 25 text

開発のおおまかな流れ 25 リ リ l ス 仕 様 決 定 実 装 検 証

Slide 26

Slide 26 text

Compose導入後の開発の流れ 26 リ リ l ス 仕 様 決 定 コ ン ポ l ズ 対 応 コ ン ポ l ズ 検 証 実 装 検 証 実装の前に、コンポーズ化する流れ

Slide 27

Slide 27 text

実装対象の画面を先にCompose導入して しまえば、実装も楽になるのでは?

Slide 28

Slide 28 text

28 そんなことない


Slide 29

Slide 29 text

あきらかにやること増えてる 29 リ リ l ス 仕 様 決 定 コ ン ポ l ズ 対 応 コ ン ポ l ズ 検 証 実 装 検 証 実装と検証が大変

Slide 30

Slide 30 text

Compose導入は最優先ではない、なので

Slide 31

Slide 31 text

31 Composeの対応は「2番手」


Slide 32

Slide 32 text

32 機能実装と検証を最優先しよう


Slide 33

Slide 33 text

リリースを分割する 33 リリース 仕様決定 実装 検証 リリース 観察 Compose 対応 Compose 検証 機能開発 の流れ Compose 化の流れ

Slide 34

Slide 34 text

34 課題②まとめ Compose対応を機能開発のリリースとは別に行うこと で、余裕をもった機能開発を行うことができ、より 安定し た機能をユーザーに届けることができる ようになった

Slide 35

Slide 35 text

すんなりいかなかったこと

Slide 36

Slide 36 text

36 HTMLを利用したText


Slide 37

Slide 37 text

val text = “Hello, world!!” // AndroidViewではHTMLが利用できた val textView = TextView(context) textView.text = text // ComposeではHTMLが利用できない Text(text = text) HTMLを利用したText 37

Slide 38

Slide 38 text

38 HTMLをTextで利用する ● 世の中では自作してるヒトも多い ● joen93/compose-html-text を利用 ● 公式実装まで待機

Slide 39

Slide 39 text

39 縁取りしたText


Slide 40

Slide 40 text

40

Slide 41

Slide 41 text

41 縁取りしたTextの実現 ● 今ままでは自作のTextViewを利用 ● Composeでの実装方法がわからん ● 自作したTextViewを再利用(AndroidView)

Slide 42

Slide 42 text

42 まとめ ● 「必要なデータ」のみを受け取る ● Composeの対応は「2番手」 ● 機能開発と検証を優先しよう