Testar o desenvolvimento para Android

Este tutorial permite conhecer o desenvolvimento do sistema operacional Android pela primeira vez.

Configuração para desenvolvimento em Android

Antes de baixar e criar a ramificação main da origem do Android, confira se o hardware atende aos requisitos e se o software necessário está instalado corretamente. Você também precisa conhecer estes termos:

Git
O Git é um sistema de controle de versões distribuído, de código aberto e gratuito. O Android usa o Git para operações locais, como ramificações, commits, diferenças e edições. Para aprender a usar o Git, consulte a documentação relevante (em inglês).
Repo
Repo é um wrapper Python baseado no Git que simplifica a execução de operações complexas em vários repositórios Git. O Repo não substitui o Git para todas as operações de controle de versões, apenas facilita operações complexas do Git. Ele usa arquivos de manifesto para agregar projetos do Git no superprojeto do Android.
Arquivo de manifesto
Um arquivo de manifesto é um arquivo XML que especifica onde os vários projetos Git na origem do Android são posicionados na árvore de origem do AOSP.

Atender aos requisitos de hardware

Sua estação de trabalho de desenvolvimento precisa atender ou exceder estes requisitos de hardware:

  • Um sistema x86 de 64 bits.

  • Pelo menos 400 GB de espaço livre em disco para verificar e criar o código (250 GB para verificar + 150 GB para criar).

  • Mínimo de 64 GB de RAM. O Google usa máquinas de 72 núcleos com 64 GB de RAM para criar para o Android. Com essa configuração de hardware, um build completo do Android leva aproximadamente 40 minutos e um build incremental apenas alguns minutos. Por outro lado, leva aproximadamente 6 horas para um build completo com uma máquina de 6 núcleos com 64 GB de RAM.

Atender aos requisitos do sistema operacional

Sua estação de trabalho de desenvolvimento precisa executar uma distribuição de Linux de 64 bits com a biblioteca GNU C (glibc) 2.17 ou mais recente.

Instalar os pacotes necessários

Para instalar os pacotes necessários para Ubuntu 18.04 ou mais recente, execute este comando:

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

Instalar o software necessário

Antes de poder trabalhar com AOSP, você precisa instalar o OpenJDK, Make, Python 3 e Repo. A principal ramificação AOSP do Android vem com versões pré-criadas do OpenJDK, Make e Python 3. Etapas extra de instalação não são necessárias. A seção abaixo explica como instalar o Repo.

Instalar o Repo

Siga estas etapas para instalar o Repo:

  1. Faça o download das informações do pacote atual:

    sudo apt-get update
  2. Execute o comando abaixo para instalar o inicializador do Repo:

    sudo apt-get install repo

    O inicializador do Repo fornece um script Python que faz o download e a instalação da ferramenta do Repo completa.

    Se isso der certo, pule para a etapa 4.

  3. (opcional) Instale manualmente o Repo usando estes comandos:

    export REPO=$(mktemp /tmp/repo.XXXXXXXXX)
    curl -o ${REPO} https://storage.googleapis.com/git-repo-downloads/repo
    gpg --recv-keys 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65
    curl -s https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ${REPO} && install -m 755 ${REPO} ~/bin/repo

    Os três primeiros comandos configuram um arquivo temporário, fazem o download do Repo para o arquivo e verificam se a chave fornecida corresponde à chave necessária. Se os comandos tiverem sucesso, o comando final vai instalar o inicializador do Repo.

  4. Confira a versão do inicializador do Repo:

    repo version

    A saída precisa indicar a versão 2.4 ou mais recente. Por exemplo:

    repo launcher version 2.45

Baixar a origem do Android

