Configuração do kernel

Use as definições de configuração a seguir como base para uma configuração do kernel do Android. As configurações são organizadas em arquivos .cfg para android-base , android-base- ARCH e android-recommended :

  • As opções android-base habilitam os principais recursos do Android e devem ser configuradas conforme especificado por todos os dispositivos.
  • As opções android-base- ARCH habilitam os principais recursos do Android e devem ser configuradas conforme especificado por todos os dispositivos da arquitetura ARCH . Nem todas as arquiteturas possuem um arquivo correspondente de opções necessárias específicas da arquitetura. Se sua arquitetura não tiver um arquivo, ela não terá requisitos adicionais de configuração de kernel específicos da arquitetura para Android.
  • android-recommended . Essas opções ativam recursos avançados do Android e são opcionais para dispositivos.

Esses arquivos de configuração estão localizados no repositório kernel/configs . Use o conjunto de arquivos de configuração que corresponde à versão do kernel que você está usando.

Para obter detalhes sobre os controles já realizados para fortalecer o kernel em seus dispositivos, consulte Segurança do sistema e do kernel . Para obter detalhes sobre as configurações necessárias, consulte o Documento de definição de compatibilidade do Android (CDD) .

Gerar configuração do kernel

Para dispositivos que possuem um formato defconfig minimalista, use o script merge_config.sh na árvore do kernel para ativar as opções:

ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg

Isso gera um arquivo .config que você pode usar para salvar um novo arquivo defconfig ou compilar um novo kernel com os recursos do Android habilitados.

Requisitos adicionais de configuração do kernel

Em alguns casos, o mantenedor da plataforma pode escolher entre vários recursos do kernel para satisfazer uma dependência do Android. Essas dependências não podem ser expressas nos arquivos de fragmentos de configuração do kernel (descritos acima) porque o formato desses arquivos não suporta expressões lógicas. No Android 9 e versões posteriores, o Compatibility Test Suite (CTS) e o Vendor Test Suite (VTS) verificam se os seguintes requisitos foram atendidos:

  • CONFIG_OF=y ou CONFIG_ACPI=y
  • Os kernels 4.4 e 4.9 possuem CONFIG_ANDROID_LOW_MEMORY_KILLER=y OU possuem ambos CONFIG_MEMCG=y e CONFIG_MEMCG_SWAP=y
  • CONFIG_DEBUG_RODATA=y ou CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y ou CONFIG_STRICT_MODULE_RWX=y
  • Apenas para ARM64: CONFIG_ARM64_SW_TTBR0_PAN=y ou CONFIG_ARM64_PAN=y

Além disso, a opção CONFIG_INET_UDP_DIAG deve ser definida como y para kernels 4.9 no Android 9 e superior.

Habilitar opções de modo host USB

Para áudio no modo host USB, habilite as seguintes opções:

CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
# CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver

Para MIDI no modo host USB, habilite a seguinte opção:

CONFIG_SND_USB_MIDI=y

Seccomp BPF com TSYNC

Secure Computing Berkeley Packet Filter (Seccomp BPF) é uma tecnologia de segurança de kernel que permite a criação de sandboxes que definem o contexto no qual um processo pode fazer chamadas de sistema. O recurso de sincronização de thread (TSYNC) permite o uso de Seccomp BPF a partir de programas multithread. Essa capacidade é limitada a arquiteturas que possuem suporte upstream Seccomp (ARM, ARM64, x86 e x86_64).

Daemon Android Live-Lock

O Android 10 inclui o Android Live-Lock Daemon ( llkd ), projetado para detectar e mitigar deadlocks do kernel. Para obter detalhes sobre como usar o llkd , consulte Android Live-Lock Daemon .

vDSO32 em ARM64

O objeto virtual dinâmico compartilhado (vDSO) é uma alternativa às chamadas do sistema que, quando usado e configurado corretamente, pode reduzir os custos do ciclo. O Android 10 adiciona suporte para vDSO32 em kernels de 64 bits (o Android já oferece suporte a vDSO64 em kernels de 64 bits e vDSO32 em kernels de 32 bits). O uso do vDSO32 ( CONFIG_VDSO_COMPAT ) na arquitetura ARM64 proporciona um aumento de 0,4% na vida útil da bateria e outras melhorias de desempenho.

