• Meta कई वर्षों की परियोजना के तहत Android codebase को Java से Kotlin में बदल रही है
  • यह वर्तमान में दुनिया के सबसे बड़े Android codebase में से एक को मैनेज कर रही है, और आधे से अधिक हिस्से को सफलतापूर्वक Kotlin में बदल चुकी है
    • Meta ने 2020 से Kotlin-first development strategy अपनाई है
  • पूरे code को बदलने के कारण:
    • Kotlin के "productivity improvement" और "null safety" के लाभों का अधिकतम उपयोग करने के लिए, मौजूदा एक करोड़ लाइनों वाले Java code तक को बदलने का फैसला किया गया
    • null safety को मजबूत करना और mixed codebase की समस्याओं को हल करना
      • mixed compilation (Java और Kotlin का एक साथ compile होना) build speed को सबसे धीमा बनाता है
      • बचा हुआ Java code null safety समस्याएँ पैदा करता है: null-safe न होने वाला Java code dependency graph में NullPointerException (NPE) का संभावित कारण बनता है
      • Kotlin runtime validation के ज़रिए null safety सुनिश्चित करता है

स्वचालन प्रक्रिया

  • शुरुआत में Intellij IDE के J2K conversion tool को बार-बार चलाया गया
    • Meta के बड़े codebase में इसके लिए 100,000 से अधिक क्लिक की ज़रूरत पड़ती थी, और हर run में कई मिनट लगते थे
    • नतीजतन, यह तरीका scalability की कमी के कारण अप्रभावी था
  • automation tool: Kotlinator विकसित किया गया
  • 6-चरणीय रूपांतरण प्रक्रिया
    1. Deep Build: बदलने वाले code को build करके ऐसा तैयार करना कि IDE सभी symbols को resolve कर सके। इसमें third-party dependencies और generated code शामिल हैं
    2. Preprocessing: Meta के custom tool Editus पर आधारित। इसमें null safety और dependency handling, J2K workarounds आदि के लिए लगभग 50 चरण शामिल हैं
    3. Headless J2K: J2K को server environment में चलाने योग्य बनाने के लिए संशोधित किया गया
    4. Postprocessing: Android-specific बदलाव, null safety, Kotlin style लागू करना आदि के लिए लगभग 150 चरण
    5. Linters: auto-fix के माध्यम से conversion quality को लगातार बेहतर बनाना
    6. Build Error-based Fixes: build errors का विश्लेषण करके अतिरिक्त fixes लागू करना

J2K को headless बनाना

  • J2K को remotely चलाने योग्य बनाने के लिए संशोधित किया गया:
    • J2K, Intellij IDE से काफ़ी tightly coupled था, इसलिए इसे standalone चलाना कठिन था
    • शुरुआत में Intellij test environment का उपयोग करके इसे चलाने पर विचार किया गया, लेकिन JetBrains के J2K expert (Ilya Kirillov) से चर्चा के बाद headless inspection approach अपनाई गई
    • Intellij plugin बनाकर ApplicationStarter class को extend किया गया और J2K की JavaToKotlinConverter class को call करके इसे लागू किया गया
  • headless approach के फ़ायदे
    • local IDE समस्याओं का समाधान: developers को IDE button पर सीधे click नहीं करना पड़ता
    • एक साथ कई files का conversion: बड़े पैमाने पर file processing संभव हुई
    • समय की बचत: conversion time खुद लगभग 30 मिनट तक बढ़ गया, लेकिन developers का कुल समय काफ़ी कम हो गया
    • build और error fixes का समर्थन: समय लेने वाले लेकिन उपयोगी चरणों (build के बाद fixes) को remote पर अपने-आप चलाया जा सकता है
  • automation और code review
    • Meta के internal system का उपयोग करके daily batch jobs बनाए गए:
    • custom criteria के आधार पर batch में diffs बनाए जाते हैं (Meta का pull request संस्करण)
    • reviewers अपने-आप assign किए जाते हैं, tests और validation किए जाते हैं, और अंत में approved diff को deploy किया जाता है
  • web UI उपलब्ध कराया गया: developer किसी खास file या module के conversion को remotely trigger कर सकते हैं
  • conversion order तय करना
    • किसी खास क्रम को force नहीं किया गया:
      • actively developed files को प्राथमिकता दी गई
      • Kotlinator dependency graph को अपने-आप handle करके बाहरी files की compatibility समस्याओं को हल करता है
      • उदाहरण: foo.getName() को अपने-आप foo.name में update करना

अन्य बातें

  • custom Preprocessing (Java->Java) और Postprocessing (Kotlin->Kotlin) चरण जोड़े गए
  • Meta के internal tool Editus और JetBrains PSI library का उपयोग करके conversion quality बेहतर की गई
  • Nullsafe और NullAway

Kotlin रूपांतरण का वर्तमान और भविष्य

  • Meta के Android Java code का आधे से अधिक हिस्सा Kotlin में बदला जा चुका है (या कुछ code हटा दिया गया है)
  • लेकिन, आसान आधा हिस्सा पूरा हो चुका है:
    • बचा हुआ काम जटिल है और उसका पैमाना बड़ा है
    • पूरी तरह automated conversion के लिए custom steps जोड़ने या J2K सुधार में योगदान देने की ज़रूरत है
    • semi-automated conversion के मामले में, Kotlinator को बेहतर बनाकर smooth और safe deployment लक्ष्य है
  • Meta का मानना है कि दूसरी कंपनियाँ भी Android code conversion की ऐसी ही समस्याओं का सामना कर रही होंगी
  • Meta ने conversion tools में सुधार और optimization प्रक्रिया से मिले समाधान साझा किए हैं
  • सहयोग का प्रस्ताव:
    • Kotlinlang Slack के #j2k channel में दूसरे developers के साथ चर्चा करें
    • एक-दूसरे के उदाहरण और solutions साझा करके बेहतर conversion experience बनाया जा सकता है

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.