Entrada fija

domingo, 16 de agosto de 2015

Compilar OmniRom 4.4 Desde Source

Buenas a todos los seguidores! Hoy aprenderemos a compilar OmniRom, la segunda que he compilado y que se caracteriza por ser lo más OpenSource posible, con el código de TWRP añadido.
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 para tu dispositivo (recomendado)
* TWRP para tu dispositivo (recomendado)
Entorno de Compilación Configurado

En este tuto, voy a tomar el Device Tree de CyanogenMod 11, ya que si un desarrollador ha hecho un Device Tree para OmniRom, es que ya ha compilado dicha rom o está en ello.
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 OmniRom 4.4, 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 "omni", 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 OmniRom 4.4. 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 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 omni. Si has seguido los pasos tal cual sin cerrar el Terminal, estarás situado en ella (lo veréis donde dice ~/omni~$ al principio de la línea). Si no, sitúate ejecutando "cd && cd onmi".*

                                         
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".

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 (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 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 la ROM con la que trabajes, 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 omni (cd && cd omni)]:

                                             
                                         
*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.

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 OmniRom y 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 y OmniRom los repositorios comunes acorde con tu dispositivo y lo sustituyes en las líneas que dicen CyanogenMod y OmniRom, 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. Editar La Source:

Aquí se viene un paso que no aparece en la entrada de compilar CyanogenMod 11, y son ligeros cambios y modificaciones que haremos a las sources descargadas del device tree de nuestro dispositivo y demás. Esto es necesaria para cualquier ROM que queramos compilar y que la estemos basando en CyanogenMod. En este tutorial saldrá específicamente para OmniRom. Primero de todo, debemos hacer:


Eliminar Archivos

Debemos borrar los archivos cm.mk y cm.dependencies. Estos dos archivos estarán en la carpeta omni/device/samsung/codename. Además, aparecerá un cm.dependecies en omni/device/samsung/qcom-common si usamos ese repo. En este último caso, sólo renómbralo a onmi.dependencies.


Añadir omni.mk

Ahora ha llegado el momento de añadir los archivos que borramos, pero con el código de OnmiRom. Creamos en la ruta un archivo vacío y lo llamamos onmi.mk y lo abrimos con gedit. Ahora hay que escribirlo. Para los Samsung, tenéis aquí una base creada por mí.

Copia y pega el contenido y modifica lo necesario. 

- Donde dice "codename" ponéis el nombre de vuestro dispositivo (ya sabéis dónde aparece en el build.prop). ¡Ojo! Donde dice "full_codename.mk" ahí "codename" lo cambiarás por el nombre con el que salga ese archivo full en la ruta donde mismo estás, aunque por defecto tiene el mismo nombre que el codename.
- En la línea 30, donde dice "model" (solo el minúscula) escribimos el modelo del dispositivo. Lo puedes encontrar en la línea "ro.product.device" del archivo build.prop de tu dispositivo.
- Y por último, lo que debéis poner en "BUILD_FINGERPRINT" y "PRIVATE_BUILD_DESC" también lo podéis ver en el build.prop. El primero aparecerá como "ro.build.fingerprint" y el segundo como "pro.build.description".

Guardamos los cambios y cerramos.

*Atención: Es una base, puede que tengáis que añadir cosas diferentes o variar*


Añadir omni.dependencies

Ahora vamos con el segundo archivo a crear. Es bastante fácil. Creamos archivo vacío (con nombre omni.dependencies) en el directorio y abrimos con gedit. Ahora toca escribirlo; este archivo se basa en el local_manifest. Aquí tenéis un ejemplo de como es. Si has entendido el local_manifest, te resultaŕa fácil hacer este archivo. Varía un poco, ya que aquí la terminología es:

- remote: cuenta de github (CyanogenMod, onmirom, etc)
- repository: enlace del repo quitando "https://github.com/" y el nombre de la cuenta.
- target_path: ruta local del repo. La misma que ponga el local_manifest
- revision: igual que el local_manifest

Debéis añadir todos los repos de vuestro local manifest siguiendo el formato del ejemplo. Al terminar guardamos y cerramos.

Editar manifest.xml

