Entrada fija

viernes, 7 de agosto de 2015

Compilar CyanogenMod 11 desde Source

Buenas a todos los seguidores! Ya que tenemos todo listo para compilar, vamos a empezar con la primera entrada para compilar. Empezaré con CM11, ya que es la primera que he logrado construir satisfactoriamente, y la ROM necesaria para basar las demás en ella.
Para compilarla necesitaréis varias cosas previas que ya haya hecho un desarrollador, ya que incluso yo no sé hacerlas todavía. En cuanto aprenda, lo publicaré y añadiré enlace para redireccionaros a la publicación y luego seguiréis con este tutorial.
Vayamos al lío:


Pre-requisitos:

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

El device tree es lo más importante. Es lo necesario para que compile con los archivos y características de tu dispositivo para que la ROM sea compatible. Necesitas que algún desarrollador experto lo haga. Yo estoy aprendiendo y en cuanto pueda lo compartiré. El device tree se compone principalmente de tres partes: Device, Kernel y Vendor. Aquí tenéis un ejemplo de device tree (solo device) y como veis son varios archivos y carpetas. Fijaos arriba a la izquierda donde pone "branch" y es una pestaña deslizable. Debéis aseguraros de que vuestro device tree tiene cm-11.0 en esa pestaña.
Dicho esto, prosigamos:


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 la ROM 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. Descargas las Sources:

En este paso inicializaremos los archivos de código abierto de la ROM que vayamos a compilar, en este caso CyanogenMod 11, y las 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 "cm11", 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 CyanogenMod 11. Para asegurarse de que se ha descargado, vete a la carpeta cm11 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 de la ROM con la que vamos a trabajar.


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 cm11. Si has seguido los pasos tal cual sin cerrar el Terminal, estarás situado en ella (lo veréis donde dice ~/cm11~$ al principio de la línea). Si no, sitúate ejecutando "cd cm11".*

                                         
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. Configurar Tu Dispositivo:

En este paso es quizá el más complicado ya que no solo será ejecutar comandos en Terminal, sino que tendréis que editar y escribir líneas en varios archivos. Sin embargo, si sigues bien el tutorial te resultará bastante sencillo.

Como dije al principio, es necesario tener localizado el device, kernel y vendor de nuestro dispositivo. En este paso lo que haremos en añadir un archivo a la carpeta de trabajo para que sincronice y descargue las sources específicas de nuestro dispositivo.

Tomaré de ejemplo mi actual dispositivo, el Galaxy Ace 3. Aquí tenéis enlaces de GitHub para que veáis con qué nombre suelen estar:

- Device: https://github.com/kostoulhs/android_device_samsung_loganreltexx
- Kernel: https://github.com/kostoulhs/android_kernel_samsung_loganreltexx
- Vendor: https://github.com/kostoulhs/proprietary_vendor_samsung_loganreltexx

Os preguntaréis por qué pone loganreltexx. Ese el el codename del Galaxy Ace 3. Podéis ver fácilmente el vuestro en el build.prop (en la carpeta system) de tu dispositivo, concretamente en la línea "ro.product.name".

Alguno puede que se haya fijado en que al abrir los enlaces, en branch sale cm-12.1. Sin embargo, no es relevante, ya que posteriormente especificaremos en el archivo necesario la marca que queremos descargas (cm-11.0 en nuestro caso), así que dejad el enlace tal cual aparece al abrirlo, sin clicar en la pestaña "branch" pero asegurándose de que aparece "cm-11.0".

Ahora que tenemos localizados los tres enlaces, vamos a sincronizarlos con nuestra carpeta. Para ello hay dos opciones: usar Git Clone o usar Local Manifest.
Si usamos Local Manifest, se sincronizarán las sources del dispositivo cada vez que ejecutemos el comando para sincronizar repositorio de CyanogenMod (repo sync), por lo que se sobreescribirán los archivos de nuestro dispositivo, pero tranquilo, no desaparecen.
Por otro lado, al usar Git Clone, las sources del dispositivo se descargarán a la carpeta de trabajo pero no serán afectadas cuando sincronizamos repositorio. Esta opción es recomendada si haces cambios en tu source una vez descargas. Si eres un usuario nuevo, no creo que vayas a modificar nada, así que elige la opción de Local Manifest. En cambio, si eres un usuario avanzado y tú mismo sabes crear device tree, usa Git Clone.

Atención: Seguramente si ya hay un desarrollador que ha hecho un Device Tree para CyanogenMod 11, ya haya hecho un local_manifest. Lo encontraréis en su página de GitHub y tendrá un aspecto como éste. En este caso, primero seleccionamos la branch con la que estamos trabajando (cm11) en la pestaña. La página recargará, entonces clicamos en "local_manifest.xml" y veréis las líneas que tendréis que poner (copiar y pegar) cuando creéis el local manifest siguiendo el tutorial.


Git Clone:
El código que usaremos será el siguiente:

                                            
- repo: lo sustituimos por el link del repositorio de nuestro device tree.
- branch: lo sustituimos por la ROM con la que trabajemos. En este caso: cm-11.0
- directorio local: lo sustituimos por la carpeta donde se descargarán los archivos.

*Por defecto, el directorio local suele ser device/marca/codename, vendor/marca/codename y kernel/marca/codename*

Un ejemplo con Git Clone para mi Galaxy Ace 3 sería así:

                                    

Haríamos esto mismo con el kernel y con el vendor.


Local Manifest:

