Entrada fija

miércoles, 9 de septiembre de 2015

Compilar TWRP desde Source

Muy buenas a todos! Hoy no aprenderemos a compilar una ROM, sino un custom recovery: TeamWinRecoveryProject. Es vital tener un recovery alternativo para poder instalar ROMs, Tweaks, etc. Para mí este recovery es mucho mejor que CWM, sin embargo, para compilarlo hace falta tener un Device Tree para nuestro dispositivo.
Empecemos:


Pre-requisitos:

* Device Tree de CM (>10.0) para tu dispositivo (Buscad en GitHub)
* Local_Manifest para tu dispositivo (recomendado)
Entorno de Compilación Configurado


Se recomienda usar el Device Tree de OmniROM para tu dispositivo ya que vendrá con el código de TWRP añadido. Sin embargo, también se puede usar CyanogenMod 10.0-11 (y 12 con un parche).
Puedes usar las sources de OmniROM sin tener compilada OmniROM para tu dispositivo, sin embargo, deberás hacer unos cambios extras. Por ello, usaré como ejemplo las sources de CyanogenMod en este tutorial.

El único paso que te ahorras usando OmniROM es el de reemplazar una carpeta, así que poca cosa.
Por ello, recomiendo usar las sources de la ROM que tengas para tu dispositivo, y sincronizar con la misma branch. Es decir, haremos todo como si fueras a compilar una ROM.

Entonces queda claro que necesitas tener CyanogenMod funcionando en tu dispositivo y tener las sources ubicadas. Dicho esto empecemos con el tutorial:

1. Crear Directorio de Trabajo

El primer paso será crear la carpeta en la que tendremos todo los archivos y en la que se trabajará. La podéis llamar como queráis, pero yo recomiendo llamarla por el nombre de lo que vayamos a compilar. Para crear la carpeta hacemos lo siguiente con Terminal:

                                              

Ahora se habrá creado una carpeta en el directorio Home. La podéis ver si abrís el explorador de archivos. Ahora, vamos a situarnos en esa carpeta con Terminal. Para ello:

                                             

Con esto ya habremos creado la carpeta de trabajo y nos habremos situado en ella en Terminal.


2. Descargar las Sources

En este paso inicializaremos los archivos de código abierto de lo que vayamos a compilar. En este tutorial usaré como ejemplo las sources CyanogenMod 11 (si tu dispositivo tiene solo CM12 u otra, pues sincroniza con la branch correspondiente), y sincronizaremos a nuestra carpeta de trabajo. Para este paso es necesario el binario repo que ya instalamos al inicializar el entorno de trabajo.
Estando situados en la carpeta "twrp", ejecutamos el siguiente comando:

                  

Puede que el terminal os dé algún error y os pida ejecutar algún comando para instalar archivos necesarios. En ese caso, copia lo que te diga el Terminal que ejecutes, y cuando termine vuelve a ejecutar el comando de arriba.
Si todo ha ido bien, se iniciará tu repositorio local usando las sources de CM11. Para asegurarse de que se ha descargado, vete a la carpeta omni con el explorador de archivos, y pulsa Ctrl+h y deberá aparecer una carpeta llamada ".repo"
Al finalizar la descarga, Terminal dirá que tienes que registrarte con una cuenta de GitHub. Id a su página oficial y os creáis una cuenta. Una vez creada y comprobada por correo, volver a Terminal y ejecutáis estos dos comandos por separado:

                          
 *Reemplaza "tu@correo.com" y "Tu Nombre" por los que hayas usado al crear la cuenta. Ojo, sin las comillas pero con el espacio después de "user.email" y "user.name" respectivamente*

Una vez registrado recomiendo ejecutar otra vez el comando de descarga de sources y veréis que os aparecerá que estáis identificados al terminar el proceso. Por otro lado, cuando el Terminal os pida si queréis visualización de colores en vuestra cuenta (Enable colour display) escribe una N y le dais a enter.

