- A Meta está migrando sua base de código Android de Java para Kotlin por meio de um projeto de vários anos
- Atualmente, ela mantém uma das maiores bases de código Android do mundo e já converteu com sucesso mais da metade para Kotlin
- A Meta adotou uma estratégia de desenvolvimento Kotlin-first desde 2020
- Motivos para converter todo o código:
- Para aproveitar ao máximo os benefícios do Kotlin em "ganho de produtividade" e "segurança contra null", decidiu converter até mesmo os 10 milhões de linhas existentes em Java
- Reforçar a segurança contra null e resolver problemas de uma base de código mista
- Compilação mista (Java e Kotlin compilados ao mesmo tempo) torna a velocidade de build a mais lenta
- O código Java remanescente causa problemas de segurança contra null: código Java sem segurança contra null se torna uma causa potencial de NullPointerException (NPE) no grafo de dependências
- O Kotlin garante segurança contra null com validações em tempo de execução
Processo de automação
- No início, executavam repetidamente a ferramenta de conversão J2K da IDE IntelliJ
- Na base de código em larga escala da Meta, isso exigia mais de 100.000 cliques e cada execução levava vários minutos
- Como resultado, essa abordagem era ineficiente por falta de escalabilidade
- Foi desenvolvida a ferramenta de automação: Kotlinator
- Processo de conversão em 6 etapas
- Deep Build: compila o código a ser convertido para que a IDE consiga resolver todos os símbolos. Inclui dependências de terceiros e código gerado
- Preprocessing: baseado na ferramenta personalizada da Meta, Editus. Inclui cerca de 50 etapas, como tratamento de segurança contra null, dependências e workarounds do J2K
- Headless J2K: modificação do J2K para que pudesse ser executado em ambiente de servidor
- Postprocessing: cerca de 150 etapas, incluindo mudanças específicas de Android, segurança contra null e aplicação do estilo Kotlin
- Linters: melhoria contínua da qualidade da conversão por meio de correções automáticas
- Build Error-based Fixes: analisa erros de build e aplica correções adicionais
Tornando o J2K headless
- O J2K foi modificado para poder ser executado remotamente:
- O J2K era fortemente acoplado à IDE IntelliJ, o que dificultava sua execução independente
- No início, foi considerada a execução usando o ambiente de testes do IntelliJ, mas após conversar com o especialista em J2K da JetBrains (Ilya Kirillov), a equipe migrou para uma abordagem de inspeção headless
- A implementação foi feita criando um plugin do IntelliJ que estende a classe
ApplicationStarter e chama a classe JavaToKotlinConverter do J2K
- Vantagens da abordagem headless
- Resolve problemas da IDE local: os desenvolvedores conseguem trabalhar sem precisar clicar diretamente em botões da IDE
- Conversão simultânea de vários arquivos: passou a ser possível processar grandes volumes de arquivos
- Menor consumo de tempo: o tempo da conversão em si aumentou para cerca de 30 minutos, mas o tempo gasto pelos desenvolvedores caiu bastante
- Suporte a build e correção de erros: etapas úteis, embora demoradas (como correções após o build), puderam ser executadas automaticamente de forma remota
- Automação e revisão de código
- Usando sistemas internos da Meta, eram gerados jobs em lote diários:
- Criação em lote de diffs com base em critérios personalizados (a versão de pull request da Meta)
- Revisores eram atribuídos automaticamente, e depois de testes e validações, os diffs aprovados eram implantados
- Foi oferecida uma UI web para que desenvolvedores pudessem disparar remotamente a conversão de arquivos ou módulos específicos
- Definição da ordem de conversão
- Nenhuma ordem específica foi imposta:
- Arquivos em desenvolvimento ativo primeiro
- O Kotlinator lida automaticamente com o grafo de dependências, resolvendo problemas de compatibilidade em arquivos externos
- Exemplo: atualiza automaticamente
foo.getName() para foo.name
Outros pontos
- Adição de etapas customizadas de Preprocessing (Java->Java) e Postprocessing (Kotlin->Kotlin)
- Melhoria da qualidade da conversão com as ferramentas internas da Meta, Editus, e a biblioteca PSI da JetBrains
- Nullsafe e NullAway
Presente e futuro da conversão para Kotlin
- Mais da metade do código Android em Java da Meta já foi convertida para Kotlin (ou parte do código foi removida)
- No entanto, a metade fácil já acabou:
- O trabalho restante é complexo e de grande escala
- Para uma conversão totalmente automatizável, será necessário adicionar etapas customizadas ou contribuir para melhorias no J2K
- No caso de conversão semiautomática, o objetivo é aprimorar o Kotlinator para permitir implantações suaves e seguras
- A Meta acredita que outras empresas provavelmente enfrentam problemas semelhantes na conversão de código Android
- A Meta compartilhou as soluções obtidas ao melhorar e otimizar suas ferramentas de conversão
- Proposta de colaboração:
- Discutir com outros desenvolvedores no canal #j2k do Slack do Kotlinlang
- Compartilhar casos e soluções para construir uma experiência de conversão melhor em conjunto
Ainda não há comentários.