Os objetos do sistema de arquivos e os serviços adicionados ao build frequentemente precisam exclusivos, conhecidos como IDs do Android (AIDs). Atualmente, muitos recursos, como arquivos e serviços usam AIDs principais (definidos pelo Android) desnecessariamente; em muitos casos, você pode usar AIDs de OEM (definidos pelo OEM).
Versões anteriores do Android (Android 7.x e anteriores) estendevam os AIDs
mecanismo usando um android_filesystem_config.h
específico do dispositivo
para especificar recursos do sistema de arquivos e/ou AIDs personalizados do OEM. No entanto,
não era intuitivo, porque não suportava o uso de bons nomes para AIDs de OEM,
exigindo que você especifique o numérico bruto para campos de usuário e grupo sem um
de associar um nome amigável ao AID numérico.
Versões mais recentes do Android (Android 8.0 e posteriores) oferecem suporte a um novo método para e ampliar os recursos do sistema de arquivos. Esse novo método tem suporte para seguintes:
- Vários locais de origem para os arquivos de configuração (permite arquivos extensíveis configurações do build).
- Verificação de integridade no momento da compilação dos valores de AID do OEM.
- Geração de um cabeçalho OEM AID personalizado que pode ser usado em arquivos de origem como necessários.
- Associação de um nome amigável ao valor real do AID do OEM. Oferece suporte argumentos de string não numéricos para usuário e grupo, ou seja, "foo" em vez de "2901".
Outras melhorias incluem a remoção do android_ids[]
.
matriz de
system/core/libcutils/include/private/android_filesystem_config.h
. Isso
agora existe no Bionic como uma matriz gerada totalmente privada, com
acessores com getpwnam()
e getgrnam()
. Isso tem
o efeito colateral de produzir binários estáveis à medida que os AIDs do núcleo são modificados.) Para
de código aberto e um arquivo README com mais detalhes, consulte
build/make/tools/fs_config
:
Adicionar IDs do Android (AIDs)
O Android 8.0 removeu a matriz android_ids[]
do Android
Open Source Project (AOSP) Todos os nomes compatíveis com AID são gerados
system/core/libcutils/include/private/android_filesystem_config.h
arquivo principal ao gerar a matriz android_ids[]
Bionic. Qualquer um
A define
correspondente ao AID_*
é selecionada pelas ferramentas
e * se torna o nome em letras minúsculas.
Por exemplo, em private/android_filesystem_config.h
:
#define AID_SYSTEM 1000
O resultado é:
- Nome amigável: system
- UID: 1000
- gid: 1.000
Para adicionar um novo AID principal do AOSP, basta adicionar o #define
ao
Arquivo principal android_filesystem_config.h
. O AID é
geradas na criação e disponibilizadas para interfaces que usam usuários e grupos
. As ferramentas validam que o novo AID não está no app ou OEM.
intervalos ela também respeita as mudanças nesses intervalos e deve identificar
reconfigurar após mudanças ou novos intervalos reservados para OEM.
Configurar AIDs
Para ativar o novo mecanismo de AIDs, defina TARGET_FS_CONFIG_GEN
na
arquivo BoardConfig.mk
. Essa variável contém uma lista de configurações
arquivos, permitindo que você os anexe conforme necessário.
Por convenção, os arquivos de configuração usam o nome config.fs
, mas em
você pode usar qualquer nome. config.fs
arquivos estão no
Python
ConfigParser ini format e inclui uma seção em letras maiúsculas (para configurar o arquivo
recursos do sistema) e uma seção de AIDs (para configurar AIDs de OEM).
Configurar a seção de limites
A seção de limites permite a configuração arquivo recursos do sistema em objetos do sistema de arquivos na versão (o sistema de arquivos também precisa oferecer suporte para essa funcionalidade).
Como executar um serviço estável como raiz no Android faz com que uma
Conjunto de teste de compatibilidade (CTS)
os requisitos anteriores para manter uma capacidade durante a execução
ou serviço envolvia a configuração de recursos e o uso
setuid
/setgid
para um AID adequado para ser executado. Com letras maiúsculas, você
podem ignorar esses requisitos e fazer com que o kernel faça isso por você. Quando o controle é
transferido para main()
, seu processo já tem os recursos
necessidades para que seu serviço possa usar um usuário e um grupo não raiz (essa é a preferência
para iniciar serviços privilegiados).
A seção sobre limites usa a seguinte sintaxe:
Seção | Valor | Definição |
---|---|---|
[path] |
O caminho do sistema de arquivos a ser configurado. Um caminho que termina em / é considerado um dir,
caso contrário, é um arquivo.
É um erro especificar várias seções com o mesmo [path] em arquivos diferentes. Nas versões 3.2 e anteriores do Python, a
o mesmo arquivo pode conter seções que substituem a seção anterior. em Python
3.2, ele está no modo estrito. |
|
mode |
Modo de arquivo octal | Um modo de arquivo octal válido de pelo menos três dígitos. Se 3 for especificado, será prefixado com 0. O modo else é usado no estado em que se encontra. |
user |
AID_<usuário> | O C define para um AID válido ou o nome amigável
Por exemplo, AID_RADIO e radio são aceitáveis. Para
definir um AID personalizado, consulte Como configurar
a seção AID. |
group |
AID_<grupo> | Igual ao usuário. |
caps |
limite* | O nome declarado em
bionic/libc/kernel/uapi/linux/capability.h
sem o CAP_ inicial. É permitido usar letras maiúsculas e minúsculas. Bonés também podem ser
bruto:
|
Para um exemplo de uso, consulte Como usar o arquivo recursos do sistema operacional.
Configurar a seção AID
A seção AID contém AIDs do OEM e usa a seguinte sintaxe:
Seção | Valor | Definição |
---|---|---|
[AID_<name>] |
<name> pode conter caracteres no conjunto
maiúsculas, números e sublinhados. A versão em letra minúscula é usada
nome amigável. O arquivo de cabeçalho gerado para a inclusão de código usa a expressão
AID_<name> :
É um erro especificar várias seções com o mesmo AID_<name> (não diferencia maiúsculas de minúsculas com as mesmas restrições
[path] ).
<name> deve começar com o nome de uma partição para garantir
para que ele não entre em conflito com diferentes fontes. |
|
value |
<número> | Uma string de número de estilo C válida (hexa, octal, binário e decimal).
É um erro especificar várias seções com a opção de mesmo valor. As opções de valor precisam ser especificadas no intervalo correspondente à partição usado em <name> . A lista de partições válidas e as
intervalos são definidos em system/core/libcutils/include/private/android_filesystem_config.h .
As opções são:
|
Para exemplos de uso, consulte Como definir OEMs Nomes de AID e Como usar AIDs de OEM.
Exemplos de uso
Os exemplos a seguir mostram como definir e usar um AID do OEM e como ativar os recursos do sistema de arquivos. Nomes de AIDs de OEM ([AID_name]) precisa começar com nome da partição, como "vendor_" para garantir que não entrem em conflito com futuras Nomes do AOSP ou outras partições.
Definir nomes de AIDs de OEM
Para definir um AID de OEM, crie um arquivo config.fs
e configure
o valor AID. Por exemplo, em device/x/y/config.fs
, defina o
seguintes:
[AID_VENDOR_FOO] value: 2900
Depois de criar o arquivo, defina a variável TARGET_FS_CONFIG_GEN
e apontá-lo em BoardConfig.mk
. Por exemplo, em
device/x/y/BoardConfig.mk
, defina o seguinte:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Agora, seu AID personalizado pode ser consumido pelo sistema em um novo build.
Usar AIDs de OEM
Para usar um AID do OEM, inclua o oemaids_headers
no seu código C no código
Makefile, adicionar #include "generated_oem_aid.h"
e começar a usar o
identificadores. Por exemplo, em my_file.c
, adicione o seguinte:
#include "generated_oem_aid.h" … If (ipc->uid == AID_VENDOR_FOO) { // Do something ...
No seu arquivo Android.bp
associado, adicione o seguinte:
header_libs: ["oemaids_headers"],
Se você estiver usando um arquivo Android.mk
, adicione o seguinte:
LOCAL_HEADER_LIBRARIES := oemaids_headers
Use nomes intuitivos.
No Android 9, você pode usar o nome amigável para qualquer que dá suporte a nomes de AIDs. Exemplo:
- Em um comando
chown
emsome/init.rc
:chown vendor_foo /vendor/some/vendor_foo/file
- Em uma
service
emsome/init.rc
:service vendor_foo /vendor/bin/foo_service user vendor_foo group vendor_foo
Como o mapeamento interno do nome amigável para o uid é executado pelo
/vendor/etc/passwd
e /vendor/etc/group
, o fornecedor
precisa ser montada.
Nomes de fácil associação
O Android 9 inclui suporte para associar uma nome amigável com o valor real do AID do OEM. Você pode usar strings não numéricas argumentos para usuário e grupo, ou seja, "vendor_foo" em vez de "2901".
Converter de AID em nomes intuitivos
Para
AIDs de OEM, o Android 8.x exigia o uso de
oem_####
com getpwnam
e funções semelhantes, conforme
bem em lugares que processam pesquisas com getpwnam
(como
init
). No Android 9, você pode
use os amigos getpwnam
e getgrnam
no Bionic para
conversão de IDs do Android (AIDs) para nomes intuitivos e vice-versa.
Usar recursos do sistema de arquivos
Para ativar os recursos do sistema de arquivos, crie uma seção em Caps
config.fs
. Por exemplo, em
device/x/y/config.fs
, adicione a seguinte seção:
[system/bin/foo_service] mode: 0555 user: AID_VENDOR_FOO group: AID_SYSTEM caps: SYS_ADMIN | SYS_NICE
Depois de criar o arquivo, defina o TARGET_FS_CONFIG_GEN
para apontar para
esse arquivo em BoardConfig.mk
. Por exemplo, em
device/x/y/BoardConfig.mk
, defina o seguinte:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Quando o serviço vendor_foo
é executado, ele é iniciado
com os recursos CAP_SYS_ADMIN
e CAP_SYS_NICE
sem chamadas setuid
e setgid
. Além disso,
A política de SELinux do serviço vendor_foo
não está mais disponível
precisa da capacidade setuid
e setgid
e pode ser
excluída.
Configurar substituições (Android 6.x-7.x)
O Android 6.0 realocou o fs_config
e a estrutura associada
definições
(system/core/include/private/android_filesystem_config.h
) a
system/core/libcutils/fs_config.c
onde eles podem ser atualizados ou
substituído por arquivos binários instalados em
/system/etc/fs_config_dirs
e
/system/etc/fs_config_files
. Uso de correspondência e análise separadas
regras para diretórios e arquivos (que podem usar expressões glob adicionais)
ativou o Android para lidar com diretórios e arquivos em duas tabelas diferentes.
As definições de estrutura em system/core/libcutils/fs_config.c
não
permitia somente a leitura de diretórios e arquivos em tempo de execução, mas o host podia usar
dos mesmos arquivos durante a compilação para criar imagens do sistema de arquivos como
${OUT}/system/etc/fs_config_dirs
e
${OUT}/system/etc/fs_config_files
O método de substituição de estender o sistema de arquivos foi substituído pelo com o sistema de configuração modular introduzido no Android 8.0, você ainda pode usar a versão se quiser. As seções a seguir detalham como gerar e incluir substituir arquivos e configurar o sistema de arquivos.
Gerar arquivos de substituição
É possível gerar os arquivos binários alinhados
/system/etc/fs_config_dirs
e
/system/etc/fs_config_files
usando o método
Ferramenta fs_config_generate
em build/tools/fs_config
. A
ferramenta usa uma função da biblioteca libcutils
(fs_config_generate()
) para gerenciar os requisitos de DAC em um buffer
e define as regras de um arquivo de inclusão para institucionalizar as regras do DAC.
Para usar, crie um arquivo de inclusão em
device/vendor/device/android_filesystem_config.h
que atua como substituição. O arquivo deve usar a função
Formato structure fs_path_config
definido em
system/core/include/private/android_filesystem_config.h
com o
seguintes inicializações de estrutura para símbolos de diretório e arquivo:
- Para diretórios, use
android_device_dirs[]
. - Para arquivos, use
android_device_files[]
.
Quando não usar android_device_dirs[]
e
android_device_files[]
, é possível definir
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
e
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES
(consulte a
exemplo abaixo). Também é possível especificar
arquivo usando TARGET_ANDROID_FILESYSTEM_CONFIG_H
no quadro
com um nome de base aplicado de
android_filesystem_config.h
.
Incluir arquivos de substituição
Para incluir arquivos, verifique se PRODUCT_PACKAGES
inclui
fs_config_dirs
e/ou fs_config_files
para que ela possa
instalá-los em /system/etc/fs_config_dirs
e
/system/etc/fs_config_files
, respectivamente. O sistema de build
pesquisas sobre android_filesystem_config.h
personalizado em
$(TARGET_DEVICE_DIR)
, em que BoardConfig.mk
existe.
Se o arquivo já existir em outro lugar, defina a variável de configuração da placa
TARGET_ANDROID_FILESYSTEM_CONFIG_H
para apontar para esse local.
Configurar o sistema de arquivos
Para configurar o sistema de arquivos no Android 6.0 e versões mais recentes:
- Criar o
$(TARGET_DEVICE_DIR)/android_filesystem_config.h
. - Adicione
fs_config_dirs
e/oufs_config_files
aPRODUCT_PACKAGES
no arquivo de configuração da placa (por exemplo,$(TARGET_DEVICE_DIR)/device.mk
).
Exemplo de substituição
Este exemplo mostra um patch para substituir o system/bin/glgps
para adicionar suporte a wake locks
device/vendor/device
. Mantenha o
o seguinte:
- Cada entrada da estrutura é o modo, o UID, o gid, os recursos e o nome.
system/core/include/private/android_filesystem_config.h
é incluído automaticamente para fornecer o manifesto #defines (AID_ROOT
,AID_SHELL
,CAP_BLOCK_SUSPEND
). - A seção
android_device_files[]
inclui uma ação para suprimem o acesso asystem/etc/fs_config_dirs
quando não especificado, que serve como uma proteção adicional do DAC para a falta de conteúdo no diretório. substituições. No entanto, essa proteção é fraca; se alguém tem controle sobre/system
, ela geralmente pode fazer o que quiser.
diff --git a/android_filesystem_config.h b/android_filesystem_config.h new file mode 100644 index 0000000..874195f --- /dev/null +++ b/android_filesystem_config.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +/* This file is used to define the properties of the file system +** images generated by build tools (eg: mkbootfs) and +** by the device side of adb. +*/ + +#define NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS +/* static const struct fs_path_config android_device_dirs[] = { }; */ + +/* Rules for files. +** These rules are applied based on "first match", so they +** should start with the most specific path and work their +** way up to the root. Prefixes ending in * denotes wildcard +** and will allow partial matches. +*/ +static const struct fs_path_config android_device_files[] = { + { 00755, AID_ROOT, AID_SHELL, (1ULL << CAP_BLOCK_SUSPEND), "system/bin/glgps" }, +#ifdef NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS + { 00000, AID_ROOT, AID_ROOT, 0, "system/etc/fs_config_dirs" }, +#endif +}; diff --git a/device.mk b/device.mk index 0c71d21..235c1a7 100644 --- a/device.mk +++ b/device.mk @@ -18,7 +18,8 @@ PRODUCT_PACKAGES := \ libwpa_client \ hostapd \ wpa_supplicant \ - wpa_supplicant.conf + wpa_supplicant.conf \ + fs_config_files ifeq ($(TARGET_PREBUILT_KERNEL),) ifeq ($(USE_SVELTE_KERNEL), true)
Migrar sistemas de arquivos de versões anteriores
Ao migrar sistemas de arquivos do Android 5.x e versões anteriores, tenha em mente que Android 6.x
- Remove alguns inclusões, estruturas e definições inline.
- Exige uma referência a
libcutils
em vez de ser executado diretamente desystem/core/include/private/android_filesystem_config.h
. Executáveis particulares do fabricante do dispositivo que dependem desystem/code/include/private_filesystem_config.h
para o arquivo ou estruturas de diretórios oufs_config
precisam adicionarlibcutils
dependências de biblioteca. - Requer cópias da ramificação privada do fabricante do dispositivo do
system/core/include/private/android_filesystem_config.h
com conteúdo extra nas segmentações existentes para mover paradevice/vendor/device/android_filesystem_config.h
. - Reserva-se o direito de aplicar os Controles de Acesso Obrigatórios (MAC) do SELinux para
de configuração no sistema de destino, implementações que incluem arquivos
executáveis de destino usando
fs_config()
precisam garantir o acesso.