- Metaは数年にわたるプロジェクトを通じて、AndroidコードベースをJavaからKotlinへ移行中
- 現在、世界最大級のAndroidコードベースの1つを管理しており、その半分以上をKotlinへの変換に成功
- Metaは2020年からKotlin-firstの開発戦略を採用
- コード全体を変換した理由:
- Kotlinの「生産性向上」と「null安全性」の利点を最大限に活かすため、既存の1,000万行のJavaコードまで変換することを決定
- null安全性を強化し、混在コードベースの問題を解決
- 混合コンパイル(JavaとKotlinの同時コンパイル)はビルド速度を最も遅くする
- 残っているJavaコードはnull安全性の問題を引き起こす: null安全でないJavaコードは、依存関係グラフにおけるNullPointerException(NPE)の潜在的な原因になる
- Kotlinはランタイム検証によってnull安全性を保証
自動化プロセス
- 初期段階ではIntellij IDEのJ2K変換ツールを繰り返し実行していた
- Metaの大規模コードベースでは100,000回以上のクリックが必要で、各実行に数分かかる
- 結果として、この方式はスケーラビリティ不足で非効率
- 自動化ツール: Kotlinatorを開発
- 6段階の変換プロセス
- Deep Build: 変換対象コードをビルドし、すべてのシンボルをIDEで解決できるように準備。サードパーティ依存関係と生成コードを含む
- Preprocessing: MetaのカスタムツールEditusベース。null安全性や依存関係の処理、J2Kのワークアラウンド実施など約50段階を含む
- Headless J2K: J2Kをサーバー環境で実行可能にするよう修正
- Postprocessing: Android特有の変更、null安全性、Kotlinスタイルの適用など約150段階
- Linters: 自動修正によって継続的に変換品質を向上
- Build Error-based Fixes: ビルドエラーを分析し、追加の修正を適用
J2Kのヘッドレス化
- J2Kをリモート実行可能にするよう修正:
- J2KはIntellij IDEと密結合しており、独立実行が難しかった
- 当初はIntellijのテスト環境を活用して実行することを検討したが、JetBrainsのJ2K専門家(Ilya Kirillov)との協議の後、ヘッドレス検査方式へ切り替え
- Intellijプラグインを作成し、
ApplicationStarterクラスを拡張して、J2KのJavaToKotlinConverterクラスを呼び出す形で実装
- ヘッドレス方式の利点
- ローカルIDEの問題を解決: 開発者がIDEのボタンを直接クリックしなくても作業可能
- 複数ファイルの同時変換: 大規模なファイル処理が可能に
- 所要時間の削減: 変換時間自体は約30分に増えたが、開発者が費やす時間は大幅に減少
- ビルドとエラー修正を支援: 時間はかかるが有用な作業段階(ビルド後の修正)をリモートで自動実行可能
- 自動化とコードレビュー
- Metaの社内システムを活用して日次バッチジョブを生成
- カスタム基準に基づいてバッチでdiffsを生成(Meta版のpull request)
- 自動でレビュアーを割り当て、テストと検証を実施した後、最終的に承認されたdiffをデプロイ
- Web UIを提供: 開発者が特定のファイルまたはモジュールの変換をリモートでトリガー可能
- 変換順序の決定
- 特定の順序は強制しない:
- アクティブに開発中のファイルを優先して処理
- Kotlinatorが依存関係グラフを自動処理し、外部ファイルの互換性問題を解決
- 例:
foo.getName()をfoo.nameへ自動更新
そのほか
- カスタムPreprocessing(Java->Java)とPostprocessing(Kotlin->Kotlin)段階を追加
- Metaの社内ツールEditusとJetBrains PSIライブラリを活用して変換品質を向上
- NullsafeとNullAway
Kotlin変換の現在と未来
- MetaのAndroid Javaコードの半分以上がKotlinへ変換完了(または一部コードを削除)
- ただし、簡単な半分は終わった:
- 残る作業は複雑で規模も大きい
- 完全自動化可能な変換のためには、カスタム段階を追加するか、J2K改善への貢献が必要
- 半自動変換では、Kotlinatorの改善によってスムーズで安全なデプロイを目指す
- 他社も同様のAndroidコード変換の課題を抱えているはずだと考えている
- Metaは変換ツールの改善と最適化の過程で得た解決策を共有
- 協力の提案:
- Kotlinlang Slackの#j2k channelで他の開発者と議論
- 互いの事例とソリューションを共有することで、より良い変換体験を築けるはず
まだコメントはありません。