Hecho esto ya tendremos nuestra carpeta de trabajo lista para obtener las sources.


3. Sincronizar Repositorio:

Este es el paso más pesado para todo el mundo, ya que descargaremos las sources y pesa entre 10-15GB aproximadamente. Es muy recomendado tener una velocidad de Internet elevada si no quieres morir de aburrimiento. En caso de que quieras aburrirte, ejecuta lo siguiente en Terminal:

*Atención, debemos estar situados en la carpeta twrp. Si has seguido los pasos tal cual sin cerrar el Terminal, estarás situado en ella (lo veréis donde dice ~/twrp~$ al principio de la línea). Si no, sitúate ejecutando "cd && cd twrp".*

                                         
El # indica el número de trabajos que se usarán para descargar los archivos. Depende de tu velocidad de Internet cuánto ponerle. Yo recomiendo usar de 2 a 4. Por lo tanto, si usas dos el comando quedaría así: repo sync -j2

Tras ejecutar el comando empezará la descarga, y llevará unas cuantas horas, así que podéis ir a tomaros algo o salir a caminar, que es saludable. Cuando termine la sincronización, ya tendremos las sources en nuestra carpeta de trabajo.


4. Descargar Device Tree

Ahora descargaremos las sources de nuestro dispositivo mediante el uso del local manifest. Si ya tienes CyanogenMod en tu dispositivo, seguramente el desarrollador haya publicado el local manifest.

*Un truco para ver los repos que usó el desarrollador si no ha publicado el local manifest, es abrir el archivo "cm.dependencies" del device tree*

Si no, hazlo tú mismo. No voy a ponerme a explicarlo de nuevo ya que lo tienes explicado aquí, y en los tutoriales de compilar CynaogenMod y OmniROM la información de dónde se coloca.

Decir que para compilar TWRP no necesitaremos repositorios como el Hardware FM y demás, pero recomiendo sincronizar todos los que tenga el local_manifest.

Una vez colocado el local manifest, sincronizaremos usando el comando "repo sync" de nuevo.

Hasta aquí es todo el proceso como si fuéramos a compilar CyanogenMod.


5. Añadir Código TWRP

Hasta ahora todo había sido muy fácil. Pero ahora llega lo complicado. Hay que editar archivos, pero es difícil saber qué añadir.


Bootable Recovery

Este es un paso necesario si estamos usando las sources de CyanogenMod. Lo que debemos hacer es ir a esta página. Seleccionamos la branch más actualizada.
*Da igual que sea 5.1 si nuestro dispositivo es 4.4 o lo que sea. Elegimos la última ya que con ella viene la última versión de TWRP*

Entonces vamos a la izquierda de la página de le damos a "download zip". Una vez descargado, lo descomprimimos pegamos en la carpeta twrp/bootable/recovery (ojo, borra todo lo que contenga esa carpeta antes de pegar lo descargado).

Una vez pegado ya habremos reemplazado las sources de recovery de CM por las de OmniROM, que traen el código de TWRP. Si usamos las sources de OmniROM, no hace falta este paso.



Recovery.te

Este paso solo será necesario si estamos usando las sources de CyanogenMod 12. Aplicaremos un parche. 
Para ello habrá que ir a la ruta twrp/external/sepolicy y abrimos con Gedit un archivo llamado "recovery.te".
Buscamos la línea que diga "recovery_only(`" y justo debajo escribimos lo siguiente:

                                        
*Atención: hay que dejar dos espacios de margen. Que coincida con el principio de la siguiente línea. Quedaría así (el ejemplo de la derecha)*


Adaptar Source OmniROM

Este paso solo es necesario si usas las sources de OmniROM y tu dispositivo no tiene dicha ROM compilada, es decir, estás usando el device tree de CyanogenMod para tu dispositivo.
Para hacerlo, sigue el paso 5 del tutorial para compilar OmniROM
Si lo haces, recomiendo que al acabar de compilar TWRP, hagas también OmniROM para tu dispositivo, ya que lo tendrás todo listo para ello ;-)


