Partições ODM

O Android 10 inclui suporte à criação de partições odm usando o sistema de build do Android.

Sobre as partições ODM

Os fabricantes de design original (ODMs, na sigla em inglês) personalizam pacotes de suporte de placa (BSPs, na sigla em inglês) do fornecedor do system on chip (SoC) para dispositivos específicos deles (as placas). Isso permite que eles implementem módulos de kernel para componentes específicos da placa, daemons específicos da placa ou os próprios recursos nas camadas de abstração de hardware (HALs). Eles também podem substituir ou personalizar componentes do SoC.

Em versões anteriores do Android, essas personalizações impediam o uso de uma única imagem do fornecedor para dispositivos com o mesmo SoC (ou com SoCs diferentes, mas na mesma família). No Android 10 e versões mais recentes, é possível usar uma partição odm separada para personalizações, o que permite usar uma única imagem de fornecedor para vários SKUs de hardware.

Usar partições de produto e ODM

O Android 9 adicionou suporte à criação de partições product, permitindo o uso de uma única imagem do sistema para vários SKUs de software fornecidos por diferentes imagens product.img. Enquanto a partição product é destinada a SKUs de software, a partição odm é destinada a SKUs de hardware.

Com partições de produto dedicadas e ODM, é possível usar a partição system para hospedar o código genérico e compartilhar entre muitos SKUs de software, e a partição vendor para hospedar o código BSP específico do SoC e compartilhar entre vários dispositivos com base no SoC.

O uso de partições separadas tem desvantagens, como a dificuldade em gerenciar o espaço em disco. Por exemplo, é necessário reservar uma quantidade limitada de espaço para o crescimento futuro. No entanto, o suporte do Android 10 para partições dinâmicas remove o problema do disco e torna possível particionar um dispositivo durante uma atualização over-the-air (OTA).

Componentes do ODM

A partição odm contém os seguintes componentes específicos do ODM (semelhantes à partição vendor), listados na tabela a seguir.

Componente específico do ODM Local
Módulos do kernel carregáveis (LKMs) /odm/lib/modules/*.ko
Bibliotecas nativas /odm/lib[64]
HALs /odm/lib[64]/hw
SEPolicy /odm/etc/selinux
Dados de objeto VINTF /odm/etc/vintf
Arquivos init.rc /odm/etc/init
Propriedades do sistema /odm/build.prop
Sobreposições de recursos de tempo de execução (RROs) /odm/overlay/*.apk
Apps /odm/app/*.apk
Priv-apps /odm/priv-app/*.apk
Bibliotecas Java /odm/framework/*.jar
Configurações do sistema do Android Framework /odm/etc/sysconfig/* e /odm/etc/permissions/*

Nenhuma imagem personalizada

Não use imagens personalizadas porque elas não têm suporte para o seguinte:

  • Instalação de um módulo em um destino específico. As imagens personalizadas oferecem suporte à cópia de artefatos em uma imagem, mas não podem instalar um módulo em uma partição específica especificando a partição de destino como parte de uma regra de build.
  • Soong. O custom_images não pode ser criado usando o sistema de build do Soong.
  • Atualização OTA. As imagens personalizadas são usadas como imagens ROM de fábrica que não podem ser atualizadas por OTA.

Manter ABIs entre partições

A partição odm é uma extensão da partição vendor. Ao considerar a estabilidade da interface binária do aplicativo (ABI), considere a arquitetura a seguir.

Como manter a ABI entre partições

Figura 1. Manter a ABI entre partições.

  • Não há estabilidade de ABI entre as partições odm e vendor. As duas partições precisam ser atualizadas ao mesmo tempo.
  • As partições odm e vendor podem depender uma da outra, mas a partição vendor precisa funcionar sem uma partição odm.
  • A ABI entre odm e system é igual à ABI entre vendor e system.

A interação direta entre a partição product e a vendor ou odm não é permitida. Isso é aplicado pelo SEpolicy.

Implementar partições ODM

Antes de implementar uma nova partição, revise as mudanças relacionadas ao AOSP.

Configurar partições ODM

Para configurar partições odm, inclua estas flags de build:

  • BOARD_ODMIMAGE_PARTITION_SIZE para um tamanho de partição fixo
  • PRODUCT_USE_DYNAMIC_PARTITIONS e BOARD_ODMIMAGE_PARTITION_RESERVED_SIZE para um tamanho de partição dinâmica
  • Tipo de sistema de arquivos BOARD_ODMIMAGE_FILE_SYSTEM_TYPE usado para a imagem do ODM
  • PRODUCT_ODM_PROPERTIES para /odm/build.prop para uso em um $(call inherit-product path/to/device.mk), como em PRODUCT_ODM_PROPERTIES += product.abc=ok

Instalar um módulo em uma partição ODM

Use estas flags de build para instalar um módulo em uma partição odm:

  • device_specific: true em Android.bp
  • LOCAL_ODM_MODULE := true em Android.mk

Ativar a inicialização verificada

Para evitar que softwares maliciosos adulterem partições odm, ative a Inicialização verificada do Android (AVB) para essas partições, assim como você faz para partições vendor e system.

Para ativar o AVB, inclua a flag de build BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS. Para saber mais sobre como configurar o AVB em partições dinâmicas, consulte Mudanças na configuração do AVB.

Tratar /odm como outra partição /vendor

Para garantir que o sistema processe a partição odm como uma partição vendor, substitua todas as referências vendor codificadas com um conjunto de partições orientadas a hardware (atualmente odm e vendor). Locais de referência vendor importantes na plataforma incluem linkador dinâmico, gerenciador de pacotes e shell/libc.