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 afetar a segurança do kernel. Avaliar cada uma dessas alterações 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 os kernels LTS (Long Term Supported) mais recentes. As 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 agentes mal-intencionados.

Pré-requisitos

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

Mesclando com as alterações do 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.

  • Mescle novamente a ramificação de lançamento do kernel de destino na ramificação de teste -LTS
  • Mescle localmente linux-stable ou Android comum no branch de teste -LTS
  • Resolver conflitos de mesclagem (consultar proprietários de área/código conforme necessário)
  • Compile localmente e execute testes de sanidade/unidade (consulte a seção de testes abaixo)
  • Carregue e mescle as alterações comuns do Android na ramificação de teste LTS
  • Teste completamente usando a ramificação de teste -LTS (consulte a seção de teste abaixo)
  • Revise os resultados do teste
  • Aborde quaisquer regressões, bisect mescle conforme necessário
  • Mesclar a ramificação de teste -LTS na ramificação 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 o build/ROM da versão com o novo kernel

Exemplo de fusão com LTS.

Mescle o android-4.9 no main/master (via LTS staging) e faça o checkout e sincronize o branch LTS staging:

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 a mesclagem de volta para o controle remoto de origem antes de continuar. Depois disso, mescle o Android comum no 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 a ramificação de teste -LTS. A resolução de conflitos de mesclagem durante as mesclagens LTS pode ser um desafio, portanto, abaixo estão algumas dicas úteis sobre como resolvê-los.

Mesclagem incremental

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

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ápida, você deve primeiro mesclar as alterações do LTS localmente e compilar 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 empurre .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 faça sideload da imagem do kernel.

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

Verifique se há erros no log /dev/kmsg.

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

Testes do Android

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

Verifique se há erros no /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
  • Chamada de vídeo 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 por meio do conjunto de testes do fornecedor (VTS) e testes de estresse de estabilidade automatizados.