Device.mk

Ahora haremos una ligera modificación en el archivo device.mk. Está en la ruta twrp/device/marca/codename y aparece con el nombre "codename.mk". Mi dispositivo se llama "loganreltexx", por lo que el archivo me saldrá como "loganreltexx.mk".
Abrimos el archivo y escribimos lo siguiente:

                          

Esto hará que se copie el archivo twrp.fstab que crearemos más adelante en este tutorial en la ruta /etc al iniciar en modo TWRP.


Editar BoardConfig.mk


Esta parte es la más complicada. Primero de todo vete a twrp/device/marca/codename y abre el archivo BoardConfig.mk con Gedit.
Busca una línea (Ctrl+f) llamada TARGET_RECOVERY_INITRC. Si aparece, después del igual (=) estará escrita una ruta a un archivo "init.recovery.rc". Id a esa ruta (suele estar en rootdir dentro de twrp/device/marca/codename) y abre el archivo. Al principio verás lo siguiente:

                                        

Añade debajo la siguiente línea:

                                        

Y debería quedar así:

                                        

Guarda los cambios y sal. Sigamos trabajando:

Ahora llega lo complicado. Hay que añadir líneas (flags) de TWRP. Cuesta un poco saber qué líneas añadir. 

Lo que haremos será ir al final del archivo BoardConfig y escribiremos la siguiente etiqueta: #TWRP

Hecho esto añadiremos las flags. Son las siguientes:


  • DEVICE_RESOLUTION :=  ~indica la resolución de nuestro dispositivo. Debes elegir entre las dimensiones que veas en la carpeta twrp/bootable/recovery/gui/devices. Si no hay exacta para tu dispositivo, coge la que más se aproxime (siempre por debajo).
  • TARGET_RECOVERY_FSTAB :=  ~indica la ruta del archivo twrp.fstab que crearemos posteriormente. Recomiendo que la ruta sea device/marca/codename/recovery/twrp.fstab.
  • BOARD_HAS_NO_REAL_SDCARD := true  ~elimina funciones como "particionar SD". También ahorra espacio; útil si TWRP no ajusta en tu partición de recovery (por espacio). Recomiendo usar esta flag.
  • TW_INTERNAL_STORAGE_PATH := "/data/media" ~indica la ruta de almacenamiento de medios (almacenamiento interno). La ruta puede variar y ser "/data/media/0" o diferente. Busca en tu dispositivo con un explorador root la ruta data/media y asegúrate. Sabrás que estás en la ruta correcta porque contendrá los archivos de memoria interna del teléfono (es la ruta equivalente a /mnt/sdcard).
  • TW_INTERNAL_STORAGE_MOUNT_POINT := "data"  ~nombre del punto  de montaje de la partición indicada con la flag anterior. En el 99% de los casos es "data", pero mira el recovery.fstab de tu dispositivo para estar seguro de que nombre le dan.
  • TW_EXTERNAL_STORAGE_PATH := "/external_sd"  ~lo mismo que con data/media, pero aplicado a la SD Externa. Asegura la ruta.
  • TW_EXTERNAL_STORAGE_MOUNT_POINT := "external_sd"  ~lo mismo que con data, pero aplicado a la SD Externa. Asegura el nombre.

  • TW_NO_REBOOT_RECOVERY := true  ~indica si queremos la opción "Reiniciar Recovery" al usar TWRP. Escribimos la línea si no queremos esa opción de reinicio.
  • TW_NO_REBOOT_BOOTLOADER := true  ~lo mismo que la línea anterior, pero con bootloader. Si tu dispositivo no tiene bootloader, debes escribir la línea.
  • TW_NO_USB_STORAGE := true  ~indica si queremos la opción de almacenamiento USB. Si tu dispositivo no tiene soporte de almacenamiento USB, escribiremos la línea.
  • TW_NEVER_UNMOUNT_SYSTEM := true  ~indica que nunca se desmontará  la partición de sistema. Esta flag se necesita en algunos dispositivos Motorola.
  • RECOVERY_SDCARD_ON_DATA := true  ~habilita el correcto manejo de data/media para los dispositivos que usen ese directorio como almacenamiento. Esta flag se usa para la mayoría de dispositivos con Android Honeycomb y aquellos con ICS de fábrica.
  • TW_HAS_DOWNLOAD_MODE := true  ~indica si nuestro dispositivo tiene modo download (descarga). Todos los Samsung tienen esta función.
  • TW_NO_BATT_PERCENT := true  ~elimina la función de mostrar porcentaje de batería al usar TWRP. Útil si tu dispositivo no lo soporta correctamente.
  • RECOVERY_GRAPHICS_USE_LINELENGTH := true ~arregla gráficos de aspecto rasgado en algunos dispositivos. No sabrás si usarlo hasta probar TWRP por primera vez.
