16 pontos por xguru 2024-12-23 | Ainda não há comentários. | Compartilhar no WhatsApp
  • 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
    1. 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
    2. 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
    3. Headless J2K: modificação do J2K para que pudesse ser executado em ambiente de servidor
    4. Postprocessing: cerca de 150 etapas, incluindo mudanças específicas de Android, segurança contra null e aplicação do estilo Kotlin
    5. Linters: melhoria contínua da qualidade da conversão por meio de correções automáticas
    6. 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.

Ainda não há comentários.