AOSP Tutorial · 13 min read · Nov 26, 2025
Construyendo y flasheando una versión segura de AOSP con arranque verificado y contraseña de pantalla de bloqueo separada para el Nexus 5X

Descargo de responsabilidad y licencia
Todos los datos e información proporcionados en este tutorial son solo para fines informativos. El autor no hace representaciones sobre la precisión, integridad, actualidad, idoneidad o validez de cualquier información en este tutorial y no será responsable de errores, omisiones o retrasos en esta información o de cualquier pérdida, lesión o daño que surja de su visualización o uso. Toda la información se proporciona tal cual.
En ningún caso, el autor o howtoforge será responsable de cualquier pérdida o daño, incluyendo, sin limitación, pérdida o daño indirecto o consecuente, o cualquier pérdida o daño que surja de la pérdida de datos o ganancias derivadas de, o en conexión con, el uso de este tutorial.
Excepto como se indique lo contrario, el contenido de esta página está bajo la Licencia de Atribución de Creative Commons 3.0, y las muestras de código están bajo la Licencia Apache 2.0.
Motivación
El Nexus 5X y 6P fueron los primeros dispositivos que soportaron el arranque verificado basado en claves de firma proporcionadas por el usuario (y no impuestas por el proveedor). Antes de su “implosión” [1], CopperheadOS (una variante de AOSP mejorada en seguridad) solía proporcionar buena documentación y scripts para construir y flashear una versión segura de AOSP [2]. Sin embargo, el proyecto dejó de proporcionar actualizaciones en los últimos meses, por lo que la mayoría de los antiguos usuarios están buscando alternativas viables.
Mi impresión es que muchos usuarios coinciden en que ejecutar un ROM AOSP autoconstruido es una alternativa mucho mejor a otras opciones como cambiar a, por ejemplo, LineageOS. Hay varias buenas razones para esto:
- AOSP es stock puro y tiene solo algunas características posiblemente no deseadas
- AOSP se puede construir como una variante de construcción “user” en lugar de “userdebug” y, por lo tanto, se espera que sea más seguro (intenté compilar versiones de usuario de LineageOS, pero parecen estar rotas debido a los cambios invasivos que LineageOS hizo en las fuentes de AOSP)
- Una vez que se obtienen las fuentes, AOSP se puede construir simplemente. A diferencia de LineageOS, no comienza a descargar fuentes adicionales durante la construcción.
Dado que se cree que el Nexus 5X es un dispositivo de desarrollador bien soportado, esperaba que el proceso de construcción de AOSP fuera fácil y bien documentado. Sin embargo, resulta que hay varias advertencias:
- incluir los binarios del proveedor siguiendo la documentación oficial resulta en construcciones incompletas que no se pueden usar para actualizaciones incrementales sin desbloquear y borrar cada vez (la partición del proveedor, radio ROM, etc. no se incluye en la construcción)
- la documentación oficial no describe cómo usar la construcción verificada de una manera que sea directamente aplicable. Hay mejor documentación en los documentos de CopperheadOS [05], pero las instrucciones dependen de scripts obsoletos que no son aplicables para AOSP.
- no hay documentación sobre cómo usar un PIN “débil” como frase de contraseña pero una contraseña fuerte como clave de cifrado de disco (a diferencia de los dispositivos Pixel más nuevos, el Nexus 5X se basa en el enfoque FDE más antiguo). Los métodos que funcionan para los dispositivos LineageOS no son aplicables ya que suponen que el dispositivo está rooteado, lo cual no es el caso para las versiones de usuario de AOSP.
Este tutorial tiene como objetivo proporcionar instrucciones detalladas sobre cómo resolver estas advertencias, construyendo y flasheando AOSP para el Nexus 5X con arranque verificado y utilizando secretos de pantalla de bloqueo/cifrado separados. También debería aplicarse al Nexus 6P con pequeños cambios, pero no pude probarlo ya que no tenía un Nexus 6P a mano.
Excepto por una pequeña colección de scripts (requeridos para extraer correctamente los blobs del proveedor de los binarios suministrados por Google) y su dependencia “oatdump” (que se descarga como binario de un recurso público), las instrucciones no utilizan ningún recurso de terceros “no oficiales” (en el sentido de “no proporcionados por Google”).
Tenga en cuenta los siguientes problemas de libertad:
- El árbol de fuentes de AOSP contiene varios binarios preconstruidos (por ejemplo, toolchain, núcleo de Linux, …). Si bien estos binarios podrían reconstruirse a partir de la fuente, los pasos necesarios no se cubren en este tutorial.
- El código fuente para los blobs del proveedor requeridos para usar muchos componentes de hardware del Nexus 5X no está disponible públicamente.
- La herramienta “android-prepare-vendor” utilizada para extraer los archivos propietarios del proveedor utiliza binarios preconstruidos (algunos incluso alojados externamente).
Requisitos y suposiciones
El tutorial asume que tiene los siguientes requisitos previos (otras versiones/distribuciones también podrían funcionar pero podrían requerir otros o paquetes adicionales):
un Nexus 5X con un bootloader desbloqueado (el desbloqueo no se cubre en este tutorial)
máquina (virtual) que ejecute Debian9 en la variante x86_64, utilizada exclusivamente para nuestro propósito (asumimos que usa sudo, si no, adapte los comandos)
al menos 5 GB de RAM (más es mejor)
aproximadamente 200 MB de espacio en disco
conexión a internet rápida (necesitamos descargar alrededor de 30G de datos)
Instalando dependencias
Primero, instale las dependencias como se describe en las instrucciones de construcción de LineageOS [3] (las instrucciones de construcción de AOSP no proporcionan 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-devAhora, instale dependencias adicionales:
sudo apt install cmake zip unzip openjdk-8-jdk-headlessLuego, configure un camino bin en su directorio de inicio (en Debian 9 este camino se configura automáticamente en el perfil de bash):
mkdir -p ~/binInstale el comando repo:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repoVerifique el checksum del binario repo. Debe ser e147f0392686c40cfd7d5e6f332c6ee74c4eab4d24e2694b3b0a0c037bf51dc5 para la versión actual 1.23. para versiones posteriores, consulte la página de instrucciones de construcción de AOSP [4]. Use el siguiente comando para calcular el checksum:
sha256sum ~/bin/repoA continuación, proporcione una identidad git ejecutando los siguientes comandos (puede dejar los datos de ejemplo si prefiere permanecer en el anonimato):
git config --global user.email "[email protected]"git config --global user.name "Tu Nombre"Desafortunadamente, el paquete brotli (requerido para empaquetar las construcciones) en Debian 9 es demasiado antiguo, por lo que necesitamos construir la versión actual nosotros mismos. Primero obtenga el código fuente y cambie a su directorio:
git clone https://github.com/google/brotli.gitEjecute la construcción (reemplazar -j15 por el número de sus hilos de cpu):
cd ~/brotli./configure-cmakemake -j15Finalmente, copie el binario resultante a nuestro camino bin:
cp brotli ~/bin/Finalmente, cierre sesión y vuelva a iniciar sesión para que su perfil de bash se vuelva a leer.
Obteniendo los blobs del proveedor
Hay varios problemas con el uso de los blobs del proveedor de los paquetes de controladores binarios proporcionados por Google (ver [5]). Para resolverlos, utilizamos el conjunto de scripts externos “android-prepare-vendor” de “anestisb” que extrae los blobs del proveedor de las imágenes de fábrica en su lugar.
Primero, clone el repositorio:
git clone https://github.com/anestisb/android-prepare-vendor.gitUsando el sitio de Google [6], averigüe la última etiqueta de construcción para su Nexus 5X (actualmente es OPM6.171019.030.K1).
Cambie al repositorio, cree un directorio de salida y ejecute el script (ejecutamos el script como root debido a problemas con fuse en Debian 9):
cd android-prepare-vendormkdir bullhead-blobssudo ./execute-all.sh -k -d bullhead -a bullhead -b OPM6.171019.030.K1 -o bullhead-blobsDescargando fuentes de AOSP
Nota: Los siguientes pasos carecen de instrucciones para verificar la fuente descargada.
Primero, cree un directorio donde se almacenarán las fuentes:
mkdir -p ~/aospConociendo la etiqueta de construcción actual para el Nexus 5X, averigüe cuál es la etiqueta de Android correspondiente utilizando la visión general disponible en [6]. Luego, verifique el manifiesto de Android para la rama correspondiente (en este ejemplo, usamos android-8.1.0_r46):
cd ~/aosprepo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r46como de costumbre en XML para comentar repositorios. Recomiendo excluir/reemplazar lo siguiente:
- el QuickSearchBox está mayormente roto en AOSP de todos modos - reemplace esto con un repositorio que contenga un árbol de dispositivo parcheado donde los dos núcleos de cpu defectuosos estén desactivados. Esto conlleva una penalización de rendimiento de aproximadamente el 30%. Sin embargo, se recomienda, incluso si tiene un Nexus 5X que no se ve afectado por el bootloop, ya que es probable que se vea afectado en el futuro. - hay mejores alternativas al calendario AOSP de stock que puede instalar más tarde (como Etar) - Silence.im es una mejor alternativa para la aplicación de mensajería AOSP - OpenCamera es una mejor alternativa para la cámara de stock
Ahora, obtenga todos los repositorios (puede tardar mucho tiempo, dependiendo principalmente de su conexión a internet):
repo syncFinalmente, copie los blobs del proveedor generados anteriormente como root (esto es necesario, o qmus y otros blobs faltarán y causarán fallos de compilación posteriores) en el directorio del proveedor de su árbol AOSP (reemplace el número de construcción de fábrica por el actual):
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 .Haga que su usuario sea el propietario de los directorios del proveedor (o la construcción fallará más tarde). Reemplace yourusername con su nombre de usuario real:
sudo chown -R yourusername:yourusername ~/aosp/vendorsudo chown -R yourusername:yourusername ~/aosp/vendor_overlayGenerando claves
Establezca las variables de construcción:
source build/envsetup.shConstruya la herramienta necesaria para generar la clave de verificación:
make generate_verity_keyCree un directorio para almacenar sus claves (los documentos de CopperheadOS [2] recomiendan usar una clave separada para cada dispositivo, en este caso bullhead):
mkdir -p keys/bullheadAhora es el momento de generar las claves (no establezca contraseñas en sus claves):
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 Convierta la clave de verificación al formato requerido por AOSP:
out/host/linux-x86/bin/generate_verity_key -convert keys/bullhead/verity.x509.pem keys/bullhead/verity_keyCompilando
Asegúrese de que sus variables de construcción estén establecidas:
cd ~/aospsource build/envsetup.shCree una configuración de almuerzo para el dispositivo bullhead (reemplace user por userdebug si desea una configuración de userdebug en su lugar):
lunch aosp_bullhead-userDesactive Jack (a menudo causa problemas de compilación y ha sido desaprobado en Android 9 de todos modos):
export ANDROID_COMPILE_WITH_JACK=falseCompile el paquete de archivos de destino (reemplace -j15 por el número de sus hilos de cpu):
make target-files-package -j15Empaquetando y firmando
Cree un directorio para almacenar los archivos de salida (fuera del directorio de construcción habitual llamado out):
mkdir distEjecute el objetivo dist (reemplace -j15 por el número de sus hilos de cpu):
make dist -j15Cree un paquete de archivos de destino firmado, reemplazando las claves de prueba predeterminadas con sus claves (reemplace yourusername con su nombre de usuario real en el 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.zipCree un paquete OTA firmado:
build/tools/releasetools/ota_from_target_files -k keys/bullhead/releasekey dist/signed-target-files.zip dist/signed-ota-update.zipFlasheando
Arranque su dispositivo Nexus 5X en el bootloader (mantenga presionado el volumen hacia abajo, luego presione encender).
Conecte su dispositivo a través de USB a su máquina (y hágalo disponible para la VM en caso de que construya en una VM). También puede copiar el contenido del directorio dist a otra máquina y flashear desde allí, pero asumimos que flashea usando los binarios fastboot/adb construidos a partir de las fuentes de AOSP (si flashea desde afuera, asegúrese de que su binario fastboot sea reciente).
Desempaque las imágenes de signed-target-files.zip:
cd ~/aosp/distunzip `signed-target-files.zip IMAGES/*
`Ahora, flashee todas las imágenes:
../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.imgSeleccione “reiniciar sistema” usando los botones físicos de su dispositivo y asegúrese de que su nuevo sistema funcione.
Finalmente, reinicie de nuevo al bootloader y vuelva a bloquearlo (esto borrará todos los datos):
out/host/linux-x86/bin/fastboot flash oem locking¡Eso es todo!
Estableciendo secretos de arranque/pantalla de bloqueo separados
Establecer una contraseña de arranque/pantalla de bloqueo separada se puede hacer con un pequeño truco:
- Desbloquee el bootloader (borra todos los datos)
- compile y flashee una construcción userdebug (vea arriba)
- bloquee el bootloader
- establezca un PIN/contraseña de pantalla de bloqueo usando la interfaz de usuario de Android. Asegúrese de elegir la correcta porque no podrá cambiarla nuevamente sin borrar sus datos una vez que cambie a la construcción de usuario.
- conéctese al dispositivo a través de adb
- como root, ejecute el siguiente comando: vdc cryptfs changepw password your-new-password
- reinicie y asegúrese de que funcione
- compile una construcción de usuario regular (¡no desbloquee el bootloader!)
- flashee la construcción de usuario
Nota: Sin pasos adicionales, la recuperación no permite flashear construcciones anteriores. Por lo tanto, necesita flashear una construcción de usuario que sea más nueva que su construcción userdebug.
Manejo de actualizaciones
Si desea actualizar a una versión más nueva de AOSP, primero necesita averiguar el nuevo número de versión.
Luego, borre el antiguo manifiesto (haga una copia de seguridad, en caso de que haya realizado cambios que desee rehacer en el actualizado):
cd ~/aosprm -rf .repo/manifests.gitrm -rf .repo/manifest.xmlAdemás, borre los blobs del proveedor (entonces obsoletos) y el repositorio prepare-vendor:
rm -rf ~/android-prepare-vendorrm -rf vendorrm -rf vendor_overlayAdemás, limpie el árbol de construcción y los artefactos de construcción:
rm -rf outrm -rf distLuego, repita SOLO los siguientes pasos:
- Obtener los blobs del proveedor
- Descargar fuentes de AOSP (esto será mucho más rápido, porque solo se extraerán los cambios)
- Compilando
- Empaquetando y firmando
En teoría, debería poder instalar actualizaciones como nuevos paquetes OTA desde la recuperación sin borrar (ya que estarán firmados con las mismas - sus - claves). En la práctica, aún no funciona (vea la siguiente sección). Allí, también deberá proceder de la siguiente manera:
- Haga una copia de seguridad de todos sus datos
- Desbloquee el bootloader (sus datos serán borrados)
- Flashee las imágenes actualizadas y vuelva a bloquear su bootloader como se describe en la sección “Flasheando”
WIP: Actualizaciones OTA firmadas
¡Esta sección está en WIP, las instrucciones descritas aún no funcionan!
En teoría, debería ser posible crear y flashear actualizaciones OTA firmadas desde la recuperación. Sin embargo, todos mis intentos de hacer esto resultaron en un error de “Verificación de firma fallida”. Dado que esto funciona al usar los archivos del proveedor suministrados por Google directamente en lugar de usar android-prepare-vendor, asumo que está relacionado con los archivos del proveedor u otros archivos (como las imágenes del bootloader o radio) que no están firmados correctamente.
Cree el paquete OTA firmado de la siguiente manera:
build/tools/releasetools/ota_from_target_files -k keys/bullhead/releasekey dist/signed-target-files.zip dist/signed-ota-update.zipReinicie en recuperación usando los botones físicos de su dispositivo.
En recuperación, verá un pequeño símbolo de android. Mantenga presionado el botón de encendido y presione el volumen hacia arriba para acceder al menú de recuperación.
Ahora, seleccione “actualizar desde adb” usando los botones físicos de su dispositivo.
Instale su paquete OTA firmado:
out/host/linux-x86/bin/adb sideload dist/`signed-ota-update.zip`Referencias
[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
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.