Hay algunas flags más, pero he puesto las que veo más importantes y las que entiendo. He separado las que para mí son básicas y de uso obligatorio arriba. Puedes ver más flags aquí o buscando en Google; no voy a buscar todas las flags que hay.

Aquí tenéis un ejemplo de las líneas que añadí para mi dispositivo:


 También puedes buscar dispositivos similares al tuyo con OmniROM o TWRP y mirad el BoardConfig de su device tree.
Aquí tienes el ejemplo más básico de flags usadas.

Hechos los cambios, guarda y cierra.


Recovery.fstab


Para esto lo más sencillo es coger y en twrp/device/marca/codename creamos una carpeta llamada "recovery". Dentro, creamos un archivo llamado twrp.fstab.
Ahora abrimos el archivo, y primero que todo escribiremos los mount points de nuestro dispositivo. Los tenéis en la carpeta rootdir que tuvimos que visitar en un paso anterior, en el archivo llamado fstab. Son las líneas que digan algo así como "dev/block/..."
Pues habrá que copiarlas a twrp.fstab, pero con orden diferente. Aqúi podréis ver la diferencia de formato:


*Atención, os habréis fijado que en el fstab.qcom salen menos mount points que en el de twrp, eso es porque en ese archivo no salen todos. Puedes ver los demás en el archivo recovery.fstab que está al desempaquetar un recovery (recovery.img) para tu dispositivo (es muy fácil)*

Como veis primero pondremos el nombre de la partición, luego el formato, y luego la ruta. Cuando lo tengas tocará añadir flags. ¡Ojo! No escribas las flags que aparecen en el "fstab.qcom".  

Las flags se añaden al final de cada línea de montaje (depués de flags=). Las flags solo afectan a la línea en la que estén, es decir, haremos flags para cada línea. Las separamos de la ruta de montaje mediante espacios. Si usamos varias flags en un misma línea, las debemos separar con punto y coma (;).

Un ejemplo del formato es este:

                          

Aquí dejo las flags disponibles para usar:

  • removable  ~ literalmente: indica que la partición puede no estar presente en la prevención de errores de montaje mostrados durante el arranque. No sé explicarlo, pero esta flag la añadimos en external_sd y en usbstorage (también USB-OTG, depende del dispositivo). 
  • storage  ~indica que la partición se puede usar como almacenamiento, lo que la habilitará para usarla para almacenar backups, etc. Sobra decir que esta se usa en external_sd y usbstorage (también USB-OTG).
  • backup=1  ~indica que dicha partición puede estar listada en la opción backup/restore. Si en vez de 1 ponemos 0, indicará que no queremos que aparezca.
  • wipeingui  ~hace que dicha partición aparezca en el menú de wipes en el menú de TWRP. Se añade en external_sd (también puedes añadirla en usbstorage).
  • display=  ~indica el nombre con el que aparecerá la partición en los menús de TWRP. El nombre hay que ponerlo entre comillas, por ejemplo, "Micro SDcard".
  • length=  ~solo se aplica a data. Detrás del igual se escribe un número. El número que debes poner está en el fstab.qcom (suele ser 16384)
  • subpartitionof=  ~lo usamos cuando hay subparticiones. En el ejemplo que puse de twrp.fstab se usa, ya que hay varias particiones efs. Saber cuándo usarla en fácil si miras el ejemplo.