A origem do Android fica em uma coleção de repositórios Git hospedados pelo Google. Cada repositório Git inclui todo o histórico do Android, incluindo mudanças na origem e quando elas foram feitas. Para baixar a origem do Android, siga estas etapas:

  1. Navegue até o diretório principal:

    cd ~
  2. Crie um subdiretório de trabalho local dentro dele:

    mkdir aosp
  3. Navegue até o diretório:

    cd aosp
  4. Inicialize a ramificação main do código-fonte do repositório AOSP (o padrão):

    repo init --partial-clone -b main -u https://android.googlesource.com/platform/manifest
  5. Insira ou aceite suas credenciais do Git (nome, endereço de e-mail).

  6. Sincronize o código-fonte:

    repo sync -c -j8

    Se tiver problemas durante o download, consulte Solucionar e resolver problemas de sincronização.

Criar o código

Para criar o código, siga estas etapas:

  1. No diretório de trabalho, crie o script envsetup.sh para configurar seu ambiente de build:

    source build/envsetup.sh
  2. Especifique um tipo de dispositivo de destino e use o comando lunch para criação. Um destino é uma permutação do dispositivo, como um modelo ou formato específico. Especifique este destino:

    lunch aosp_cf_x86_64_phone-trunk_staging-userdebug

    Você vai ver uma sinopse do destino e do ambiente de build:

    ============================================
    PLATFORM_VERSION_CODENAME=VanillaIceCream
    PLATFORM_VERSION=VanillaIceCream
    PRODUCT_INCLUDE_TAGS=com.android.mainline
    TARGET_PRODUCT=aosp_arm
    TARGET_BUILD_VARIANT=eng
    TARGET_ARCH=arm
    TARGET_ARCH_VARIANT=armv7-a-neon
    TARGET_CPU_VARIANT=generic
    HOST_OS=linux
    HOST_OS_EXTRA=Linux-6.5.13-1rodete2-amd64-x86_64-Debian-GNU/Linux-rodete
    HOST_CROSS_OS=windows
    BUILD_ID=AOSP.MAIN
    OUT_DIR=out
    ============================================
    
  3. Crie o destino:

    m

A conclusão do primeiro build leva horas. Os próximos builds levam muito menos tempo. A saída do seu build aparece em $OUT_DIR.

Iniciar o Cuttlefish

O Cuttlefish é o emulador do Android usado para testar seus builds.

  1. Execute os comandos abaixo para baixar, criar e instalar os pacotes host do Debian:

    sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curl
    git clone https://github.com/google/android-cuttlefish
    cd android-cuttlefish
    for dir in base frontend; do
    pushd $dir
    # Install build dependencies
    sudo mk-build-deps -i
    dpkg-buildpackage -uc -us
    popd
    done
    sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f
    sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f
    sudo usermod -aG kvm,cvdnetwork,render $USER
    sudo reboot

    A reinicialização aciona a instalação de outros módulos do kernel e aplica as regras udev.

  2. Inicie o Cuttlefish:

    launch_cvd --daemon
    
  3. Conecte o dispositivo Cuttlefish acessando https://localhost:8443 no navegador da Web. Seu dispositivo virtual com tecnologia Android será mostrado.

Fazer uma mudança

