- Meta está migrando su base de código Android de Java a Kotlin a través de un proyecto de varios años
- Actualmente administra una de las bases de código Android más grandes del mundo y ya convirtió con éxito más de la mitad a Kotlin
- Meta adoptó una estrategia de desarrollo Kotlin-first desde 2020
- Razones para convertir todo el código:
- Para aprovechar al máximo los beneficios de Kotlin en "mayor productividad" y "seguridad ante nulos", decidió convertir incluso sus decenas de millones de líneas de código Java existentes
- Reforzar la seguridad ante nulos y resolver problemas de una base de código mixta
- La compilación mixta (compilar Java y Kotlin al mismo tiempo) hace que la velocidad de build sea la más lenta
- El código Java restante provoca problemas de seguridad ante nulos: el código Java que no es null-safe puede convertirse en una causa potencial de
NullPointerException (NPE) en el grafo de dependencias
- Kotlin garantiza la seguridad ante nulos mediante validaciones en tiempo de ejecución
Proceso de automatización
- Al principio ejecutaban repetidamente la herramienta de conversión J2K del IDE IntelliJ
- En la enorme base de código de Meta, esto requería más de 100,000 clics y cada ejecución tomaba varios minutos
- Como resultado, este método era ineficiente por su falta de escalabilidad
- Desarrollaron la herramienta de automatización: Kotlinator
- Proceso de conversión en 6 pasos
- Deep Build: compilar el código a convertir para que el IDE pueda resolver todos los símbolos. Incluye dependencias de terceros y código generado
- Preprocessing: basado en la herramienta personalizada de Meta, Editus. Incluye unas 50 etapas, como manejo de seguridad ante nulos y dependencias, además de workarounds para J2K
- Headless J2K: modificaron J2K para que pudiera ejecutarse en un entorno de servidor
- Postprocessing: unas 150 etapas, incluyendo cambios específicos de Android, seguridad ante nulos y aplicación del estilo de Kotlin
- Linters: mejora continua de la calidad de conversión mediante correcciones automáticas
- Build Error-based Fixes: analizar errores de build y aplicar correcciones adicionales
Hacer J2K headless
- Modificaron J2K para que pudiera ejecutarse de forma remota:
- J2K estaba fuertemente acoplado al IDE IntelliJ, por lo que era difícil ejecutarlo de forma independiente
- Al principio consideraron usar el entorno de pruebas de IntelliJ para ejecutarlo, pero tras conversar con el experto en J2K de JetBrains (Ilya Kirillov), cambiaron al enfoque de inspección headless
- Lo implementaron creando un plugin de IntelliJ que extiende la clase
ApplicationStarter y llama a la clase JavaToKotlinConverter de J2K
- Ventajas del enfoque headless
- Solución a problemas del IDE local: los desarrolladores pueden trabajar sin tener que hacer clic directamente en botones del IDE
- Conversión simultánea de varios archivos: hizo posible procesar archivos a gran escala
- Menor tiempo consumido: aunque el tiempo de conversión en sí aumentó a unos 30 minutos, el tiempo que consumen los desarrolladores se redujo considerablemente
- Soporte para build y corrección de errores: etapas útiles pero costosas en tiempo (como las correcciones después del build) pueden ejecutarse automáticamente de forma remota
- Automatización y revisión de código
- Usando sistemas internos de Meta, generan trabajos batch diarios:
- Se crean diffs por lotes según criterios personalizados (la versión de pull request de Meta)
- Se asignan revisores automáticamente y, tras ejecutar pruebas y validaciones, finalmente se despliega el diff aprobado
- Proveen una UI web: los desarrolladores pueden activar de forma remota la conversión de archivos o módulos específicos
- Cómo deciden el orden de conversión
- No fuerzan un orden específico:
- Se da prioridad a los archivos en desarrollo activo
- Kotlinator maneja automáticamente el grafo de dependencias para resolver problemas de compatibilidad con archivos externos
- Ejemplo: actualiza automáticamente
foo.getName() a foo.name
Otros puntos
- Agregaron etapas personalizadas de Preprocessing (Java->Java) y Postprocessing (Kotlin->Kotlin)
- Mejoraron la calidad de conversión usando la herramienta interna Editus de Meta y la biblioteca PSI de JetBrains
- Nullsafe y NullAway
Presente y futuro de la conversión a Kotlin
- Ya se convirtió a Kotlin más de la mitad del código Java de Android de Meta (o parte del código fue eliminado)
- Sin embargo, la mitad fácil ya terminó:
- El trabajo restante es complejo y de gran escala
- Para una conversión completamente automatizable, será necesario agregar pasos personalizados o contribuir a mejorar J2K
- En el caso de la conversión semiautomática, el objetivo es lograr despliegues fluidos y seguros mejorando Kotlinator
- Consideran que otras empresas probablemente también estén enfrentando problemas similares al convertir código Android
- Meta compartió las soluciones obtenidas durante el proceso de mejora y optimización de sus herramientas de conversión
- Propuesta de colaboración:
- Discutir con otros desarrolladores en el canal #j2k de Kotlinlang Slack
- Compartiendo casos y soluciones entre todos, sería posible construir una mejor experiencia de conversión
Aún no hay comentarios.