Esas serían todas. Hay algunas más, pero por lo que he visto, estas son las que se usan. En algunas he dicho donde se usan, pero ten en cuenta que para tu dispositivo puede variar, o puedes hacerlo como tu quieras en algunas, pero ten cuidado, no hagas ninguna locura ;-)
Por ello, recomiendo siempre mirar el de algún dispositivo similar al tuyo para ver cómo lo ha hecho.

Una vez terminado, guarda cambios y cierra

*Recomiendo crear el archivo twrp.fstab en esa carpeta (twrp/device/marca/codename/recovery) porque así ya coincide con la flag del BoardConfig.mk y con la línea añadida al device.mk. Si creaste el archivo en otra carpeta, edita la ruta en esos dos archivos*

Hecho todo esto, habremos añadido el código TWRP y estaremos listos para compilar el recovery.


6. Compilar el Recovery:

Este es el ansiado paso final con el que crearemos el custom recovery para nuestro dispositivo. Para ello ejecuta en Terminal:

                                      
                                      
                                      
Ahora localiza tu dispositivo (saldrá algo como cm_codename-userdebug, u omni_codename-userdebug; depende de qué source hayas usado) por su codename, que en mi caso sería loganreltexx (saldría así cm_loganreltexx-userdebug) y miramos el número que tiene. Lo escribimos y le damos enter. Luego para compilar hay varias opciones:

1) Comando Común:

                                      
Sustituimos la almohadilla (#) por el número de procesadores que tenga nuestra PC +1. Es decir, si es un dual-core ejecutaremos con -j3. Tras ello empezará a compilar el archivo "img" del recovery.


2) Para Zip Flasheable:

Por otro lado, si en vez del archivo ".img" quieres hacerlo por zip flasheable, ejecutaremos el siguiente comando:

                                     
Hacemos lo mismo con la almohadilla.Tras este comando se habrá creado un archivo zip que instalaremos por modo recovery para tener TWRP.


3) Para algunos Samsung:

Y por otro lado más, si tu dispositivo es un Samsung que incluye el recovery en el kernel (boot.img) y no en su propia partición, deberás ejecutar el siguiente comando.

*Sabrás si tu dispositivo no tiene partición propia si al mirar el recovery.fstab no aparece partición recovery*

                                    
Hacemos lo mismo con la almohadilla. Al terminar se habrá creado un archivo ".img" que será el kernel con el TWRP incluido.

---------------------------------------------------------------------------------------------

La compilación en cualquiera de las variantes tardará unos veinte minutos, todo depende de la potencia que tenga tu PC. Cuando termine, si todo ha ido bien, tendrás el archivo en out/target/product/codename. En mi caso estaría en out/target/product/loganreltexx.


¡Listo! Ya has compilado TWRP


4 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. el tutorial es bueno, sin embargo, todos los dispositivos que tienen un device tree ya han sido compilados, entonces mi pregunta, para que compilar algo que ya ha sido compilado? igual gracias, este tutorial fue mi introduccion al mundo de las rom de las android

    ResponderEliminar
    Respuestas
    1. Que un dispositivo disponga de un device tree, no significa que tenga compilado un custom recovery, además, los desarrolladores suelen sacar primero CWM y no TWRP. ;)

      Eliminar
  3. Hola amigo me podrías hacer un TWRP para LG K4 (2017) modelo 230F porfavor correo thelastzamuray69@gmail.com

    ResponderEliminar