Partições de produtos

O Android 9 e versões mais recentes oferecem suporte à criação de partições product usando o sistema de build do Android. Anteriormente, o Android 8.x aplicava a separação de componentes específicos do SoC da partição system para a partição vendor sem dedicar espaço para componentes específicos de OEM criados com base no sistema de criação do Android. O Android 9 e versões mais recentes oferecem permissões e recursos de inclusão na lista de permissões adicionais que se aplicam a apps privados em diferentes partições.

Sobre as partições de produtos

Muitos OEMs personalizam a imagem do sistema AOSP para implementar os próprios recursos e os requisitos da operadora. No entanto, essas personalizações tornam impossível usar uma única imagem do sistema para vários SKUs de software. Cada imagem precisa ser diferente para oferecer suporte às personalizações, como com diferentes localidades ou operadoras. O uso de uma partição product separada para conter personalizações permite usar uma única imagem do sistema para vários SKUs de software. A partição system hospeda um código genérico que pode ser compartilhado entre muitos SKUs de software. A partição vendor continua hospedando o código BSP específico do SoC, que pode ser compartilhado entre vários dispositivos com base no SoC.

O uso de partições separadas tem algumas desvantagens, como o gerenciamento de espaço em disco (uma quantidade limitada de espaço precisa permanecer reservada para o crescimento futuro) e a manutenção de uma interface binária de aplicativo estável (ABI, na sigla em inglês) entre as partições. Antes de decidir usar partições product, considere sua implementação exclusiva do AOSP e possíveis táticas de mitigação, como particionar um dispositivo durante uma atualização over-the-air (OTA), que não é feita pelo Google, mas por alguns OEMs. O particionamento dinâmico é uma boa solução para isso.

Partições e permissões de produtos

No Android 9 e versões mais recentes, uma mudança nas permissões e no processo de inclusão na lista de permissões afeta a forma como você concede permissões de apps privados nas partições "product". O arquivo permissions.xml precisa residir na mesma partição que o priv-apps. Colocar um arquivo permissions.xml na partição system para apps privados não estende essas permissões para apps privados na partição product, mesmo que o primeiro seja uma extensão do segundo. Para saber mais sobre as permissões e os processos de inclusão na lista de permissões privilegiadas, consulte Lista de permissões privilegiadas.

/oem legado x /product

Há dois tipos de atributos da partição product, dependendo da aplicação de interface do produto. Além disso, a partição product é diferente da partição oem legada:

Partição Atributos
oem
  • Não pode ser atualizado. Normalmente, é atualizado uma vez na fábrica.
  • Criada para pequenas variações, como marca e cor. Ter diferentes conteúdos de partição oem não significa que o software do produto é diferente.
  • A partição system não depende da partição oem. Ele usa a partição oem somente quando um arquivo específico é encontrado nela.
  • Usa apenas a API pública na partição system.
product
  • Atualizável
  • Vinculada à imagem do sistema (elas são atualizadas juntas)
  • Criados por produto ou família de produtos.
  • A partição do sistema pode depender da partição product.
  • Pode usar APIs não públicas, já que elas são atualizadas simultaneamente.
product (interfaces aplicadas)
  • Atualizável
  • Desvinculado da imagem do sistema.
  • Criados por produto ou família de produtos.
  • A partição system não depende da partição product.
  • Não é possível usar APIs ocultas, mas apenas APIs públicas e do sistema na partição system.

Por esses motivos, o Android 9 oferece suporte à partição product, mantendo o suporte à partição oem legada para dispositivos que dependem dela. Para desvincular a partição product da partição system, o Android 11 oferece suporte à aplicação de interfaces product.

/componentes do produto

A partição product contém os seguintes componentes:

  • Propriedades do sistema específicas do produto (/product/build.prop)
  • RROs específicos do produto (/product/overlay/*.apk)
  • Apps específicos do produto (/product/app/*.apk)
  • priv-apps específicos do produto (/product/priv-app/*.apk)
  • Bibliotecas específicas do produto (/product/lib/*)
  • Bibliotecas Java específicas do produto (/product/framework/*.jar)
  • Configurações do sistema do Android Framework específicas do produto (/product/etc/sysconfig/* e /product/etc/permissions/*)
  • Arquivos de mídia específicos do produto (/product/media/audio/*)
  • Arquivos bootanimation específicos do produto

Nenhuma custom_images

Não é possível usar custom_images. Eles não têm suporte para o seguinte:

  • Instalar módulos em um destino específico. O custom_images oferece suporte à cópia de artefatos para uma imagem, mas não é possível instalar um módulo em uma partição específica especificando a partição de destino como parte de uma regra de build.
  • Suporte da Soong. O custom_images não pode ser criado usando o sistema de build do Soong.
  • Suporte a atualizações OTA. custom_images são usadas como imagens ROM de fábrica que não podem receber atualizações OTA.

Manter ABIs entre partições

A partição product no Android 9 é uma extensão da partição system. Há uma ABI fraca entre as partições product e system. Portanto, ambas precisam ser atualizadas ao mesmo tempo, e a ABI precisa ser baseada no SDK do sistema. Se o SDK do sistema não abranger todas as plataformas de API entre product e system, os OEMs precisarão manter as próprias ABIs entre as duas partições.

As partições product e system podem ter dependências umas das outras. No entanto, os testes com a imagem genérica do sistema (GSI) precisam funcionar corretamente sem a partição product.

Quando as interfaces product são aplicadas, a partição product é desassociada da partição system. A partição product usa apenas as interfaces permitidas da partição system.

A partição product não pode ter dependências por interfaces instáveis na partição vendor. A interação direta entre as partições product e vendor é proibida. Isso é aplicado pelo SEpolicy.

Implementar partições de produtos

Antes de implementar uma nova partição de produto, revise as mudanças relacionadas à partição de produto no AOSP. Em seguida, para configurar product, inclua as seguintes flags de build do produto ou da placa:

  • BOARD_USES_PRODUCTIMAGE
  • BOARD_PRODUCTIMAGE_PARTITION_SIZE
  • BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
  • PRODUCT_PRODUCT_PROPERTIES para /product/build.prop. Elas precisam estar dentro de um $(call inherit-product path/to/device.mk), como em PRODUCT_PRODUCT_PROPERTIES += product.abc=ok.

Instalar um módulo na partição do produto

Use os flags de build a seguir para instalar um módulo na partição product.

  • product_specific: true em Android.bp
  • LOCAL_PRODUCT_MODULE := true em Android.mk

Ativar a inicialização verificada

Para evitar que a partição product seja adulterada por software malicioso, ative a Inicialização verificada do Android (AVB) para essa partição, assim como você faz com as partições vendor e system. Para ativar o AVB, inclua as seguintes flags de build: BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS.