実際のコードからFlutter移行を計画する
ConvergeはAIでiOSとAndroidのコードを読み込み、add-to-appによるFlutter移行を計画します。
かかる期間、コスト、担当するメンバーを、スプリントごとに示します。
コードを見ずに判断すると、add-to-appでも移行は失敗します
期間もコストも誰にも分からない
チームごとに見積もりがばらばらで、経営陣はどれをもとに予算を組めばよいか判断できません。
アプリの中身を誰も把握していない
数百の画面、存在しないドキュメント、そして別々に進化してしまった2つのプラットフォーム。
チームはまだFlutterに慣れていない
iOSとAndroidのエンジニアが、最も難しい種類のプロジェクトでFlutterを学ぶことになります。
アプリのリリースは止められない
画面をFlutterへ移している間も、新機能は次々とリリースされます。
Convergeが2つのコードベースを1つの計画にするまで
- Android
- iOS
コードを読み込む
ConvergeはAIを使い、両方のアプリのすべての画面、フロー、共有サービスを読み込みます。
プラットフォームを対応づける
読み込んだ内容を検証し、Androidの各画面を対応するiOSの画面と組み合わせます。
計画を算出する
アルゴリズムが画面を実装順のウェーブにまとめ、それぞれを見積もります。
移行計画
実装すべき順に並んだウェーブ。それぞれに見積もり、期日、チームが付きます。
スプリントごとに、計画が更新される。Convergeは新しいコミットを読み込み、ウェーブ、見積もり、完了日を再計算します。
Convergeで得られるもの
コードから算出した、経営陣にそのまま示せる計画。移行の進捗に合わせて、スプリントごとに更新されます。
2つのアプリの全体マップ
Androidの各画面と対応するiOSの画面、そして片方のアプリにしかない画面まで。
ウェーブ単位の計画
どの画面をまとめて、どの順番で移すか。シンプルなものから先に進めます。
ウェーブごとの期日と体制
各ウェーブの見積もり、期日、担当メンバーを、コードから算出します。
スプリントごとの進捗
すでにFlutterに移ったもの、残っているもの、そして100%に達する時期。
実例
ConvergeがSignalのために算出した計画
Signalはオープンソースなので、AndroidアプリとiOSアプリは公平な公開テストになります。Convergeは両方のコードベースを読み込み、移行をウェーブに分割しました。
- 移行する画面
- 232
- うち片方のアプリにしかない画面(Android 38、iOS 6)
- 44
- ウェーブ(それぞれ単独でリリース)
- 39
- 営業日(開発者7名)
- 226
全39ウェーブのうち最初の12つを表示しています。1マスが1営業日です。開発者7名が並行して作業するため、複数のウェーブが同時に進みます。チームがFlutterに慣れるあいだは、最もシンプルな画面から着手します。
GitHub上の公開リポジトリSignal-AndroidとSignal-iOSから算出。
ウェーブ1:チャットの色と壁紙
- 週
- 1–3
- 画面
- 5
- チャットの外観設定の入口:ライブプレビュー、色と壁紙の行、リセット操作。Android + iOS
- 内蔵壁紙のグリッドと、写真を選ぶための入口。Android + iOS
- 適用前に、サンプルの会話の背後で壁紙を全画面プレビュー。Android + iOS
ウェーブ2:ステッカーライブラリ
- 週
- 1–2
- 画面
- 2
- ステッカーライブラリ:インストール済みのパック、入手可能なパック、受信したが未インストールのパック。Android + iOS
- インストール前のステッカーパック:カバー、グリッド、インストール操作。Android + iOS
ウェーブ3:外観とアプリアイコン
- 週
- 1–4
- 画面
- 3
- 外観:テーマ、チャットの色と壁紙の入口、アプリアイコン。Android では言語と文字サイズも。Android + iOS
- 代替アプリアイコンのグリッド。Android + iOS
- アプリアイコンを変更すると何が起きるかの説明。Android + iOS
ウェーブ4:安全番号
- 週
- 1–4
- 画面
- 2
- 連絡先1人の安全番号:QR コード、数字、確認済みへの設定、共有。Android + iOS
- 安全番号の確認におけるカメラのステップ。Android + iOS
ウェーブ5:連絡先カード
- 週
- 1–3
- 画面
- 2
- チャットで受け取った連絡先カードの詳細と、その相手に応じた操作。Android + iOS
- 送信前に連絡先カードの内容を絞り込み:電話番号、メール、住所をそれぞれチェックできる行で表示。Android + iOS
ウェーブ6:カメラ、ギャラリー、メディアの送信
- 週
- 2–6
- 画面
- 8
- メディアの添付・送信フロー全体のコンテナ:撮影またはギャラリーから、編集を経て送信先まで。Android + iOS
- 写真・動画モードを備えたアプリ内カメラと、クロスフェードで切り替わるテキストストーリー作成画面。Android + iOS
- メディア送信前の確認・編集ステップ:アイテムを切り替えるページャー、編集ツール、送信バー。Android + iOS
ウェーブ7:ヘルプとデバッグログ
- 週
- 2–3
- 画面
- 3
- ヘルプページ:サポートセンター、お問い合わせ、デバッグログ、ライセンス、アプリのバージョン。Android + iOS
- お問い合わせフォーム:説明、カテゴリ、気分、デバッグログのスイッチ。メールアプリに引き渡し。Android + iOS
- 送信前に表示されるデバッグログ本体と、送信およびファイル保存の操作。Android + iOS
ウェーブ8:プライバシー、ブロック、アプリロック
- 週
- 3–7
- 画面
- 9
- プライバシー:電話番号のプライバシー、ブロック中のユーザー、既読通知、デフォルトのタイマー、アプリのセキュリティ、決済ロック。Android + iOS
- 電話番号を表示できる相手と、電話番号でアカウントを検索できる相手。Android + iOS
- 高度なプライバシー設定:検閲回避、プロキシの入口、通話の中継、Sealed Sender のスイッチ。Android + iOS
ウェーブ9:メディアビューアとチャットのメディアライブラリ
- 週
- 3–8
- 画面
- 5
- メディアビューア:会話の添付ファイルをスワイプで切り替えて再生し、共有、転送、保存、削除。Android + iOS
- ズーム可能な添付ファイルを表示するメディアビューアの1ページ。Android + iOS
- 会話のメディアライブラリのコンテナ:メディア、ドキュメント、音声、リンクのタブ。Android + iOS
ウェーブ10:データとストレージ
- 週
- 4–11
- 画面
- 2
- メディアの自動ダウンロード条件、送信メディアの画質、ネットワークに応じた設定。Android + iOS
- ストレージページ:メディアの使用容量、ストレージ最適化のスイッチ、チャットの整理設定。Androidのみ
ウェーブ11:チャットとチャットフォルダ
- 週
- 4–7
- 画面
- 4
- チャット全体の設定:リンクプレビュー、連絡先の写真、ミュート中のチャットをアーカイブしたままにする設定、エクスポート操作。Android + iOS
- チャットフォルダの一覧:並べ替え、削除、おすすめのフォルダ。Androidのみ
- フォルダエディタ:名前、含めるチャットと除外するチャット、フィルター。Androidのみ
ウェーブ12:通知プロファイル
- 週
- 4–8
- 画面
- 7
- 通知プロファイルの入口:空の状態、または有効なプロファイルの説明付きの一覧。Androidのみ
- 通知プロファイルの名前と絵文字の設定。Androidのみ
- 通知プロファイルがオンの間も通知を許可する相手の選択。Androidのみ
Convergeが役立つチーム
iOSとAndroidのネイティブアプリを運用している
どちらも本番稼働中で、画面をFlutterへ移す間もリリースを続けます。
Flutterへの移行を決めている
社内でFlutterはすでに使われている。足りないのは、アプリ全体の移行計画です。
予算化の前に数字が必要
ウェーブごとの期間、コスト、人員を、自社のコードから算出します。
チームがすぐに動ける計画が必要
画面をウェーブにまとめ、実装の順番に並べて、そのままスプリントに落とし込めます。
本番環境での移行から学んだこと
移行すべきかどうかの判断から、ネイティブとFlutterの境界の実装まで。LeanCodeのadd-to-appガイドラインです。
- Flutter add-to-appとは?ネイティブアプリにFlutterを組み込み、フルリライトせずに段階的にFlutterを導入する方法。(新しいタブで開きます)
- Flutter add-to-appを検討すべきタイミングadd-to-appが効果を発揮するケースと、フルリライトのほうが適しているケース。(新しいタブで開きます)
- Flutterへの移行を計画する最初の画面の選び方、段階的なロールアウト、純粋なFlutterアプリへの出口戦略。(新しいタブで開きます)
- アプリのFlutter移行にかかるコストは?コストと期間を左右する要因と、画面単位での見積もり方。(新しいタブで開きます)
- 既存のAndroidアプリにFlutterを追加する方法Flutterモジュールを追加し、KotlinからFlutter画面を開き、本番環境での落とし穴を避ける。(新しいタブで開きます)
- 既存のiOSアプリにFlutterを追加する方法Flutterモジュールを組み込み、SwiftからFlutter画面を表示し、本番投入に備える。(新しいタブで開きます)
デモの前によくいただく質問
自社アプリの移行計画をご覧ください

Marcin Chudy
シニアFlutterデベロッパー(LeanCode)
ご連絡先をご記入ください。デモの日程調整のため、メールでご連絡します。