AOSP · 12 min read · Nov 26, 2025
Construindo e flashando uma versão AOSP segura com boot verificado e senha de tela de bloqueio separada para o Nexus 5X

Isenção de responsabilidade e Licença
Todos os dados e informações fornecidos neste tutorial são apenas para fins informativos. O autor não faz representações quanto à precisão, completude, atualidade, adequação ou validade de qualquer informação neste tutorial e não será responsável por quaisquer erros, omissões ou atrasos nesta informação ou quaisquer perdas, lesões ou danos decorrentes de sua exibição ou uso. Todas as informações são fornecidas na forma como estão.
Em nenhuma circunstância, o autor ou o howtoforge será responsável por qualquer perda ou dano, incluindo, sem limitação, perda ou dano indireto ou consequencial, ou qualquer perda ou dano de qualquer tipo decorrente da perda de dados ou lucros resultantes do uso deste tutorial.
Exceto conforme indicado de outra forma, o conteúdo desta página está licenciado sob a Licença Creative Commons Atribuição 3.0, e os exemplos de código estão licenciados sob a Licença Apache 2.0.
Motivação
O Nexus 5X e 6P foram os primeiros dispositivos que suportaram boot verificado com base em chaves de assinatura fornecidas pelo usuário (e não impostas pelo fornecedor). Antes de sua “implosão” [1], o CopperheadOS (uma variante AOSP aprimorada em segurança) costumava fornecer boa documentação e scripts para construir e flashar uma versão segura do AOSP [2]. No entanto, o projeto parou de fornecer atualizações nos últimos meses, então a maioria dos antigos usuários está procurando alternativas viáveis.
Minha impressão é que muitos usuários concordam que executar uma ROM AOSP construída por conta própria é uma alternativa muito melhor a outras opções, como mudar para, por exemplo, LineageOS. Existem várias boas razões para isso:
- AOSP é o stock puro e tem apenas alguns recursos possivelmente indesejados
- AOSP pode ser construído como uma variante de build “user” em vez de “userdebug” e, assim, espera-se que seja mais seguro (tentei compilar builds de usuário do LineageOS, mas parecem estar quebradas devido às mudanças invasivas que o LineageOS fez nas fontes do AOSP)
- Uma vez que as fontes são obtidas, o AOSP pode ser simplesmente construído. Ao contrário do LineageOS, ele não começa a baixar fontes adicionais durante a construção.
Como o Nexus 5X é considerado um dispositivo de desenvolvedor bem suportado, eu esperava que o processo de construção do AOSP fosse fácil e bem documentado. No entanto, parece que existem várias ressalvas:
- incluir os binários do fornecedor seguindo a documentação oficial resulta em builds incompletos que não podem ser usados para atualizações incrementais sem desbloquear e limpar a cada vez (a partição do fornecedor, rádio ROM etc. não está incluída na construção)
- a documentação oficial não descreve como usar a build verificada de uma maneira que seja diretamente aplicável. Há uma documentação melhor nos docs do CopperheadOS [05], mas as instruções dependem de scripts desatualizados que não são aplicáveis ao AOSP.
- não há documentação sobre como usar um PIN “fraco” como frase de acesso, mas uma senha forte como chave de criptografia de disco (ao contrário dos dispositivos Pixel mais novos, o Nexus 5X é baseado na abordagem FDE mais antiga). Os métodos que funcionam para dispositivos LineageOS não são aplicáveis, pois assumem que o dispositivo está com root, o que não é o caso para builds de usuário do AOSP.
Este tutorial visa fornecer instruções detalhadas sobre como resolver essas ressalvas, construindo e flashando o AOSP para o Nexus 5X com boot verificado e usando segredos separados de tela de bloqueio/criptografia. Ele também deve se aplicar ao Nexus 6P com pequenas mudanças, mas não consegui testá-lo, pois não tinha um Nexus 6P à mão.
Exceto por uma pequena coleção de scripts (necessários para extrair corretamente os blobs do fornecedor dos binários fornecidos pelo Google) e sua dependência “oatdump” (que é baixada como binário de um compartilhamento público), as instruções não fazem uso de quaisquer recursos de terceiros “não oficiais” (no sentido de “não fornecidos pelo Google”).
Esteja ciente das seguintes questões de liberdade:
- A árvore de fontes do AOSP contém vários binários pré-compilados (por exemplo, toolchain, kernel Linux, …). Embora esses binários possam ser reconstruídos a partir do código-fonte, os passos necessários não estão cobertos neste tutorial.
- O código-fonte para os blobs do fornecedor necessários para usar muitos componentes de hardware do Nexus 5X não está disponível publicamente!
- A ferramenta “android-prepare-vendor” usada para extrair os arquivos proprietários do fornecedor usa binários pré-compilados (alguns até hospedados externamente).
Requisitos e suposições
O tutorial assume que você tem os seguintes pré-requisitos (outras versões/distribuições podem funcionar também, mas podem exigir outros ou pacotes adicionais):
um Nexus 5X com o bootloader desbloqueado (o desbloqueio não é coberto neste tutorial)
máquina (virtual) executando Debian9 na variante x86_64, usada exclusivamente para nosso propósito (assumimos que você usa sudo, se não, adapte os comandos)
pelo menos 5 GB de RAM (mais é melhor)
aproximadamente 200 MB de espaço em disco
conexão de internet rápida (precisamos baixar cerca de 30G de dados)
Instalando dependências
Primeiro, instale as dependências conforme descrito nas instruções de construção do LineageOS [3] (as instruções de construção do AOSP não fornecem esta lista):
sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-devAgora, instale dependências adicionais:
sudo apt install cmake zip unzip openjdk-8-jdk-headlessEm seguida, configure um caminho bin no seu diretório home (no Debian 9, este caminho é configurado automaticamente no perfil bash):
mkdir -p ~/binInstale o comando repo:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repoVerifique o checksum do binário repo. Deve ser e147f0392686c40cfd7d5e6f332c6ee74c4eab4d24e2694b3b0a0c037bf51dc5 para a versão atual 1.23. para versões posteriores, verifique a página de instruções de construção do AOSP [4]. Use o seguinte comando para calcular o checksum:
sha256sum ~/bin/repoEm seguida, forneça uma identidade git executando os seguintes comandos (você pode deixar os dados de exemplo se preferir permanecer anônimo):
git config --global user.email "[email protected]"git config --global user.name "Seu Nome"Infelizmente, o pacote brotli (necessário para empacotar as builds) no Debian 9 é muito antigo, então precisamos construir a versão atual nós mesmos. Primeiro, obtenha o código-fonte e mude para seu diretório:
git clone https://github.com/google/brotli.gitExecute a construção (substitua -j15 pelo número de threads da sua cpu):
cd ~/brotli./configure-cmakemake -j15Finalmente, copie o binário resultante para nosso caminho bin:
cp brotli ~/bin/Finalmente, saia e entre novamente para que seu perfil bash seja lido novamente.
Obtendo os blobs do fornecedor
Existem várias questões ao usar os blobs do fornecedor dos pacotes de drivers binários fornecidos pelo Google (veja [5]). Para resolvê-los, usamos o conjunto de scripts externos “android-prepare-vendor” de “anestisb” que extrai os blobs do fornecedor das imagens de fábrica.
Primeiro, clone o repositório:
git clone https://github.com/anestisb/android-prepare-vendor.gitUsando o site do Google [6], descubra a última tag de Build para o seu Nexus 5X (atualmente é OPM6.171019.030.K1).
Mude para o repositório, crie um diretório de saída e execute o script (executamos o script como root devido a problemas com fuse no Debian 9):
cd android-prepare-vendormkdir bullhead-blobssudo ./execute-all.sh -k -d bullhead -a bullhead -b OPM6.171019.030.K1 -o bullhead-blobsBaixando fontes do AOSP
Nota: Os seguintes passos carecem de instruções para verificar a fonte baixada.
Primeiro, crie um diretório onde as fontes serão armazenadas:
mkdir -p ~/aospSabendo a tag de build atual para o Nexus 5X, descubra qual é a tag correspondente do Android usando a visão geral disponível em [6]. Em seguida, faça checkout do manifesto do Android para o branch correspondente (neste exemplo, usamos android-8.1.0_r46):
cd ~/aosprepo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r46como de costume em XML para comentar repositórios. Eu recomendo excluir/substituir o seguinte:
- o QuickSearchBox está quase quebrado no AOSP de qualquer forma - substitua isso por um repositório que contenha uma árvore de dispositivo corrigida onde os dois núcleos de cpu defeituosos estão desativados. Isso vem com uma penalidade de desempenho de ~30%. No entanto, recomendado, mesmo que você tenha um Nexus 5X que não seja afetado pelo bootloop, pois é provável que seja afetado no futuro. - existem melhores alternativas para o calendário AOSP padrão que você pode instalar depois (como Etar) - Silence.im é uma melhor alternativa para o aplicativo de mensagens AOSP - OpenCamera é uma melhor alternativa para a câmera padrão
Agora, busque todos os repositórios (pode levar um tempo, principalmente dependendo da sua conexão de internet):
repo syncFinalmente, copie os blobs do fornecedor gerados anteriormente como root (isso é necessário, ou qmus e outros blobs estarão faltando e causarão falha na compilação posterior) para o diretório do fornecedor da sua árvore AOSP (substitua o número da build de fábrica pelo atual):
sudo cp -av ~/android-prepare-vendor/bullhead-blobs/bullhead/opm6.171019.030.k1/vendor .sudo cp -av ~/android-prepare-vendor/bullhead-blobs/bullhead/opm6.171019.030.k1/vendor_overlay .Faça seu usuário o proprietário dos diretórios do fornecedor (ou a construção falhará mais tarde). Substitua yourusername pelo seu nome de usuário real:
sudo chown -R yourusername:yourusername ~/aosp/vendorsudo chown -R yourusername:yourusername ~/aosp/vendor_overlayGerando Chaves
Defina as variáveis de construção:
source build/envsetup.shConstrua a ferramenta necessária para gerar a chave de verificação:
make generate_verity_keyCrie um diretório para armazenar suas chaves (os docs do CopperheadOS [2] recomendam usar uma chave separada para cada dispositivo, neste caso bullhead):
mkdir -p keys/bullheadAgora é hora de gerar as chaves (não defina senhas em suas chaves):
cd keys/bullhead../../development/tools/make_key releasekey '/C=DE/ST=Hometown/L=XX/O=yournamehere/OU=yournamehere/CN=yournamehere/[email protected]'../../development/tools/make_key platform '/C=DE/ST=Hometown/L=XX/O=yournamehere/OU=yournamehere/CN=yournamehere/[email protected]'../../development/tools/make_key shared '/C=DE/ST=Hometown/L=XX/O=yournamehere/OU=yournamehere/CN=yournamehere/[email protected]'../../development/tools/make_key media '/C=DE/ST=Hometown/L=XX/O=yournameher /OU=yournamehere/CN=yournamehere/[email protected]'../../development/tools/make_key verity '/C=DE/ST=Hometown/L=XX/O=yournamehere/OU=yournamehere/CN=yournamehere/[email protected]'cd ~/aosp Converta a chave de verificação para o formato exigido pelo AOSP:
out/host/linux-x86/bin/generate_verity_key -convert keys/bullhead/verity.x509.pem keys/bullhead/verity_keyCompilando
Certifique-se de que suas variáveis de construção estejam definidas:
cd ~/aospsource build/envsetup.shCrie uma configuração de lunch para o dispositivo bullhead (substitua user por userdebug se quiser uma configuração userdebug):
lunch aosp_bullhead-userDesative o Jack (ele frequentemente causa problemas de compilação e foi descontinuado no Android 9 de qualquer forma):
export ANDROID_COMPILE_WITH_JACK=falseCompile o pacote de arquivos de destino (substitua -j15 pelo número de threads da sua cpu):
make target-files-package -j15Empacotando e assinando
Crie um diretório para armazenar os arquivos de saída (fora do diretório de construção usual chamado out):
mkdir distExecute o alvo dist (substitua -j15 pelo número de threads da sua cpu):
make dist -j15Crie um pacote de arquivos de destino assinado, substituindo as chaves de teste padrão pelas suas chaves (substitua yourusername pelo seu nome de usuário real no sistema):
build/tools/releasetools/sign_target_files_apks -o -d keys/bullhead --replace_verity_public_key keys/bullhead/verity_key.pub --replace_verity_private_key keys/bullhead/verity --replace_verity_keyid keys/bullhead/verity.x509.pem out/dist/aosp_bullhead-target_files-eng.yourusername.zip dist/signed-target-files.zipCrie um pacote OTA assinado:
build/tools/releasetools/ota_from_target_files -k keys/bullhead/releasekey dist/signed-target-files.zip dist/signed-ota-update.zipFlashando
Inicie seu dispositivo Nexus 5X no bootloader (segure o volume para baixo e, em seguida, pressione o botão de energia).
Conecte seu dispositivo via USB à sua máquina (e torne-o disponível para a VM caso você construa em uma VM). Você também pode copiar o conteúdo do diretório dist para outra máquina e flashar a partir de lá, mas assumimos que você flasha usando os binários fastboot/adb construídos a partir das fontes do AOSP (se você flashar de fora, certifique-se de que seu binário fastboot esteja atualizado).
Descompacte as imagens do signed-target-files.zip:
cd ~/aosp/distunzip `signed-target-files.zip IMAGES/*
`Agora, flash todas as imagens:
../out/host/linux-x86/bin/fastboot flash boot boot.img../out/host/linux-x86/bin/fastboot flash recovery recovery.img../out/host/linux-x86/bin/fastboot flash vendor vendor.img../out/host/linux-x86/bin/fastboot flash system system.imgSelecione “reiniciar sistema” usando os botões físicos do seu dispositivo e certifique-se de que seu novo sistema funcione.
Finalmente, reinicie de volta para o bootloader e bloqueie-o novamente (isso apagará todos os dados):
out/host/linux-x86/bin/fastboot flash oem lockingÉ isso!
Definindo segredos de boot/tela de bloqueio separados
Definir uma senha de boot/tela de bloqueio separada pode ser feito com um pequeno truque:
- Desbloqueie o bootloader (apaga todos os dados)
- compile e flash uma build userdebug (veja acima)
- bloqueie o bootloader
- defina um PIN/senha de tela de bloqueio usando a interface do Android. Certifique-se de escolher o correto, pois você não poderá mudá-lo novamente sem apagar seus dados uma vez que você mude para a build user.
- conecte-se ao dispositivo via adb
- como root, execute o seguinte comando: vdc cryptfs changepw password sua-nova-senha
- reinicie e certifique-se de que funcione
- compile uma build user regular (não desbloqueie o bootloader!)
- flash a build user
Nota: Sem etapas adicionais, a recuperação não permite flashar builds mais antigas. Assim, você precisa flashar uma build user que seja mais nova que sua build userdebug!
Tratando atualizações
Se você quiser atualizar para uma versão mais nova do AOSP, primeiro precisa descobrir o novo número da versão.
Em seguida, limpe o antigo manifesto (faça um backup, caso tenha feito alterações que deseja refazer na versão atualizada):
cd ~/aosprm -rf .repo/manifests.gitrm -rf .repo/manifest.xmlAlém disso, limpe os blobs do fornecedor (então desatualizados) e o repositório prepare-vendor:
rm -rf ~/android-prepare-vendorrm -rf vendorrm -rf vendor_overlayAlém disso, limpe a árvore de construção e os artefatos de construção:
rm -rf outrm -rf distEm seguida, refaça APENAS os seguintes passos:
- Obtendo os blobs do fornecedor
- Baixando fontes do AOSP (isso será muito mais rápido, porque apenas as mudanças serão puxadas)
- Compilando
- Empacotando e assinando
Na teoria, você deve ser capaz de sideload atualizações como novos pacotes OTA da recuperação sem apagar (já que será assinado com as mesmas - suas - chaves). Na prática, isso ainda não funciona (veja a próxima seção). Lá, você também terá que proceder da seguinte forma:
- Faça backup de todos os seus dados
- Desbloqueie o bootloader (seus dados serão apagados)
- Flash as imagens atualizadas e bloqueie novamente seu bootloader conforme descrito na seção “Flashando”
WIP: Atualizações OTA assinadas
Esta seção está em WIP, as instruções descritas ainda não funcionam!
Na teoria, deve ser possível criar e flashar atualizações OTA assinadas a partir da recuperação. No entanto, todas as minhas tentativas de fazer isso resultaram em um erro de “Verificação de assinatura falhou”. Como isso funciona ao usar os arquivos do fornecedor fornecidos pelo Google diretamente em vez de usar android-prepare-vendor, eu assumo que está relacionado aos arquivos do fornecedor ou outros arquivos (como as imagens do bootloader ou rádio) não estarem devidamente assinados.
Crie o pacote OTA assinado da seguinte forma:
build/tools/releasetools/ota_from_target_files -k keys/bullhead/releasekey dist/signed-target-files.zip dist/signed-ota-update.zipReinicie para a recuperação usando os botões físicos do seu dispositivo.
Na recuperação, você verá um pequeno símbolo do android. Mantenha pressionado o botão de energia e pressione o volume para cima para entrar no menu de recuperação.
Agora, selecione “atualizar via adb” usando os botões físicos do seu dispositivo.
Sideload seu pacote OTA assinado:
out/host/linux-x86/bin/adb sideload dist/`signed-ota-update.zip`Referências
[1] https://www.reddit.com/r/CopperheadOS/comments/8qdnn3/goodbye/
[2] https://copperhead.co/android/docs/building
[3] https://wiki.lineageos.org/devices/bullhead/build
[4] https://source.android.com/setup/build/downloading
[5] https://github.com/anestisb/android-prepare-vendor
[6] https://source.android.com/setup/start/build-numbers.html#source-code-tags-and-builds
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.