AOSP Build · 12 min read · Nov 26, 2025
Costruire e flashare una build AOSP sicura con boot verificato e password separata per lo schermo di blocco per il Nexus 5X

Disclaimer e Licenza
Tutti i dati e le informazioni forniti in questo tutorial sono solo a scopo informativo. L’autore non fa alcuna dichiarazione riguardo l’accuratezza, completezza, attualità, idoneità o validità di qualsiasi informazione in questo tutorial e non sarà responsabile per eventuali errori, omissioni o ritardi in queste informazioni o per eventuali perdite, infortuni o danni derivanti dalla loro visualizzazione o utilizzo. Tutte le informazioni sono fornite così come sono.
In nessun caso, l’autore o howtoforge sarà responsabile per qualsiasi perdita o danno, inclusa, senza limitazioni, perdita o danno indiretto o consequenziale, o qualsiasi perdita o danno derivante dalla perdita di dati o profitti derivanti da, o in connessione con, l’uso di questo tutorial.
Salvo diversa indicazione, il contenuto di questa pagina è concesso in licenza sotto la Licenza Creative Commons Attribution 3.0, e i campioni di codice sono concessi in licenza sotto la Licenza Apache 2.0.
Motivazione
Il Nexus 5X e 6P sono stati i primi dispositivi a supportare il boot verificato basato su chiavi di firma fornite dall’utente (e non imposte dal fornitore). Prima della sua “implosione” [1], CopperheadOS (una variante AOSP migliorata per la sicurezza) forniva una buona documentazione e script per costruire e flashare una versione AOSP sicura [2]. Tuttavia, il progetto ha smesso di fornire aggiornamenti negli ultimi mesi, quindi la maggior parte degli ex utenti sta cercando alternative valide.
La mia impressione è che molti utenti concordino sul fatto che eseguire una ROM AOSP auto-costruita sia un’alternativa molto migliore rispetto ad altre opzioni come passare a e.g. LineageOS. Ci sono diversi buoni motivi per questo:
- AOSP è stock puro e ha solo poche funzionalità potenzialmente indesiderate
- AOSP può essere costruito come build “user” invece di “userdebug” e, quindi, ci si aspetta che sia più sicuro (ho provato a compilare build user di LineageOS, ma sembrano essere rotte a causa delle modifiche invasive apportate da LineageOS ai sorgenti AOSP)
- Una volta recuperati i sorgenti, AOSP può essere semplicemente costruito. A differenza di LineageOS, non inizia a scaricare sorgenti aggiuntive durante la costruzione.
Poiché si crede che il Nexus 5X sia un dispositivo per sviluppatori ben supportato, mi aspettavo che il processo di costruzione di AOSP fosse facile e ben documentato. Tuttavia, si scopre che ci sono diverse avvertenze:
- includere i binari del fornitore seguendo la documentazione ufficiale porta a build incomplete che non possono essere utilizzate per aggiornamenti incrementali senza sbloccare e cancellare ogni volta (la partizione del fornitore, radio ROM ecc. non è inclusa nella build)
- la documentazione ufficiale non descrive come utilizzare la build verificata in un modo che sia direttamente applicabile. C’è una documentazione migliore nei documenti di CopperheadOS [05], ma le istruzioni si basano su script obsoleti che non sono applicabili per AOSP.
- non c’è documentazione su come utilizzare un PIN “debole” come passphrase ma una password forte come chiave di crittografia del disco (a differenza dei dispositivi Pixel più recenti, il Nexus 5X si basa sull’approccio FDE più vecchio). I metodi che funzionano per i dispositivi LineageOS non sono applicabili poiché presumono che il dispositivo sia rootato, il che non è il caso per le build utente AOSP regolari.
Questo tutorial mira a fornire istruzioni dettagliate su come risolvere queste avvertenze, costruendo e flashando AOSP per il Nexus 5X con boot verificato e utilizzando segreti separati per lo schermo di blocco/crittografia. Dovrebbe applicarsi anche al Nexus 6P con piccole modifiche, ma non sono stato in grado di testarlo poiché non avevo un Nexus 6P a disposizione.
Salvo una piccola raccolta di script (necessaria per estrarre correttamente i blob del fornitore dai binari forniti da Google) e la sua dipendenza “oatdump” (che viene scaricata come binario da una condivisione pubblica), le istruzioni non fanno uso di alcuna risorsa di terze parti “non ufficiale” (nel senso di “non fornita da Google”).
Fai attenzione ai seguenti problemi di libertà:
- L’albero sorgente AOSP contiene un certo numero di binari precompilati (e.g. toolchain, kernel Linux, …). Anche se questi binari potrebbero essere ricostruiti a partire dal sorgente, i passaggi necessari non sono coperti in questo tutorial.
- Il codice sorgente per i blob del fornitore necessari per utilizzare molti componenti hardware del Nexus 5X non è disponibile pubblicamente!
- Lo strumento “android-prepare-vendor” utilizzato per estrarre i file proprietari del fornitore utilizza a sua volta binari precompilati (alcuni anche ospitati esternamente).
Requisiti e assunzioni
Il tutorial presuppone che tu abbia i seguenti prerequisiti (altre versioni/distribuzioni potrebbero funzionare ma potrebbero richiedere pacchetti diversi o aggiuntivi):
un Nexus 5X con bootloader sbloccato (lo sblocco non è coperto in questo tutorial)
macchina (virtuale) che esegue Debian9 nella variante x86_64, utilizzata esclusivamente per il nostro scopo (presumiamo che tu utilizzi sudo, in caso contrario, adatta i comandi)
almeno 5 GB di RAM (meglio di più)
circa 200 MB di spazio su disco
connessione internet veloce (dobbiamo scaricare circa 30G di dati)
Installazione delle dipendenze
Per prima cosa, installa le dipendenze come descritto nelle istruzioni di build di LineageOS [3] (le istruzioni di build AOSP non forniscono questa 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-devOra, installa dipendenze aggiuntive:
sudo apt install cmake zip unzip openjdk-8-jdk-headlessPoi, imposta un percorso bin nella tua home directory (in Debian 9 questo percorso è configurato automaticamente nel profilo bash):
mkdir -p ~/binInstalla il comando repo:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repoVerifica il checksum del binario repo. Dovrebbe essere e147f0392686c40cfd7d5e6f332c6ee74c4eab4d24e2694b3b0a0c037bf51dc5 per la versione attuale 1.23. per versioni successive controlla la pagina delle istruzioni di build AOSP [4]. Usa il seguente comando per calcolare il checksum:
sha256sum ~/bin/repoSuccessivamente, fornisci un’identità git eseguendo i seguenti comandi (puoi lasciare i dati di esempio se preferisci rimanere anonimo):
git config --global user.email "[email protected]"git config --global user.name "Il tuo Nome"Sfortunatamente, il pacchetto brotli (richiesto per impacchettare le build) in Debian 9 è troppo vecchio, quindi dobbiamo costruire noi stessi la versione attuale. Prima ottieni il codice sorgente e cambia nella sua directory:
git clone https://github.com/google/brotli.gitEsegui la build (sostituisci -j15 con il numero dei tuoi thread cpu):
cd ~/brotli./configure-cmakemake -j15Infine, copia il binario risultante nel nostro percorso bin:
cp brotli ~/bin/Infine, esci e accedi di nuovo in modo che il tuo profilo bash venga riletto.
Ottenere i blob del fornitore
Ci sono diversi problemi con l’utilizzo dei blob del fornitore dai pacchetti di driver binari forniti da Google (vedi [5]). Per risolverli, utilizziamo il set di script esterni “android-prepare-vendor” di “anestisb” che estrae i blob del fornitore dalle immagini di fabbrica invece.
Per prima cosa, clona il repository:
git clone https://github.com/anestisb/android-prepare-vendor.gitUtilizzando il sito di Google [6], scopri l’ultima Build tag per il tuo Nexus 5X (attualmente è OPM6.171019.030.K1).
Cambia nel repository, crea una directory di output ed esegui lo script (eseguiamo lo script come root a causa di problemi con fuse in Debian 9):
cd android-prepare-vendormkdir bullhead-blobssudo ./execute-all.sh -k -d bullhead -a bullhead -b OPM6.171019.030.K1 -o bullhead-blobsScaricare i sorgenti AOSP
Nota: I seguenti passaggi mancano di istruzioni per verificare il sorgente scaricato.
Per prima cosa, crea una directory dove verranno memorizzati i sorgenti:
mkdir -p ~/aospSapendo l’attuale tag di build per il Nexus 5X, scopri qual è il corrispondente tag Android utilizzando la panoramica disponibile su [6]. Poi, checkout il manifest Android per il ramo corrispondente (in questo esempio, usiamo android-8.1.0_r46):
cd ~/aosprepo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r46come al solito in XML per commentare i repository. Ti consiglio di escludere/sostituire i seguenti:
- il QuickSearchBox è per lo più rotto in AOSP comunque - sostituisci questo con un repository che contiene un albero del dispositivo patchato dove i due core cpu difettosi sono disabilitati. Questo comporta una penalità di prestazioni di circa il 30%. Tuttavia, è raccomandato, anche se hai un Nexus 5X che non è affetto dal bootloop, poiché è probabile che sarà colpito in futuro. - ci sono alternative migliori al calendario stock di AOSP che puoi installare in seguito (come Etar) - Silence.im è un’alternativa migliore per l’app di messaggistica AOSP - OpenCamera è un’alternativa migliore per la fotocamera stock
Ora, recupera tutti i repository (può richiedere molto tempo, principalmente a seconda della tua connessione internet):
repo syncInfine, copia i blob del fornitore precedentemente generati come root (questo è necessario, altrimenti qmus e altri blob mancheranno e causeranno un fallimento di compilazione successivo) nella directory vendor del tuo albero AOSP (sostituisci il numero di build di fabbrica con quello attuale):
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 .Rendi il tuo utente il proprietario delle directory vendor (altrimenti la build fallirà in seguito). Sostituisci yourusername con il tuo nome utente effettivo:
sudo chown -R yourusername:yourusername ~/aosp/vendorsudo chown -R yourusername:yourusername ~/aosp/vendor_overlayGenerazione delle Chiavi
Imposta le variabili di build:
source build/envsetup.shCostruisci lo strumento necessario per generare la chiave di verità:
make generate_verity_keyCrea una directory per memorizzare le tue chiavi (i documenti CopperheadOS [2] raccomandano di utilizzare una chiave separata per ogni dispositivo, in questo caso bullhead):
mkdir -p keys/bullheadOra è il momento di generare le chiavi (non impostare password sulle tue chiavi):
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 Converti la chiave di verità nel formato richiesto da AOSP:
out/host/linux-x86/bin/generate_verity_key -convert keys/bullhead/verity.x509.pem keys/bullhead/verity_keyCompilazione
Assicurati che le tue variabili di build siano impostate:
cd ~/aospsource build/envsetup.shCrea una configurazione lunch per il dispositivo bullhead (sostituisci user con userdebug se desideri una configurazione userdebug invece):
lunch aosp_bullhead-userDisabilita Jack (spesso causa problemi di compilazione ed è stato deprecato in Android 9 comunque):
export ANDROID_COMPILE_WITH_JACK=falseCompila il pacchetto dei file di destinazione (sostituisci -j15 con il numero dei tuoi thread cpu):
make target-files-package -j15Imballaggio e firma
Crea una directory per memorizzare i file di output (al di fuori della solita directory di build chiamata out):
mkdir distEsegui il target dist (sostituisci -j15 con il numero dei tuoi thread cpu):
make dist -j15Crea un pacchetto di file di destinazione firmato, sostituendo le chiavi di test predefinite con le tue chiavi (sostituisci yourusername con il tuo nome utente effettivo nel 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.zipCrea un pacchetto OTA firmato:
build/tools/releasetools/ota_from_target_files -k keys/bullhead/releasekey dist/signed-target-files.zip dist/signed-ota-update.zipFlashing
Avvia il tuo dispositivo Nexus 5X nel bootloader (tieni premuto il volume giù, poi premi accensione).
Collega il tuo dispositivo tramite USB al tuo computer (e rendilo disponibile alla VM nel caso tu stia costruendo in una VM). Puoi anche copiare i contenuti dalla directory dist su un altro computer e flashare da lì, ma presumiamo che tu flashi utilizzando i binari fastboot/adb costruiti dai sorgenti AOSP (se flashi da fuori, assicurati che il tuo binario fastboot sia recente).
Estrai le immagini da signed-target-files.zip:
cd ~/aosp/distunzip `signed-target-files.zip IMAGES/*
`Ora, flasha tutte le immagini:
../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.imgSeleziona “riavvia sistema” utilizzando i pulsanti fisici del tuo dispositivo e assicurati che il tuo nuovo sistema funzioni.
Infine, riavvia nel bootloader e ri-bloccalo (cancellerà tutti i dati):
out/host/linux-x86/bin/fastboot flash oem lockingEcco fatto!
Impostare segreti di avvio/schermo di blocco separati
Impostare una password di avvio/schermo di blocco separata può essere fatto con un piccolo trucco:
- Sblocca il bootloader (cancella tutti i dati)
- compila e flasha una build userdebug (vedi sopra)
- blocca il bootloader
- imposta un PIN/password per lo schermo di blocco utilizzando l’interfaccia utente di Android. Assicurati di scegliere quello giusto perché non potrai cambiarlo di nuovo senza cancellare i tuoi dati una volta che passerai alla build utente.
- connettiti al dispositivo tramite adb
- come root, esegui il seguente comando: vdc cryptfs changepw password your-new-password
- riavvia e assicurati che funzioni
- compila una build utente regolare (non sbloccare il bootloader!)
- flasha la build utente
Nota: Senza passaggi aggiuntivi, il recovery non consente di flashare build più vecchie. Quindi, devi flashare una build utente che sia più recente della tua build userdebug!
Gestire gli aggiornamenti
Se desideri aggiornare a una nuova versione AOSP, devi prima scoprire il nuovo numero di versione.
Poi, cancella il vecchio manifest (fai un backup, nel caso tu abbia apportato modifiche che desideri ripetere su quello aggiornato):
cd ~/aosprm -rf .repo/manifests.gitrm -rf .repo/manifest.xmlInoltre, cancella i blob del fornitore (allora obsoleti) e il repository prepare-vendor:
rm -rf ~/android-prepare-vendorrm -rf vendorrm -rf vendor_overlayInoltre, pulisci l’albero di build e gli artefatti di build:
rm -rf outrm -rf distPoi, ripeti SOLO i seguenti passaggi:
- Ottenere i blob del fornitore
- Scaricare i sorgenti AOSP (questo sarà molto più veloce, perché verranno recuperate solo le modifiche)
- Compilare
- Imballare e firmare
In teoria, dovresti essere in grado di sideload aggiornamenti come nuovi pacchetti OTA dal recovery senza cancellare (poiché sarà firmato con le stesse - tue - chiavi). In pratica, non funziona ancora (vedi la sezione successiva). Lì, dovrai anche procedere come segue:
- Esegui il backup di tutti i tuoi dati
- Sblocca il bootloader (i tuoi dati verranno cancellati)
- Flasha le immagini aggiornate e ri-blocca il tuo bootloader come descritto nella sezione “Flashing”
WIP: Aggiornamenti OTA firmati
Questa sezione è WIP, le istruzioni descritte non funzionano ancora!
In teoria, dovrebbe essere possibile creare e flashare aggiornamenti OTA firmati dal recovery. Tuttavia, tutti i miei tentativi di farlo hanno portato a un errore di “Verifica della firma fallita”. Poiché questo funziona quando si utilizzano direttamente i file del fornitore forniti da Google invece di utilizzare android-prepare-vendor, presumo che sia correlato ai file del fornitore o ad altri file (come le immagini del bootloader o della radio) non firmati correttamente.
Crea il pacchetto OTA firmato come segue:
build/tools/releasetools/ota_from_target_files -k keys/bullhead/releasekey dist/signed-target-files.zip dist/signed-ota-update.zipRiavvia nel recovery utilizzando i pulsanti fisici del tuo dispositivo.
In recovery, vedrai un piccolo simbolo android. Tieni premuto il pulsante di accensione e premi volume su per accedere al menu di recovery.
Ora, seleziona “aggiorna da adb” utilizzando i pulsanti fisici del tuo dispositivo.
Sideload il tuo pacchetto OTA firmato:
out/host/linux-x86/bin/adb sideload dist/`signed-ota-update.zip`Riferimenti
[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
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.