Open88

FlutterKaigi 2024 day2

ykwsykws

出前館は3つアプリがあってどれも Flutter

  • ユーザ
  • 配達員
  • 加盟店
ykwsykws

状態と機能を既存の UI にとらわれずに整理したい
個人情報の入力を省略して共有する方法はないだろうか

ykwsykws

package を導入するとそれだけでコストになる
マクロを活用することで packages を導入しなくても実現できる選択肢が増える

ykwsykws

フェーズによってマクロの適用順序の結果が一意に定まるようにしている

ykwsykws
  • リバースエンジニアリングへの防御
  • バイナリサイズの軽量
ykwsykws

Flutter release build で難読化される

ykwsykws

Obfuscation map に難読化の結果をマッピングしていく

ykwsykws

--split-debug-info で Dart プログラムのダンプの出力先を指定できる

ykwsykws

難読化のコマンド。ダンプ出力とセットで行う

flutter build apk --obfuscate --split-debug-info
ykwsykws

難読化するときに symbols file が出力されるので、この file を元に symbolize で難読化を解除できる

ykwsykws

symbols file は Production のスタックトレースの解析にも必要

ykwsykws

Dart includes both a Dart VM with just-in-time (JIT) compilation and an ahead-of-time (AOT) compiler for producing machine code.

ykwsykws

各プラットフォーム向けのコマンドは Dart で記述されている

ykwsykws
  1. Dart 向けの難読化
  2. Android 向けの難読化

2フェーズ実施する
他のプラットフォーム向けも同様

ykwsykws

Web は Minification
Obfuscation しない

ykwsykws
  • R8 の keep rule 相当の難読化しない方法もある
  • debug symbols をバイナリに含めないオプションで軽量化できる
  • runtime で型を比較しているランタイムエラーが発生しうる
ykwsykws

ネイティブから Flutter にリプレイス
Add to App を利用して新しい機能から Flutter に置き換えていく
ネイティブコードはサービス開始 2012年からの積み重ねもあって OS 間の差異、技術的な負債が蓄積している状態

ykwsykws

例外処理の対応方針が決まっていない
リプレイスするときに仕様策定が必要な状態

ykwsykws
  • Separation of Concerns
    • Flutter/Dart
    • Client/Server
  • Design Pattern
  • Testing Business Logic
ykwsykws

repository を境界にしてサーバサイドの影響の吸収する層として重要な位置

ykwsykws

base_ui は Figma に依存する
Figma から生成できると理想

ykwsykws

system で 3rd party への依存を取りまとめる?
依存を吸収する層を作った方が良いのか?

ykwsykws

アノテーションでサーバの実態をリプレイス用の適切なドメインに変換できる

ykwsykws

bool を期待しているのに、 "0" : "1" とか返ってくるケースにも変換できる

ykwsykws

ログイン頻度のロジックがクライアントに持つのが少し気になる
サーバ側で頻度のコードを送って欲しい気もする

ykwsykws

業務知識の例外を用意して throw して UI で適切なユーザフィードバックを表現できるようにする

ykwsykws

PR で Unit Test Coverage が 100% がマージ条件の一つとして防御している

ykwsykws

スニペット化を定義
スニペットが使えない場合はアラートを上げてペアプロする

ykwsykws

Cursor に指示を出してコード生成する
このときにもスニペットを入力すると期待したコードが生成されやすい

ykwsykws
  • Widgets:
  • Elements: 構成要素
  • RenderObject: 画面描画を管理
ykwsykws

制約は親から子へ伝わり
大きさは子から親へ伝え
親が位置を決める