Arquitetura da Plataforma Android

Olá, pessoal! Agora irei explorar a arquitetura da plataforma Android, um sistema operacional amplamente utilizado em dispositivos móveis ao redor do mundo.

Imagem da palavra Android e da sua logo

Compreender a arquitetura do Android é fundamental para desenvolvedores que desejam criar aplicativos eficientes e otimizados para Android.

🤖 Introdução ao Android

Celular Android

O Android é um sistema operacional de código aberto (open source) para dispositivos móveis, baseado no Kernel do Linux. Ele foi desenvolvido pela Google lá em 2008 e projetado para ser executado em dispositivos com tela sensível ao toque. Através deste Sistema Operacional, é possível dar utilidade ao dispositivo físico, seja ele um smartphone, tablet ou outro tipo de aparelho.

🏛️ Camadas da Arquitetura Android

A verdade é que o Android é muito mais do que um simples sistema operacional, composto por cinco módulos, ele é um software stack poderoso. Os modulos são:

Arquitetura Android
  1. A base do SO, o Kernel Linux;
  2. a camada de abstração do hardware para as API´s de alto nível: Camada de Abstração do Hardware (HAL);
  3. A maquina virtual que irá rodar os apps do sistema: Ambiente de Execução Android (Runtime);
  4. As Bibliotecas C/C++ nativas;
  5. A Java API Framework fornecido pelo Android para ajudar na criação de apps.
  6. Apps do Sistema.

🐧 Kernel Linux

A base do Android é uma versão modificada do Kernel do Linux, que provê serviços essenciais como segurança, rede e gerenciamento de processos e memória, além de servir como camada de abstração do hardware. É através dele que é possível dar "vida" ao nosso dispositivo físico.

Kernel Linux

Em McDermott (2008), nos primórdios do Android, é descrito um processo de portabilidade para o dispositivo Nokia, evidenciando que o Kernel do Android continha pouco mais de 70 arquivos modificados, além de mais 80 arquivos adicionados em relação ao Kernel original. As novas mecânicas adicionadas foram: uma CPU Virtual, chamada de Goldfish, que executa instruções ARM926T, utilizada pelo emulador Android; e correção de bugs relacionados a Bluetooth e outros recursos.

Ele também introduz o Binder, um mecanismo usado para chamadas entre processos (IPC - Inter-Process Communication), que permite que uma rotina em um processo possa ser chamada. Além disso, como o foco são dispositivos com poucos recursos se comparados a computadores, o Android introduziu um novo mecanismo na gestão de memória que encerrar um processo na falta de memória. Ele inclui, também, um alocador de memória compartilhada, que permite um melhor suporte para dispositivos com pouca memória.

🗄️ Camada de Abstração do Hardware (HAL)

O HAL (Hardware Abstraction Layer) oferece uma interface padrão que expõe os recursos do hardware para serem utilizados pelas APIs Java de Alto Nível.

Camada de Abstração do Hardware

O HAL consiste em vários módulos e bibliotecas, e cada um deles implementa a interface específica para um componente do hardware, como a câmera ou o áudio. Quando uma API framework faz uma chamada para usar um recurso, o Android carrega a biblioteca HAL que contém a implementação para esse componente do hardware.

▶️ Ambiente de Execução Android (Runtime)

A partir da versão 5.0 do Android (API de nível 21), cada aplicativo executa o seu próprio processo, com uma instância própria do Android Runtime (ART).

Ambiente de Execução Android

O ART é a máquina virtual principal do Android e foi projetado para executar múltiplas instâncias em dispositivos com memória limitada. Ele opera utilizando os arquivos no formato Dalvik Executable (DEX), que é um formato de bytecode feito exclusivamente para o Android e otimizado para um consumo mínimo de memória.

🧱 Bibliotecas C/C++ nativas

Os componentes essenciais do Android, como o ART e o HAL, são construídos através de C/C++. O Android fornece a API Framework Java que expõe as funcionalidades nativas.

Bibliotecas C/C++ nativas

Por exemplo, é possível acessar a OpenGL ES pela API Java OpenGL da estrutura do Android para adicionar a capacidade de desenhar e manipular gráficos 2D e 3D do seu app.

Também é possível programar nativamente em C/C++ para o Android utilizando o Android NDK, que é possível acessar nativamente as bibliotecas da plataforma.

☕ Java API Framework

Um conjunto completo para o desenvolvimento de aplicações no Android está disponível através de API's programadas em Java. Essa API forma um bloco de código para ser reutilizada na criação do seu app, simplificando assim a construção de serviços ou sistemas modulares e principal.

Java API Framework
Composto por:
  • Sistema de Visualização (View), usado para criar a UI dos seus apps.
  • Provedores de Conteúdos (Content Providers), que permitem o compartilhamento de dados entre os apps, sendo assim, um app pode acessar os dados de outros apps, caso a permissão seja concedida.
  • Gerenciadores (Manager), responsável pelo gerenciamento dos recursos do SO Android.
    • Gerenciadores de Recursos (Resource Manager), que permitem acesso a recursos sem códigos.
    • Gerenciadores de Notificação (Notification Manager), permitem que você personalize as notificações do seu app na barra de status do usuário.
    • Gerenciador de Atividade (Activity Manager), gerencia o ciclo de vida dos apps.

📱 Apps do Sistema

O Android já disponibiliza apps instalados de fábrica, mas eles não têm mais prioridade que os apps instalados pelo usuário; a mbos têm status iguais diante do Sistema Operacional Android.

Apps do Sistema

Além disso, é aqui que seu aplicativo está dentro da Arquitetura do Android.

⚒️ Linguagens Nativas de Apps Android

Atualmente, o Google recomenda o uso da linguagem de programação Kotlin para o desenvolvimento nativo de aplicativos Android. Anteriormente, as aplicações eram predominantemente escritas utilizando a linguagem de programação Java. O Kotlin e o Java possuem interoperabilidade total, o que significa que é possível misturar e reutilizar código de ambas as linguagens na criação de um único aplicativo.

🌊 Fluxo da Compilação

O processo de compilação para ambas as linguagens é semelhante no ecossistema Android, mas envolve etapas e nomes específicos:

Imagem do Fluxo dos Apps

O processo de compilação e execução de aplicativos Android segue as seguintes etapas:

  1. 1. Java/Kotlin para Bytecode JVM
    • Ao escrever código em Java ou Kotlin, o compilador da respectiva linguagem (o compilador Java ou o compilador Kotlin) irá gerar um código intermediário chamado Java Bytecode (ou simplesmente Bytecode).
    • No caso do Kotlin, ele utiliza uma biblioteca padrão chamada de Kotlin Standard Library (stdlib). O compilador Kotlin gera o mesmo Java Bytecode que o código Java.
  2. 2. Bytecode JVM para Bytecode DEX
    • No Android, esse Java Bytecode é então convertido por uma ferramenta chamada D8 (ou, em projetos mais antigos, DX) para um formato otimizado chamado Dalvik Executable (.dex).
  3. Execução (Android Runtime - ART)
    • O Android utiliza um ambiente de execução chamado Android Runtime (ART), que substituiu o antigo Dalvik.
    • O ART pega o arquivo DEX (que contém o bytecode DEX) e o executa no dispositivo do usuário, geralmente realizando uma compilação Ahead-of-Time (AOT) ou Just-in-Time (JIT) para código de máquina otimizado.