Slide 1

Slide 1 text

© 2023 Wantedly, Inc. Data Bindingの 移行を楽にする モバイル勉強会#12 2023/12/19 久保出雅俊

Slide 2

Slide 2 text

© 2023 Wantedly, Inc. wantedly.com/id/kubode © 2023 Wantedly, Inc. X: @swiz_ard GitHub: @kubode

Slide 3

Slide 3 text

© 2023 Wantedly, Inc. Data Binding移行終わった人 🙋

Slide 4

Slide 4 text

© 2023 Wantedly, Inc. なお弊社 😇

Slide 5

Slide 5 text

© 2023 Wantedly, Inc. 移行を楽にする話

Slide 6

Slide 6 text

© 2023 Wantedly, Inc. はじめに

Slide 7

Slide 7 text

© 2023 Wantedly, Inc. Data Bindingとは ● Android公式のライブラリ ● XMLにデータのバインディング処理を記述できる ● 2015年リリース ○ 導入事例は多い認識 ● 現在はメンテナンスモード ○ Composeへの移行を推奨

Slide 8

Slide 8 text

© 2023 Wantedly, Inc. なぜ移行する? ● 公式にKSPに移行しない表明 ● KAPT依存しつづける ○ ビルド時間に影響 ○ K2 Compilerに移行できない原因(K2側で解消しつつある)

Slide 9

Slide 9 text

© 2023 Wantedly, Inc. 移行先 ● Compose ○ 公式が推奨する移行先 ○ UI作り直しになるため移行コストが高い ● View Binding ○ Data Bindingから移行しやすいインターフェース ○ バインディング処理の再実装は必要

Slide 10

Slide 10 text

© 2023 Wantedly, Inc. View Binding ● Data Bindingと同じ点 ○ 生成されるクラス名とパッケージ名 ○ findViewById/requireViewById不要 ● 異なる点 ○ バインディング処理はXMLじゃなくてJava/Kotlinで ○ BindingAdapterなどもなし

Slide 11

Slide 11 text

© 2023 Wantedly, Inc. View Bindingへの移行

Slide 12

Slide 12 text

© 2023 Wantedly, Inc. 手作業での移行 ● まずは1つのXMLを移行してみた ○ バインディングしてる箇所を探す( android:text=”@{state.text}”) ○ Kotlinコードで再実装 ● バインディング周りがとにかくつらい ○ バインディング変数をGETする箇所もある ○ 1つのバインディング変数が複数箇所で使われていると脳内メモリを圧迫 ○ 複雑なバインディング式 ○ Reflection ○ nullabilityの扱いの違い(@{state.text} -> state?.text.orEmpty())

Slide 13

Slide 13 text

© 2023 Wantedly, Inc. 手作業を減らさないと無理

Slide 14

Slide 14 text

© 2023 Wantedly, Inc. ヘルパープラグインの作成 ● ある程度自動でやってくれるプラグインを作成 ● 目的は、移行を簡単にすること ○ コードの書き換えを最小限に ○ Data BindingとView Bindingのインターフェースの近似を活かす ○ 実行時パフォーマンスは妥協

Slide 15

Slide 15 text

© 2023 Wantedly, Inc. 流れ

Slide 16

Slide 16 text

© 2023 Wantedly, Inc. プラグイン実行 ● プラグインを対象モジュールに適用 ○ apply(MigrateDataBindingToViewBindingPlugin) ● タスク実行 ○ ./gradlew :mymodule:migrateDataBindingToViewBinding

Slide 17

Slide 17 text

© 2023 Wantedly, Inc. XMLをピュアに ● ある程度自動でやってくれるプラグインを作成 ○ XMLをピュアなレイアウトXMLに書き換え ○ Bindingクラスの拡張 ■ バインディング変数 ■ TODOリスト付きのバインド処理関数

Slide 18

Slide 18 text

© 2023 Wantedly, Inc. バインディング拡張の生成 このTODOを解消すればOK! バインディング変数だったものを拡 張プロパティに

Slide 19

Slide 19 text

© 2023 Wantedly, Inc. あとは手作業

Slide 20

Slide 20 text

© 2023 Wantedly, Inc. あとは手作業 大抵は、拡張プロパティを importするだけでよい

Slide 21

Slide 21 text

© 2023 Wantedly, Inc. まとめ

Slide 22

Slide 22 text

© 2023 Wantedly, Inc. まとめ ● 苦行がかなり改善された ○ バインディング実装やレビューはつらいまま ● 属人性が減り再現性のある作業に変わった ● Data Binding移行を考えてる人は是非お試しを 1ヶ月位

Slide 23

Slide 23 text

© 2023 Wantedly, Inc. We are hiring!