16 ポイント 投稿者 xguru 2024-12-23 | まだコメントはありません。 | WhatsAppで共有
  • 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段階の変換プロセス
    1. Deep Build: 変換対象コードをビルドし、すべてのシンボルをIDEで解決できるように準備。サードパーティ依存関係と生成コードを含む
    2. Preprocessing: MetaのカスタムツールEditusベース。null安全性や依存関係の処理、J2Kのワークアラウンド実施など約50段階を含む
    3. Headless J2K: J2Kをサーバー環境で実行可能にするよう修正
    4. Postprocessing: Android特有の変更、null安全性、Kotlinスタイルの適用など約150段階
    5. Linters: 自動修正によって継続的に変換品質を向上
    6. 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で他の開発者と議論
    • 互いの事例とソリューションを共有することで、より良い変換体験を築けるはず

まだコメントはありません。

まだコメントはありません。