Con este paso añadiremos la cuenta del developer de github para nuestro device tree al manifest de omnirom. Es necesario porque si no dará error al intentar compilar; dirá que no encuentra el repo en su servidor. Pues nos dirijimos a omni/.repo y abrimos el manifest.xml con gedit. Verás lo siguiente al principio:



Para añadir la cuenta de github de donde sacamos el device tree de nuestro dispositivo, lo añadimos siguiendo la estructura de la imagen de arriba:

Copia el remote de github debajo del de onmirom, y en name cambia "github" por el nombre de la cuenta, y luego en fetch añades el mismo nombre después de la barra. Para mi dispositivo (cuya cuenta donde está el device tree se llama "kostoulhs" se vería así:



Listo. Guarda los cambios y cierra el archivo. Sigamos.


Añadir AndroidProducts.mk

Otro archivo que hay que crear en la misma ruta. Seguimos el mismo procedimiento (créalo con el nombre AndroidProducts.mk) y lo abrimos con gedit. Pegad el contenido de este ejemplo.
Ahora para hacerlo compatible para nuestro dispositivo, haz lo siguiente:

- En la primera línea de "LOCAL_DIR" cambia "aosp_n7100.mk" por "full_codename.mk". Cambia codename por el de tu dispositivo, o como dije antes, por el nombre con el que aparezca ese archivo en la ruta.
- En la segunda línea, cambia "n7100" por el codename de tu dispositivo.

Guardamos los cambios y cerramos.
  
Editar vendorsetup.sh

En la misma ruta (omni/device/samsung/codename) abrimos el archivo "vendorsetup.sh" con gedit. Nos aparecerá una línea así:
add_lunch_combo cm_device-userdebug
Simplemente cambia "cm" por "omni". Listo, guarda y sal.


 6. Añadir Código TWRP

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


Editar BoardConfig.mk


Esta parte es la más complicada. Primero de todo vete a onmi/device/samsung/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 omni/device/samsung/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:
Luego, vuelve a BoardConfig.mk y busca la línea "TARGET_RECOVERY_LCD_BACKLIGHT_PATH" y escribe delante de esa línea escribe un almohadilla (#). La línea se volverá azul. Tanto esa línea como la de "TARGET_RECOVERY_INITRC" estarán debajo de una línea con la etiqueta #Recovery.


Ahora llega lo complicado. Hay que añadir líneas (flags) de TWRP. Cuesta un poco saber qué líneas añadir. Puede que tengas la suerte de que haya TWRP para tu dispositivo, por lo que el desarrollador tendrá en su Device Tree, dentro del repo device en branch saldrá "TWRP", entonces allí estará el archivo BoardConfig.mk y lo puedes abrir y buscar las líneas a copiar. Es por ello que al principio puse en pre-requisitos tener TWRP. Si no, tendrás que hacerlo tú mismo. Para cada dispositivo es diferente, y no tengo tiempo para explicar cada línea, así que aquí os dejo un tutorial en XDA (en cuanto tenga tiempo hago un post con eso traducido y explicado).

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


Si sois capaces de entender cómo funciona el rollo, genial. Como he dicho, pronto haré un post con los flags traducidos. Las líneas las añades al final del archivo bajo la etiqueta "#TWRP config". También puedes buscar dispositivos similares al tuyo con OmniRom y mirad el BoardConfig de su device tree (ojo, abriendo la pestañita branch y elige omni-4.4).
Aquí tenéis un ejemplo que usa las flags básicas para un Samsung. Aquí otro ejemplo más básico todavía.

*Atención, la línea que pusimos la almohadilla antes, indica la ruta de la configuración de brillo. Como véis en la imagen, se hace una línea de código TW para esa función*
Hechos los cambios, guarda y cierra.


Recovery.fstab


Para esto lo más sencillo es coger y en omni/device/samsung/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 abré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 véis primero pondremos el nombre de la partición, luego el formato y luego la ruta. Cuando lo hayas pegado (ojo, no se pega lo que sale debajo de flags en el fstab.qcom; lo que está al final de la línea no se copia) tocará añadir flags. En la mayoría de los casos, son las mismas que en el ejemplo, y el número que sale en lenghts está en el fstab.qcom
En el tutorial que pronto tendré sobre flags también traduciré esas. De momento, las tienes en el tuto de XDA que dejé antes.

Una vez terminado, guarda cambios y cierra.

Ahora fíjate en la imagen de arriba donde salían los flags que yo puse en el BoardConfig, la primera línea debajo de la etiqueta, es para especificar la ruta donde hemos creado el archivo twrp.fstab

Hecho todo esto, tendremos la source lista para compilar.


7. 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 omni_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:

                                    
En este se sustituye codename por el de nuestro dispositivo (loganreltexx en mi caso).

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 OmniRom 4.4





8. Errores al Compilar:


Posiblemente ocurran errores al compilar. Aquí diré la solución a los que me han surgido a mí:


Línea Recovery.fstab Dañada

El error que aparecerá en terminal será algo así:

                                       
Para solucionarlo abre BoardConfig.mk que hemos estado editando, y en la parte donde pusimos las flags de TW, pon una almohadilla delante de "TARGET_RECOVEY_FSTAB" y la línea se volverá azul. Guarda y cierra.


Error con Radio FM

Este error será muy común, ya que OmniRom 4.4 no trae compatibilidad para la radio FM de manera nativa, por lo que sin modificar el repo de FM de CyanogenMod, dará error al compilar.
Saldrán unas líneas en rojo que hablarán sobre varios archivos de FM y dirá algo como "Uses a deprecated API". La solución más rápida es desimplementar la radio FM de la ROM.

Para ello abrá que borrar el repo de fm del archivo omni.dependencies. Luego, abre el archivo codename.mk (en codename saldrá el nombre de tu disposotivo) y busca una línea que aparezca con la equiqueta "# FM Radio" y añade almohadilla a las líneas que aparezcan bajo esa etiqueta. Quedaría así:



Error con Soft Reboot

Otro error bastante común, ya que OmniRom no trae opción de reinicio suave. Si ocurre, aparecerá algo en terminal que hablará sobre una línea en el archivo "arrays.xml" que no está declarada.
Para arregralo vamos a "device/samsung/qcom-common/overlays/framework/base/core/res/res/values y abrimos el archivo arrays.xml
Borramos las dos líneas que hablen sobre soft reboot. Al final quedaría así:



Error Líneas no Declaradas

Este error ocurre mucho a la hora de compilar cualquier ROM. El error dice así:




Es muy sencillo de solucionar y en cuanto pilles el truco será muy sencillo para ti. Justo al principio de la línea del error saldrá la ruta a un archivo donde se encuentra lo que no está declarado en la source base.
En el 85% de los casos la ruta es:
device/marca/codename/overlay/frameworks/base/core/res/res/values/config.xml
Abrimos ese archivo, y buscamos la línea de lo que no está declarado (que es lo que saldrá donde yo puse comillas en el código de error arriba). Una vez encontrado, lo pegaremos en el archivo base, que se encuentra en "framework/base/core/res/res/values/config.xml" (todo esto dentro de la carpeta omni". Abrimos el archivo y pegamos las líneas que ocupe el código. Yo recomiendo ubicarla cercana al mismo sitio donde estaba en el primer archivo. Una vez pegada en el archivo base, ya estará listo.



Error Shared Libraries


Este error no sé si es común o no, pero bueno, sé la solución en este caso. Terminal dirá algo sobre que hay líneas de SHARED_LIBRARIES duplicadas en la ruta hardware/qcom/power y device/marca/codename/power
Lo que hay que hacer es ir a la ruta power de nuestro dispositivo, y abrir el archivo Android.mk
Entonces añadiremos una almohadilla delante de las líneas "LOCAL_SHARED_LIBRARIES", "LOCAL_SRC_FILES" y "include $(BUILD_SHARED_LIBRARY)". Al final quedaría así:


Yo solo tuve que hacerlo en esas líneas. A lo mejor ustedes tenéis que hacerlo en más o en menos, depende de cuáles estén duplicadas. Como veis, las líneas que edité ya aparecían en el Android.mk de hardware/qcom/power





Esos son todos los errores que me pasaron al compilar. Si sufres otro, no dudes en comentar y trataremos de ayudarte. Eso sería todo. Saludos!


1 comentario: