Todos os dias, um número significativo de alterações é confirmado no kernel do Linux upstream. Essas mudanças geralmente não são avaliadas quanto ao impacto na segurança, mas muitas delas podem afetar a segurança do kernel. Avaliar cada uma dessas mudanças em relação ao impacto na segurança é uma operação cara e provavelmente inviável. Em vez disso, uma abordagem mais sustentável e de manutenção é sincronizar regularmente as mudanças com o kernel do Linux upstream.
É recomendável atualizar regularmente os dispositivos com kernels mais recentes com suporte de longo prazo (LTS). As atualizações regulares do LTS podem ajudar a lidar com 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 da descoberta por agentes maliciosos.
Pré-requisitos
- Branch do kernel comum do Android (do AOSP)
- Uma ramificação de fase de mesclagem do LTS para o kernel do dispositivo de destino
- Ramificação de versão do kernel do dispositivo
- Repositório Git
- Conjunto de ferramentas de build do kernel
Mesclar com as mudanças do LTS
As etapas a seguir descrevem as etapas típicas de uma mesclagem de LTS.
- Mesclar novamente a ramificação de lançamento do kernel de destino na ramificação de preparação -LTS
- Mesclar localmente o linux-stable ou o Android common no ramo de preparo -LTS
- Resolver conflitos de mesclagem (consulte os proprietários da área/código conforme necessário)
- Crie localmente e realize testes de sanidade/unidade (consulte a seção de testes abaixo)
- Fazer upload e mesclar as mudanças comuns do Android para a ramificação de preparação do LTS
- Faça testes completos usando a ramificação de preparo -LTS (consulte a seção de testes abaixo)
- Analisar os resultados do teste
- Corrija todas as regressões e faça a bissecção da mesclagem conforme necessário.
- Mesclar a ramificação de preparo -LTS na ramificação de lançamento do kernel do dispositivo principal
- Criar um novo build do Android para seus dispositivos que inclua o kernel LTS de preparação
- Compilar o build/ROM de lançamento com um novo kernel
Exemplo de mesclagem com LTS.
Mesclar android-4.9 na ramificação principal (por meio do ambiente de testes do LTS) e fazer check-out e sincronizar a ramificação de ambiente de testes do 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 a mesclagem de volta para a origem remota antes de continuar. Depois disso, mescle o Android common no ambiente de pré-lançamento do LTS.
git merge -X patience android-4.9-q # LTS merge
Resolver conflitos de mesclagem
Na maioria dos casos, há conflitos entre o kernel comum do Android e a ramificação de preparo do -LTS. A resolução de conflitos de mesclagem durante as mesclagens de LTS pode ser difícil. Confira abaixo algumas dicas úteis para resolvê-los.
Fusão incremental
Se um período significativo passou desde que o kernel de um dispositivo foi atualizado com o LTS, há uma boa chance de que muitas versões estáveis (mais de 50) tenham sido lançadas desde a última atualização mesclada. A melhor maneira de resolver isso é fazer a atualização aos poucos, 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 mudanças possa ser analisado 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 rápido de inicialização, primeiro mescle as mudanças do LTS localmente e crie o kernel. As etapas a seguir explicam o processo do teste de inicialização rápida.
Conecte o dispositivo de destino ao computador usando um cabo USB e envie .ko ao 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 o sideload da imagem do kernel.
fastboot boot --header-version=2 Image.lz4 (redo again if device rebooted)
Verifique se há erros no registro /dev/kmsg.
adb shell
su
cat /dev/kmsg (inspect kernel log for obvious new errors)
Testes para Android
Primeiro, crie a imagem -userdebug localmente com o novo kernel e os módulos LTS.
Verifique se há erros no /dev/kmsg
e confirme se não há nenhum antes de
continuar. Teste as seguintes ações para garantir que tudo esteja funcionando como esperado.
- Velocidade do Wi-Fi
- Navegador Chrome
- Captura de imagens e vídeos com o app de câmera
- Reprodução de vídeos do YouTube com alto-falantes integrados e fones 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 regredisse é realizada usando os conjuntos de testes disponíveis no conjunto de testes do fornecedor (VTS, na sigla em inglês) e no teste de estresse de estabilidade automatizado.