A comunidade Linux está trabalhando ativamente na unificação de vDSOs entre arquiteturas . Você pode configurar o vDSO em seu kernel Linux habilitando vDSO32 com CONFIG_COMPAT e CONFIG_CROSS_COMPILE_COMPAT_VDSO com o trio do compilador arm32. A equipe do Kernel do Android fez backport de versões mais antigas da série de patches vDSO para dispositivos Pixel, para que você possa encontrar exemplos em compilações do kernel Pixel (caminho LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN , referência CROSS_COMPILE_ARM32 e configuração CONFIG_CROSS_COMPILE_ARM32 ).

Configuração com pouca RAM

Ajuste o kernel/ActivityManager para reduzir a recuperação direta

A recuperação direta acontece quando um processo ou kernel tenta alocar uma página de memória (diretamente ou devido a falha em uma nova página) e o kernel usou toda a memória livre disponível. Isso exige que o kernel bloqueie a alocação enquanto libera uma página. Isso, por sua vez, geralmente requer E/S de disco para liberar uma página suja com suporte de arquivo ou aguardar que lowmemorykiller interrompa um processo. Isso pode resultar em E/S extra em qualquer thread, incluindo um thread de UI.

Para evitar a recuperação direta, o kernel possui marcas d'água que acionam kswapd ou a recuperação em segundo plano. Este é um thread que tenta liberar páginas para que, na próxima vez que um thread real for alocado, ele possa ter sucesso rapidamente.

O limite padrão para acionar a recuperação em segundo plano é bastante baixo, cerca de 2 MB em um dispositivo de 2 GB e 636 KB em um dispositivo de 512 MB. O kernel recupera apenas alguns megabytes de memória na recuperação em segundo plano. Isso significa que qualquer processo que aloque rapidamente mais do que alguns megabytes atingirá rapidamente a recuperação direta.

O suporte para um kernel ajustável é adicionado na ramificação do kernel Android-3.4 como patch 92189d47f66c67e5fd92eafaa287e153197a454f ("adicionar kbytes livres extras ajustáveis"). Escolher esse patch para o kernel de um dispositivo permite que ActivityManager diga ao kernel para tentar manter três buffers de memória de 32 bpp em tela cheia livres.

Esses limites podem ser configurados com a estrutura config.xml .

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists). A high value will increase the amount of memory
that the kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A low value allows more memory to be used by
processes but may cause more allocations to block waiting on disk I/O or
lowmemorykiller. Overrides the default value chosen by ActivityManager based
on screen size. 0 prevents keeping any extra memory over what the kernel keeps
by default. -1 keeps the default. -->
<integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes
tunable in the kernel (if it exists). 0 uses the default value chosen by
ActivityManager. A positive value will increase the amount of memory that the
kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A negative value allows more memory to be
used by processes but may cause more allocations to block waiting on disk I/O
or lowmemorykiller. Directly added to the default value chosen by
ActivityManager based on screen size. -->
<integer name="config_extraFreeKbytesAdjust">0</integer>

Ajustar LowMemoryKiller

ActivityManager configura os limites do LowMemoryKiller para corresponder à sua expectativa do conjunto de trabalho de páginas com suporte de arquivo (páginas em cache) necessárias para executar os processos em cada intervalo de nível de prioridade. Se um dispositivo tiver requisitos elevados para o conjunto de trabalho, por exemplo, se a UI do fornecedor exigir mais memória ou se mais serviços tiverem sido adicionados, os limites poderão ser aumentados.

Os limites podem ser reduzidos se muita memória estiver sendo reservada para páginas com suporte de arquivo, de modo que os processos em segundo plano sejam eliminados muito antes que ocorra a sobrecarga do disco devido ao cache ficar muito pequeno.

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel. A high value will cause the lowmemorykiller to fire earlier,
keeping more memory in the file cache and preventing I/O thrashing, but
allowing fewer processes to stay in memory. A low value will keep more
processes in memory but may cause thrashing if set too low. Overrides the
default value chosen by ActivityManager based on screen size and total memory
for the largest lowmemorykiller bucket, and scaled proportionally to the
smaller buckets. -1 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the
lowmemorykiller in the kernel. A high value will cause the lowmemorykiller to
fire earlier, keeping more memory in the file cache and preventing I/O
thrashing, but allowing fewer processes to stay in memory. A low value will
keep more processes in memory but may cause thrashing if set too low. Directly
added to the default value chosen by ActivityManager based on screen
size and total memory for the largest lowmemorykiller bucket, and scaled
proportionally to the smaller buckets. 0 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>