- 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-चरणीय रूपांतरण प्रक्रिया
- Deep Build: बदलने वाले code को build करके ऐसा तैयार करना कि IDE सभी symbols को resolve कर सके। इसमें third-party dependencies और generated code शामिल हैं
- Preprocessing: Meta के custom tool Editus पर आधारित। इसमें null safety और dependency handling, J2K workarounds आदि के लिए लगभग 50 चरण शामिल हैं
- Headless J2K: J2K को server environment में चलाने योग्य बनाने के लिए संशोधित किया गया
- Postprocessing: Android-specific बदलाव, null safety, Kotlin style लागू करना आदि के लिए लगभग 150 चरण
- Linters: auto-fix के माध्यम से conversion quality को लगातार बेहतर बनाना
- 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 बनाया जा सकता है
अभी कोई टिप्पणी नहीं है.