Fusões estáveis ​​​​do Linux

Todos os dias, um número significativo de alterações é feito no kernel Linux upstream. Essas alterações geralmente não são avaliadas quanto ao impacto na segurança, mas muitas delas têm o potencial de impactar a segurança do kernel. Avaliar cada uma dessas mudanças quanto ao impacto na segurança é uma operação cara e provavelmente inviável. Em vez disso, uma abordagem mais sustentável e sustentável é sincronizar regularmente as alterações com o kernel Linux upstream.

Recomenda-se atualizar regularmente os dispositivos com kernels mais recentes com suporte de longo prazo (LTS). Atualizações regulares do LTS podem ajudar a resolver possíveis vulnerabilidades de segurança não reconhecidas, como este relatório do Project Zero do início de 2019, antes da divulgação pública ou descoberta por atores mal-intencionados.

Pré-requisitos

  • Ramo comum do kernel Android (do AOSP)
  • Uma ramificação de teste de mesclagem LTS para o kernel do dispositivo de destino
  • Branch de lançamento do kernel do dispositivo
  • repositório Git
  • Conjunto de ferramentas de construção de kernel

Mesclando com alterações LTS

Mesclando alterações de LTS
Figura 1 : Mesclando alterações de LTS

As etapas a seguir descrevem as etapas típicas para uma mesclagem LTS.

  • Faça back-merge do branch de lançamento do kernel de destino no branch de teste -LTS
  • Mesclar localmente linux-stable ou Android common no branch de teste -LTS
  • Resolva conflitos de mesclagem (consulte os proprietários de área/código conforme necessário)
  • Crie localmente e execute testes de integridade/unidade (veja a seção de testes abaixo)
  • Carregar e mesclar alterações comuns do Android na ramificação de teste LTS
  • Teste completamente usando o branch de teste -LTS (veja a seção de testes abaixo)
  • Revise os resultados do teste
  • Aborde quaisquer regressões, divida a mesclagem conforme necessário
  • Mesclar o branch de teste -LTS no branch de lançamento do kernel do dispositivo principal
  • Crie uma nova versão do Android para seus dispositivos que inclua o kernel LTS de teste
  • Compilar build/ROM de lançamento com novo kernel

Exemplo de fusão com LTS.

Mesclar android-4.9 em main (via teste LTS) e verificar e sincronizar branch de teste LTS:

repo init -b <Device kernel LTS staging branch>  # init
repo sync
git checkout -b lts <Device kernel LTS staging branch>
git merge <Device kernel release branch>         # back-merge
git commit

Neste ponto, é melhor enviar o back-merge para o controle remoto de origem antes de continuar. Depois disso, mescle o Android comum com o teste LTS.

git merge -X patience android-4.9-q            # LTS merge

Resolvendo conflitos de mesclagem

Na maioria dos casos, haverá conflitos entre o kernel comum do Android e o branch de teste -LTS. Resolver conflitos de mesclagem durante mesclagens LTS pode ser um desafio, portanto, a seguir estão algumas dicas úteis para resolvê-los.

Mesclagem incremental

Se tiver passado um tempo significativo desde que o kernel de um dispositivo foi atualizado com LTS, há uma boa chance de que tenham havido muitas (>50) versões estáveis ​​desde que a última atualização mesclada foi lançada no upstream. A melhor maneira de resolver isso é atualizar lentamente, mesclando um número menor de versões por vez (<=5 versões secundárias), enquanto testa em cada etapa do processo.

Por exemplo, se o subnível da versão do kernel do dispositivo for 4.14.100 e o subnível estável upstream for 4.14.155, é melhor mesclar em pequenos incrementos para garantir que um volume razoável de alterações possa ser revisado e testado adequadamente.

Em geral, descobrimos que trabalhar de forma incremental em lotes de <=5 versões secundárias por mesclagem garante um conjunto de patches mais gerenciável.

Teste

Teste de inicialização rápida

Para realizar um teste de inicialização rápido, você deve primeiro mesclar as alterações do LTS localmente e construir o kernel.
As etapas a seguir explicam o processo de teste de inicialização rápida.

Conecte o dispositivo de destino ao seu computador usando um cabo USB e envie .ko para o dispositivo usando o Android Debug Bridge (ADB).

adb root
adb disable-verity
adb reboot
(wait for device boot-to-home)
adb root
adb remount
adb push *.ko vendor/lib/modules/
adb reboot bootloader

Inicialize o dtbo e carregue a imagem do kernel.

fastboot boot --header-version=2 Image.lz4 (redo again if device rebooted)

Verifique o log /dev/kmsg em busca de erros.

adb shell
su
cat /dev/kmsg  (inspect kernel log for obvious new errors)

Testes Android

Primeiro construa a imagem -userdebug localmente com o novo kernel e módulos LTS.

Verifique se há erros em /dev/kmsg e confirme se não há nenhum antes de continuar. Teste os itens a seguir para garantir que tudo esteja funcionando conforme o esperado.

  • Velocidade Wi-Fi
  • Navegador Chrome
  • Captura de imagem e vídeo com aplicativo de câmera
  • Reprodução de vídeo do YouTube com alto-falantes integrados e fone de ouvido Bluetooth
  • Chamadas pela rede da operadora
  • Videochamada por Wi-Fi

Conjuntos de testes automatizados

A verificação final para garantir que a imagem do produto não regrida é realizada usando os conjuntos de testes disponíveis através do conjunto de testes do fornecedor (VTS) e testes automatizados de estresse de estabilidade.