Atualize o código-fonte de acordo com esta lista de mudanças.

  1. Na raiz do checkout (diretório aosp/), navegue até o projeto frameworks/native do Git:

    cd frameworks/native
  2. Inicie um projeto temporário com este comando:

    repo start <some-name> .
  3. Use o editor para editar SurfaceFlinger.cpp neste local:

    aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
    
  4. Encontre esta linha:

    void SurfaceFlinger::updateColorMatrixLocked() {
    
  5. No início de updateColorMatrixLocked(), adicione esta linha:

    mClientColorMatrix = mat4(vec4{1.0f, 0.0f, 0.0f, 0.0f}, vec4{0.0f, -1.0f, 0.0f, 0.0f},
                              vec4{0.0f, 0.0f, -1.0f, 0.0f}, vec4{0.0f, 1.0f, 1.0f, 1.0f});
    
  6. Crie o código:

    m
  7. Atualize o build no dispositivo:

    adb root
    adb remount -R
    adb root
    adb sync
    adb reboot
  8. Confira se você nota uma mudança de cor no dispositivo selecionado parecida com o mostrado na Figura 1.

    Exemplo de uma mudança de cor bem-sucedida

    Figura 1. Aparência da tela após a mudança de cor.

Corrigir um teste

Esta parte do codelab usa um exemplo de teste que está na árvore de origem e que apresenta falha.

Para executar, depurar e corrigir o teste, siga estas instruções:

  1. Execute:

    atest DevCodelabTest

    O teste vai falhar.

  2. Examine o stack trace do teste com falha:

    STACKTRACE:
    java.lang.AssertionError
     at org.junit.Assert.fail(Assert.java:87)
     at org.junit.Assert.assertTrue(Assert.java:42)
     at org.junit.Assert.assertTrue(Assert.java:53)
     at android.test.example.devcodelab.DevCodelabTest.testHelloWorld(DevCodelabTest.java:29)

    A última linha do stack trace mostra o teste com falha (testHelloWorld). Esse teste está em um arquivo chamado DevCodelabTest.java.

  3. Para determinar a localização do teste que precisa de correção, adicione WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/ à última linha do stack trace até (e incluindo) o nome do arquivo de teste. Assim, android.test.example.devcodelab.DevCodelabTest se torna WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java.

  4. Edite platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java e substitua Assert.assertTrue(false) por Assert.assertTrue(true).

  5. Execute o teste de novo para conferir se o problema foi corrigido:

    atest DevCodelabTest

Fazer upload do código para revisão

O Repo simplifica o uso do Git porque agrupa comandos como git clone para funcionar em vários repositórios Git (ou projetos) de uma só vez.

Para a análise de código dos seus projetos no Git, use o sistema de revisão de código baseado na Web, Gerrit (link em inglês).

  1. Depois de ter feito as mudanças no projeto frameworks/native, execute estes comandos para fazer upload delas:

    cd frameworks/native
    repo start codelab .
    git add .
    git commit
  2. Na mensagem de commit, insira o seguinte:

    Android codelab change
    Test: manual atest
    
  3. Faça upload da sua mudança:

    repo upload

    Quando o upload for concluído, você verá uma mensagem parecida com esta:

    Upload project frameworks/native/ to remote branch main:
     branch codelab ( 1 commit, Wed Aug 7 09:32:33 2019 -0700):
            ff46b36d android codelab change
    to https://android-review.googlesource.com/ (y/N)? y
    remote: Processing changes: refs: 1, new: 1, done
    remote:
    remote: SUCCESS
    remote:
    remote:   https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432 android codelab change [NEW]
    remote:
    To https://android-review.googlesource.com/platform/frameworks/native
    * [new branch]          codelab -> refs/for/main
    

Ver a mudança no Gerrit

Para ver sua mudança no Gerrit, navegue até a saída do link no terminal. O link tem esta aparência:

https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432

Reverter a mudança

Normalmente, após o teste, a revisão e a aprovação, você envia e integra a mudança do Gerrit no repositório. Em vez disso, para os fins deste codelab, reverta seu trabalho:

  1. No Gerrit, clique em Abandon.

  2. Abandone a ramificação temporária associada no diretório do projeto frameworks/native ou nos subdiretórios dele:

    repo abandon codelab .
  3. Reverta as mudanças feitas no arquivo de teste. Como você não executou repo start, git commit e repo upload na mudança de teste, é possível redefinir o arquivo em si. Supondo que você esteja no aosp/platform_testing directory, use o comando abaixo para redefinir o arquivo:

    git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
    git checkout .

Isso conclui o codelab para desenvolvimento da plataforma Android.

Ajuda

Se você encontrar erros neste codelab, informe-os no link do Issue Tracker na parte de baixo de qualquer uma das páginas. Envie perguntas para o grupo android-building (em inglês).

Digite ps -A | grep crosvm para ver se crosvm já está em execução. Se crossvm estiver em execução, digite stop_cvd || true ou kill crosvm com o processo PID.