Customização Avançada de Interface no AOSP: De Overlays a Modificações de SystemUI

Arquitetura de Customização de UI no AOSP

A modificação da interface de usuário no Android Open Source Project (AOSP) é uma tarefa que escala em complexidade dependendo do nível de integração desejado. Para engenheiros de sistemas, a customização pode ser dividida em três abordagens técnicas:

  • Runtime Resource Overlay (RRO): Modificação de recursos (cores, dimensões, strings) sem alterar o código-fonte original.
  • Reestruturação de Layout: Alteração de arquivos XML em frameworks/base ou pacotes específicos para mudar a hierarquia de visualização.
  • Intervenção de Lógica (Framework): Mdoificação do WindowManagerService, SystemUI ou Launcher3 para implementar novos comportamentos de interação e gestos.

Implementação de Recursos com Overlay (RRO)

O mecanismo de Overlay é a prática recomendada pelo Google para manter a compatibilidade com atualizações futuras (Upstream). Ele permite que o sistema substitua recursos do APK original em tempo de execução.

Para implementar uma cor de destaque personalizada no sistema, deve-se criar uma estrutura de diretórios em seu target de dispositivo, por exemplo: device/vendor_name/board_name/overlay/frameworks/base/core/res/res/values/.

<!-- device/brand/model/overlay/frameworks/base/core/res/res/values/colors.xml -->
<resources>
    <!-- Definindo um novo tom de destaque para a interface -->
    <color name="accent_device_default_light">#FF5722</color>
    <color name="primary_device_default_dark">#212121</color>
</resources>

No arquivo device.mk do produto, é necessário habilitar a inclusão desses recursos:

PRODUCT_PACKAGE_OVERLAYS += device/brand/model/overlay

Customização Profunda em Settings e Preferences

O aplicativo de Configurações do Android utiliza o sistema de Preference. Um desafio comum é remover o preenchimento (padding) reservado para ícones quando estes não são utilizados, visando uma interface mais limpa.

A solução envolve sobrescrever o estilo base no arquivo styles.xml do seu overlay, apontando para um layout customizado de item de preferência:

<!-- Customização do estilo de item de lista em Settings -->
<style name="CustomPreferenceStyle" parent="@android:style/Preference.Material">
    <item name="android:layout">@layout/custom_preference_item</item>
</style>

No arquivo custom_preference_item.xml, deve-se ajustar a visibilidade ou a largura do internal_icon_container para 0dp ou gone, garantindo que o texto se alinhe à borda esquerda.

Modificando a Grade do Launcher3

O Launcher3 gerencia a tela inicial e a gaveta de aplicativos. A configuração da grade (grid) não é feita apenas via código Java, mas através de arquivos de configuração XML que definem perfis de dispositivos.

Para alterar a grade padrão de 5x5 para 4x6, edite ou sobreponha o arquivo de configuração de perfis:

<!-- res/xml/device_profiles.xml -->
<profiles>
    <profile
        name="custom_smartphone"
        numRows="6"
        numColumns="4"
        numFolderRows="3"
        numFolderColumns="3"
        iconSize="56dp"
        iconTextSize="12sp" />
</profiles>

Além da grade, a customização do Hotseat (barra inferior) exige a alteração da variável config_hotseatAllAppsColumn no arquivo config.xml para manter a simetria visual.

Otimização de Animações no WindowManager

Animações de transição entre aplicativos são controladas pelo WindowManager. Para tornar o sistema mais responsivo em hardware de entrada, ou mais fluido em telas de alta taxa de atualização (120Hz+), as interpolações podem ser ajustadas em frameworks/base/core/res/res/anim/.

Ao implementar uma transição customizada, é fundamental considerar o uso do RemoteAnimationAdapter, que permite que o SystemUI assuma o controle da animação de abertura de apps, possibilitando efeitos de "zoom-in" a partir do ícone tocado.

Segurança e Restrições no Android 14/15

Ao realizar modificações profundas na UI, deve-se atentar a dois pilares críticos das versões recentes do AOSP:

  1. Políticas de SELinux: Se a nova UI precisar acessar propriedades do sistema (System Properties) ou nós de hardware não padrão, novas permissões de allow devem ser adicionadas em system/sepolicy. A falta disso resultará em avc: denied e falhas silenciosas na interface.
  2. Visibilidade de Pacotes: Se a sua UI customizada (como um novo Status Bar) precisar listar aplicativos instalados, a declaração <queries> ou a permissão QUERY_ALL_PACKAGES deve estar presente no AndroidManifest.xml.
  3. Processamento de Recursos: Em ambientes de build complexos, o cache do Soong ou Ninja pode não detectar mudanças sutis em arquivos XML de overlay. Utilize make installclean para garantir que a árvore de recursos seja reconstruída corretamente.

Considerações de Performance

Customizações excessivas em layouts XML podem aumentar o tempo de "inflation" das views. Em componentes críticos como o NotificationPanel, prefira o uso de ViewStub para carregamento tardio de elementos complexos da interface, garantindo que o tempo de resposta ao primeiro toque (TTI) não seja degradado.

Tags: AOSP Android-UI SystemUI Runtime-Resource-Overlay Launcher3

Publicado em 7-17 08:30