Aquí explicaros que los repositorios varían muchísimo si tu dispositivo no es soportado oficialmente por CyanogenMod, pero hemos hecho este tutorial para que puedas portarlo para tu dispositivo. No digo esto en Git Clone ya que si lo usas supongo que ya eres un usuario más experimentado.
Pues a lo que iba, no hay una fórmula única para hacer el local manifest, pero intentaré explicarme lo mejor que pueda. Antes que nada, habrá que ejecutar los siguientes comandos [antes debéis estar situados en cm11 (cd cm11)]:

                                             
                                         
*También podéis crear la carpeta y el archivo usando el explorador de archivos*

Se abrirá en terminal el archivo vacío. La estructura por defecto del Local Manifest es así:

                                         

*Perdón, pero no me cabe el línea entere. La línea de "proyect path" llega hasta "branch del repo". No hay punto y aparte, es toda seguida*

- directorio local: ruta donde estará el repo (device, kernel y vendor)
- nombre del repo: enlace del repo quitando "https://github.com/"
- página del repo: en el 99% de los casos hay que poner github
- branch del repo: en nuestro caso, cm-11.0

Pues haríamos una lína de proyect por cada repositorio que necesitemos para nuestro dispositivo. Si ya hay un desarrollador que ha hecho un local manifest, no hay problema, solo copia y pega. Si no, vamos al lío:

Si tu dispositivo no tiene soporte oficial ni local manifest ya creado, tendrás que hacerlo tú mismo. Es un poco complicado, ya que para cada marca y modelo habrá que añadir unos repositorios comunes (master) a parte del device y el vendor. No domino ninguno, así que puede que no te funcione. Ahí tendrás que meterte a investigar por tu cuenta.

*Local Manifest mejor explicado en este tutorial*

Para un dispositivo Samsung con chip Qualcomm MSM8930 tendríais que hacer un Local Manifest así:


*Podéis copiar el texto aquí*

Como no tiene soporte oficial hay que añadir los repos comunes de CyanogenMod. Las línas sombreadas (dos últimas) tienen que ser ya de tu dispositivo, tenéis que buscarlas en el device tree que haya hecho algún desarrollador para tu dispositivo. Tenéis que sustituir codename y repo por vuestro correspondiente. Luego el kernel puede que tu desarrollador haya cogido la base del común (la primera línea que ves) y la haya modificado. En ese caso, cambia CyanogenMod por el nombre de la cuenta de dicho desarrollador.
También puede que los repo 2º, 3º y 7º los haya copiado en su propio repositorio (podéis ver un ejemplo aquí, justo debajo del segundo pone "forked from"). En ese caso lo puedes cambiar o puedes dejarlo así, debería funcionar igual, aunque si tu desarrollador lo ha copiado, cámbialo por el repo de él.

Espero haberme explicado, ya que esto puede ser lo más difícil de entender, sobre todo si como he dicho, no tienes un local manifest ya hecho. La mecánica si tu dispositivo no es Qualcomm MSM8930 es similar. Tenéis que buscar en el repo de CyanogenMod los repositorios comunes acorde con tu dispositivo y lo sustituyes en las líneas que dicen CyanogenMod, es cuestión de buscar y probar.

Un ejemplo de cómo es el de mi dispositivo, lo tenéis aquí. Podéis ver que los tres primeros repositorios son common de CyanogenMod, pero que el desarrollador a copiado (forked) a su propio repo y lo ha cambiado en su local manifest. Espero que la explicación os haya resultado comprensible. Sigamos:

Una vez finalizado de escribir el Local Manifest, presiona Ctrol+O y enter para guardar. Luego Ctrl+x para salir del editor. Revisa que el archivo esté en cm11/.repo/local_manifest y que se haya guardado correctamente.


Después de todo esto, ejecuta el comando "repo sync" de nuevo. Tranquilo, no tardará tanto como la primera vez, ya que solo descargará los repo que añadimos en el local manifest.


5. Obtener Pre-Builts:

En este paso obtendremos apps necesarias para compilar (o algo así, no estoy seguro). En muchos tutoriales no lo ponen, pero cuando yo fui a compilar dio error porque pedía la app Terminal.apk, entonces lo hice y luego funcionó perfecto. Para ello:

                                     
                                     

6. Compilar la ROM:

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

                                     
                                     
                                     
Ahora localiza tu dispositivo (saldrá algo como cm_codename-userdebug) 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 ejecutamos:

                                    
El asterisco lo cambiamos por el número de núcleoss que tenga nuestra PC +1. Por ejemplo, si es dual-core, será -j3. Le damos enter y empezará a compilar.

Un comando alternativo sería el siguiente:

                                    
En este se sustituye codename por el de nuestro dispositivo (loganreltexx) en nuestro caso, y el # lo mismo que he explicado arriba.

Tras ello empezará a compilar y tardará unas horas, todo depende de la potencia que tenga tu PC. Cuando termine, si todo ha ido bien, tendrás el archivo en out/target/codename. En mi caso estaría en out/target/loganreltexx.

¡Listo! Ya has compilado CyanogenMod 11


4 comentarios:

  1. hola muy buenas, unos tutoriales geniales y lo bueno de todo en español :), este procedimiento es el mismo que al querer compilar pacman basada en cm12.1? gracias

    ResponderEliminar
    Respuestas
    1. Debes realizar cambios y modificaciones en la source, parecidos a los de OmniROM. Justo ahora estoy compilando PAC-Man, y cuando lo consiga publico el tutorial.
      Si sabes inglés, de momento tienes aquí uno en XDA: http://forum.xda-developers.com/showthread.php?t=2662325

      Eliminar
  2. Como puedo hacer mi device tree? Es que mi movil no es conocido por lo que no tiene device tree

    ResponderEliminar
    Respuestas
    1. Siento no poder ayudarte con eso. No tengo idea de cómo hacerlo correctamente.

      Eliminar