Entrada fija

sábado, 29 de agosto de 2015

Añadir Apps a Build

En este tutorial os enseñaré algo bastante simple pero que os puede resultar bastante útil, que es añadir aplicaciones para que se añadan al compilar la ROM. Las añadiremos una vez descargada la source y tengamos todo listo para compilar.
Hay varios métodos y los voy a explicar todos. Empecemos:


1. Añadir Apps desde Source

El primer método de todos es mi preferido, aunque no necesariamente el más sencillo. Para incluir Apps con este método necesitaremos que sea de código abierto, y que esté disponible para su uso.

Tomaré de ejemplo Spirit2FM, que aunque no funcione siendo aplicación de sistema, es un buen ejemplo ya que tiene un código sencillo.
Lo primero que haremos será acceder y su código fuente en GitHub, que nos dejará el enlace el desarrollador de la aplicación. Tendrá un aspecto así.

Entonces descargaremos los archivos (Download zip que aparece a la izquierda) y extraemos los archivos y carpetas. Pegamos lo extraído en la carpeta de trabajo de la ROM en la ruta packages/app/Spirit2FM

*Spirit2FM lo cambias por el nombre de la app que estés usando*

Una vez copiado debemos ver si existe el archivo "Android.mk". Si no existe, lo creamos. Para ello, crea el archivo y pega lo siguiente:

                             

*nombre_app lo cambias por el mismo nombre de la carpeta (Spirit2FM en mi caso)*
*Si existe el archivo, deberás nombrar la carpeta como diga la línea package_name*

Guardamos los cambios y cerramos. Hecho esto nos dirigimos a la carpeta de nuestro dispositivo (marca/device/modelo) y abrimos el "device.mk" (en vez de device saldrá el codename de tu dispositivo) y añadiremos la siguiente línea:

                                       

En mi caso, quedaría así:

                                       

Guardar y salir. Ya estas listo para compilar la ROM con la app incluida.


2. Añadir Prebuilt APK

Este método os resultará bastante sencillo, ya que usaremos el archivo ".apk" para incluirlo en la ROM. Seguiré tomando de ejemplo Spirit2FM (aunque igualmente no sirva como app de sistema) y mi Samsung Galaxy Ace 3 (loganreltexx). Muchos tutoriales incluyen la app en la carpeta "device", sin embargo, es muy propenso a dar errores. Por ello, la añadiremos en el repositorio "vendor".

Lo primero de todo será descargar la aplicación en formato APK. Una vez obtenida, la copiaremos en la ruta vendor/samsung/loganreltexx/propietary/app/nombreapk (o la de tu dispositivo).
Una vez copiada la apk, nos dirijimos a vendor/samsung/loganreltexx y abrimos el archivo "Android.mk". Añadiremos lo siguiente:

                                             

*Si la línea "LOCAL_PATH" ya aparece, no la copiamos*
*Sustituye el "nombre app" y la ruta de la línea "src" por tus correspondientes*

Ahora nos dirigimos a device/samsung/loganreltexx y abrimos loganreltexx.mk (o lo correspondiente a tu dispositivo) y añadimos el siguiente código:

                                            

*El nombre del paquete tiene que ser siempre el mismo. También la carpeta que creamos se tiene que llamar igual*

También puede que la app que vayamos a incluir requiera sus librerías. Esto lo sabrás si al incluir la app en la build y abrirla da forzar cierre. Para añadir las libs, las extraemos de la apk con WinRar. Estarán en una carpeta llamada "armeabi".
Una vez extraídas, las copiaremos en vendor/samsung/loganreltexx/propietary/lib. Si no está la carpeta, la creamos. Ahora para que se incluyan los archivos en la build, editamos el Android.mk de antes, añadiendo este código:

                            
*Cambiamos "libtime_genoff" por el nombre del archivo lib (.so)*
*Añadiremos un código por cada archivo*

Al terminar guardamos los cambios y salimos. Ya tendremos la aplicación lista para incluir.


3. Añadir Funcionalidad Data/app

Bueno, este método no es parecido a los anteriores, ya que no añadiremos la app como de sistema, sino como app de usuario. Es decir, el usuario podrá desinstalarla y demás, como si la hubiera instalado por Google Play.
Es muy útil práctico. Útil porque si una app no funcionaba bien o daba forzar cierre al instalarla en "system" ahora funcionará (sí, por fin funciona Spirit2FM); y práctico porque el proceso se hace una vez compilada la ROM.

Para ello tendremos que tener el archivo zip de la ROM ya compilada y el archivo ".apk" que queramos incluir. Una vez tenido esto, añadiremos en el zip la carpeta data/app (las dos carpetas, es decir, la carpeta app dentro de la carpeta data) y agregamos la apk allí.

Actualizamos el zip y ahora nos dirigimos al updater-script del zip. Está en la carpeta META-INF/com/google/android
Lo abrimos con un editor y encima de la línea package_extract_dir("system", "/system"); añadiremos las siguientes líneas:

                                            

Hecho este guardamos y actualizamos el zip. Ahora, para que no te de error al instalar la ROM, deberás firmarla (sign). Puedes hacerlo siguiendo este estupendo tutorial de htcmania, o usando alguna kitchen. Si tuvieras alguna duda, no dudes en comentarla.

Una vez firmado el zip, ya estarás listo para instalar la ROM.


¡Listo! Has Agregado Una App a la Build

viernes, 28 de agosto de 2015

Local Manifest Genéricos

Muy buenas a todos! En esta entrada haré algo que espero que os ayude mucho. Voy a ir haciendo archivos local_manifest genéricos, con los repositorios comunes para distintos dispositivos, mayoritariamente Samsung. Con eso no se asegura que para tu dispositivo sea exactamente igual por coincidir el chipset, pero en la mayoría de los casos sí.

Antes que nada, explicaré más detalladamente el funcionamiento de este archivo.


1. Funcionamiento de Local Manifest


Si queremos cambiar la lista del manifest.xml, podemos editar el default.xml directamente. Sin embargo, esto haría que la copia local del manifest haga conflicto con la versión oficial en github. Esto podría crear problemas cuando actualicemos el manifest oficial, ya que entra en conflicto con los cambios.
Por ello, no pienses en editar el "default.xml" (Aunque a veces lo hagamos pero para otra cosa, como en OmniRom, para añadir la cuenta del developer de GitHub).

Aquí es donde el local manifest entra en juego.

Crearde un local manifest nos permite personalizar la lista de repositorios utilizados en nuestra copia del código fuente, reemplazando o complementando el manifest por defecto. De esta manera, se puede agregar, quitar o cambiar el código fuente en el manifest oficial con el nuestro propio. Al incluir los repositorios (que ni siquiera tiene por qué residir en GitHub) en un local manifest, podemos sincronizar con el comando "repo sync" del mismo modo que teníamos previamente. Sólo que ahora, tanto los repositorios oficiales del manifest por defecto y los repositorios adicionales que especifiquemos serán comprobados para las actualizaciones.
Por ello, "Local_Manifest" es algo fundamental para los desarrolladores.

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.

De forma muy resumida, Local Manifest es un archivo cuya función es sincronizar proyectos en la carpeta de trabajo local.


2. Usos del Local Manifest

Ahora pasaré a explicar todo lo que puedes hacer con el local manifest, aunque muchas de esas cosas no las usaremos para compilar ROMs, pero el saber no ocupa lugar de más. ;-)

Para añadir repositorios locales, lo primero que haremos será crear el archivo. Aunque lo he explicado en las entradas de compilación, lo explicaré todo en este post. Para crear el archivo, ejecutamos en Terminal:

                                        

Una vez situados el el directorio, crearemos el archivo.

                                        
*También podéis crear el archivo usando el explorador de archivos y editarlo con gedit*

Ahora añadiremos el contenido que queramos sincronizar localmente. Una vez completados los cambios, presiona "Ctrl+o" y pulsa "Enter" para guardar los cambios. Para salir del editor presiona "Ctrl+x".

La estructura por defecto del Local Manifest es así:




Así sería el formato para añadir repositorios/proyectos. La terminología es la siguiente:

- path (directorio): ruta local donde estará el repo
- name (repo): enlace del repositorio quitando "https://github.com/"
- remote (web): en el 99% de los casos hay que poner github
- revision (branch): la marca a usar de dicho repositorio (cm-11.0, android-5.0, etc)

Pues así sería para añadir un proyecto, y crearíamos una línea por cada proyecto a añadir. Éste sería un ejemplo de un local_manifest para añadir repositorios.

Sin embargo, se pueden hacer más cosas a parte de añadir proyectos. Podríamos encontrarnos con uno así:

 

Explico cuál es la función de cada cosa. Antes que nada, aprovecho y explico también qué significa la primera línea de todas.

<?xml version="1.0" encoding="UTF-8"?>

Esta línea es una declaración estándar de XML, diciendo que es un archivo de lenguaje extensible. Una vez establecido, las etiquetas <manifest> y </manifest> encierran el contenido que será reconocido por el comando repo.


<remove-project name="CyanogenMod/android_hardware_qcom_fm" />

Esta línea se encarga de eliminar un proyecto (el hardware de fm en este caso) que se encuentre declarado en el default manifest. Esto nos sirve por si hay proyectos en el manifest por defecto que no queremos que se descarguen ya que no serán necesarios, por lo que ahorraremos tiempo de descarga y espacio de disco. Una vez ejecutemos "repo sync", el repositorio eliminado no estará disponible en el source tree que hayamos sincronizado.


<project path="hardware/qcom/fm" name="aogp/hardware/qcom/fm" remote="github"

Como expliqué antes, esta línea añade un proyecto, y debe constar de las cuatro partes que expliqué. Sin embargo, "revision" es opcional, ya que si no especificamos la branch a descargar (o el repositorio solo tiene una), se sincronizará la que esté por defecto (o la única disponible).

Y esto sería toda la explicación sobre este archivo. Ahora pasaremos a lo más interesante.



3. Local Manifest Genéricos

Bueno, aquí iré añadiendo local manifest genéricos que os serán útiles si tu dispositivo no tiene soporte oficial de CyanogenMod.
Los que publicaré serán para CyanogenMod 11, ya que es la ROM que el 99% de desarrollador compilan primero para dispositivos no soportados, ya que es muy fácil usarla de base para portar otras ROMs.
Si vas a compilar otra versión de CyanogenMod, vete al repositorio y comprueba que esté disponible la versión de android (branch) que vayas a trabajar.

Samsung Qcom MSM-8930

El local manifest si tu dispositivo es un Samsung Qualcomm MSM-8930 será así. Recuerda que debes cambiar la líneas que son específicas para cada dispositivo (las dos últimas en este caso). 
Todos los archivos estarán en mi cuenta de PasteBin, así los podréis copiar o descargar fácilmente.



Samsung Bcm 21553

El local manifest si tu dispositivo es una Samsung Broadcom 21553 será así. Recuerda que debes cambiar la líneas que son específicas para cada dispositivo (la penúltima en este caso). 
Todos los archivos estarán en mi cuenta de PasteBin, así los podréis copiar o descargar fácilmente.


viernes, 21 de agosto de 2015

Hacer Stock ROM Flasheable por CWM

Muy buenas a todos! Hoy os traigo un tutorial bastante interesante, ya que a partir de los archivos ".img" de nuestra Stock ROM, haremos que sea instalable por un custom recovery. Es una buena base para empezar con las custom roms basadas en Stock. Dicho esto, empecemos con el Tutorial:


Pre-requisitos:

- JDK (Java Development Kit)

*Recomiendo haber hecho el proceso de inicializar entorno de compilación*

1. Inicializar Entorno

Lo primero que haremos será configurar la herramienta que utilizaremos para hacer el trabajo, y será dsixda's kitchen. Lo primero que haremos será descargar el paquete necesario desde aquí
Una vez descargado el paquete comprimido, copiamos la carpeta extraída al directorio "home" (por defecto al abrir el explorador de archivos). Ahora nos situaremos en ella con Terminal:

                                      

Y la abrimos:

                                      
Si cumplimos todos los pre-requisitos, debería abrirse sin problemas. Veremos una interfaz así:

          

Hecho esto ya habremos configurado la cocina.


2. Añadir Soporte a tu Dispositivo

Lo que haremos ahora será añadir soporte a tu dispositivo para la cocina. No es algo estrictamente vital para lo que vamos a hacer ya que podemos editar los mount points luego, pero recomiendo hacerlo y así ya lo tienes con soporte para todas las veces que la uses.

La lista oficial de dispositivos soportados es la siguiente:

                    

Si tu dispositivo no se encuentra en esa lista, habrá que hacer lo siguiente:

Nos dirijimos a la carpeta kitchen/tools/edify_defs y creamos un archivo vacío que lleve de nombre el "codename" de nuestro dispositivo. (El codename lo puedes ver en la línea ro.product.device del build.prop de tu dispositivo)
Una vez creado, tendremos que obtener los mount points de nuestro dispositivo. Para ello habrá que desempaquetar el "recovery.img" de tu dispositivo, y abrir el archivo "recovery.fstab" que estará en la carpeta ramdisk. Puedes hacer ese proceso de desempaquetado con la misma dsxida's kitchen o con este tutorial.

Cuando tengamos localizados los puntos de montaje, abriremos el archivo vacío que creamos y habrá que especificarle a la cocina en ese archivo cuáles son los mount points de nuestro dispositivo. Para ello abre otro archivo de tools/edify_defs de un dispositivo del mismo manufacturador que el tuyo y sigue el mismo esquema en tu archivo. Una vez hecho, guarda los cambios y cierra.

Con esto ya habrás dado soporte a la cocina. Sigamos:


3. Crear Zip Flashable

Este será el ansiado paso final en el que por fin crearemos la Stock ROM para instalar por CWM/TWRP.
Lo primero que haremos será copiar los archivos "boot.img" y "system.img" a la carpeta kitchen/original_update

*Puede que tu dispositivo use otro formato de archivo y demás, pero el proceso es el mismo*
Además, recomiendo copiar "cache.img" (también puede venir como cache.img.ext4, le quitamos la extensión ext4) para añadir los CSC (código de país) a la Stock.

Una vez copiados los archivos necesarios, iremos al Terminal con la cocina abierta, y teclearemos el número 1 (Set up working folder from ROM) y le damos a enter. Esto inicializará la carpeta donde trabajará la cocina.

*Te dirá que no encuentra archivo cache. Si lo quieres implementar, lo copiaremos ahora en la carpeta de trabajo que creó la cocina, para que la implemente luego*

Ahora puedes añadirle root, busybox y demás características a tu ROM. Eso lo dejo de forma libre. Una vez hayas terminado de tematizar, teclea la opción 99 (Build ROM from working folder) y cuando te diga que tipo de guía durante la instalación, elige la interactiva.
La interfaz te irá guiando durante el proceso, y lee con atención todo lo que te vaya preguntando, pero no deberá haber ningún tipo de problema.

Atención: Puede que al añadir soporte a tu dispositivo, no se haya implementado correctamente. Una vez creado el zip, abre el archivo "updater-script" que se encontrará en la carpeta META-INF. Una vez abierto hay que asegurarse de que los mount points sean los de nuestro dispositivo. (Los mount points saldrán en líneas en las que haga format system, extract boot.img y así). Corregimos lo necesario, guardamos y actualizamos el zip. Así habremos terminado.


¡Ya Has Creado tu Stock ROM por CWM!

Cómo Hacer un LogCat

Muy buenas a todos! Hoy aprenderemos una parte muy importante a la hora de desarrollar Android, y es el LogCat, registro de informe de errores. Con esta herramienta podremos identificar las causas de errores y bugs de los cuales no se ve la solución con un simple testeo. Como símil, serían los aparatos OBD que hacen diagnóstico de errores de un automóvil.
Pues una vez entendido su función, empecemos con el Tutorial:

*Atención: Hay maneras de hacer LogCat desde el móvil con apps como CatLog, pero yo explicaré el método "tradicional" por Terminal, que a mí me gusta más*


1. Preparar Entorno

Lo primero de todo será descargar los archivos necesarios para trabajar (si no los tienes ya instalados). Para ello, ejecutaremos los siguientes comandos en Terminal:

                                          
Esto descargará la librerías de 32-bits, necesarias si trabajamos en una PC de 64-bits.

Luego instalaremos Android-SDK y JDK (Java), además de ADB y FastBoot, que si seguiste el tuto de "Inicializar Entorno para Compilar" ya lo tendrás. Si no, será ejecutar lo siguiente:


Java

                                     

Android-SDK

Descargamos el archivo comprimido de su página oficial. Dejamos el archivo en la carpeta "Downloads"
*Para descargarlo vete al final de la página donde dice "SDK Tools Only" y elige la versión para Linux.

ADB & Fastboot

                    

Ahora deberás seguir los siguientes pasos muy atentamente. Primero crearemos el siguiente directorio:

                                         

Extraemos el SDK descargado:

                                 

Y lo movemos al directorio creado:

                                       

Ahora abrimos el mánager de SDK:

                                       

Este comando abrirá el programa. Entonces elegiremos "SDK Tools" y "Adnroid SDK Platform Tools for ADB" e instalamos los paquetes seleccionados.

Ahora dirígete al directorio "home" con el explorador de archivos. Presiona Ctrl+h (mostrar archivos ocultos) e identifica el archivo ".bashrc". A continuación lo abrimos y pegamos lo siguiente:

                               
*Si los paquetes se descargaron en una carpeta con nombre diferente, simplemente cámbialo*

Ahora ejecutaremos un comando en Terminal para que el PC reconozca cualquier dispositivo:

                                   

Se abrirá un archivo con gedit. Pegamos lo siguiente:

                         

Guardamos los cambios y cerramos, y ejecutamos en Terminal:

                             
Y luego:

                                    

Esto abrirá otro archivo. Ahora añadiremos la siguiente línea justo encima de donde aparece escrito "exit 0"

                       
*En usuario escribe el nombre de usuario que tenga la PC*

Una vez que todo esté instalado, ejecutaremos lo siguiente:

                                     

Y ahora estaremos listos para tomar un LogCat.


2. Tomar el LogCat:

Ahora por fin haremos el diagnóstico de errores de nuestra ROM. Para ello lo primero será comprobar que nuestro dispositivo está conectado:

                                    

Deberá aparecer nuestro dispositivo. A continuación escribimos:

                                    

Con ello el LogCat se guardará en el archivo de texto "logcat.txt". También puedes ejecutar este otro comando:

                                   

Este hará que el LogCat se guarde con estilo largo, por lo que todo estará más ordenado y cada línea estará donde le corresponde.

*Cuando se da salida a un archivo, verás una nueva línea, pero nada impreso, esto es normal. Para detener LogCat de escritura en un archivo, presiona Ctrl+C *

Una vez hecho esto, ya habremos tomado el LogCat.


3. Terminología del LogCat:

Aquí voy a explicar lo que significa cada término en el LogCat. Dichos términos aparecerán al principio de la frase en el LogCat.

I/> ===> Information
S/> ===> Silent
D/> ===> Debug
W/> ===> Warning
E/> ===> Error
F/> ===> Fatal

No creo que de problema a la hora de entenderlo. Lo que sale arriba es que está correcto,y cuanto más abajo es que es más grave. "Debug" significa depuración. Y eso sería todo.

¡Listo! Has Hecho un LogCat


martes, 18 de agosto de 2015

Subir Device Tree a Github

¡Muy buenas seguidores! Hoy traigo un tutorial muy importante para los que estén empezando a ser ya desarrolladores con algo de experiencia: aprenderemos a publicar un repositorio con el código de dispositivo que hayamos editado localmente y demás.
Pero antes de nada, ¿qué es GitHub?

GitHub es una plataforma de desarrollo colaborativo de software para alojar proyectos utilizando el sistema de control de versiones Git. El código se almacena de forma pública, aunque también se puede hacer de forma privada, creando una cuenta de pago.
GitHub aloja tu repositorio de código y te brinda herramientas muy útiles para el trabajo en equipo, dentro de un proyecto.
Además de eso, puedes contribuir a mejorar el software de los demás. Para poder alcanzar esta meta, GitHub provee de funcionalidades para hacer un fork y solicitar pulls.

Pues dicho esto, empecemos con el proceso.


1. Crear Cuenta en GitHub:

Como es evidente, este será el primer paso. Entramos en su página oficial y nos registramos.



Rellena los datos que te pide y confirma el registro con el correo electrónico que te enviarán.



2. Instalar Git

Ahora instalaremos el sofware necesario para trabajar. Aquí tienes más información sobre él. Seguramente tengas instalado los archivos, pero si no, ejecuta lo siguiente en Terminal:

                                        

Cuando se haya instalado, tendremos que configurarlo con nuestra cuenta de GitHub. Usaremos dos comandos que ya usamos en su momento al compilar CyanogenMod.

                              
                              

Con esto habremos configurado Git con nuestra cuenta de GitHub.


3. Generar Clave SSH

Ahora crearemos una SSH Key, para poder establecer una conexión segura entre tu PC y el servidor de GitHub. Para generar la clave haremos lo siguiente en Terminal:

                                  
*El correo debe ser siempre el mismo que hemos estado usando*

Le damos a enter y veremos lo siguiente:

                     

Le daremos a enter de nuevo sin escribir nada. Esto creará el directorio donde se guardará la clave. A continuación nos pedirá introducir una contraseña (passphrase). No la confundas con la de GitHub; yo para no liarme usé la misma que la que uso en la cuenta de GitHub.
Verás lo siguiente:

                   
Una vez configurada la contraseña, aparecerá lo siguiente:

              

Con esto habremos creado nuestra clave SSH.


4. Añadir Clave a GitHub

Ahora lo que haremos será añadir la SSH Key a GitHub. Para ello vamos a la carpeta ".ssh" que estará en el directorio "Home". Abrimos el archivo "id_rsa.pub" con gedit y copiamos el contenido.

Una vez hecho vamos a GitHub y nos dirigimos a ajustes.



Allí iremos a la pestaña "SSH Keys". Le daremos a "Add SSH Key" arriba a la derecha, y en el cuadro de texto pega el contenido de la clave, guarda los cambios y acepta.
Para comprobar que funcione, ejecutaremos lo siguiente en Terminal:

                                        

Deberá aparecer lo siguiente:

               

Escribimos "yes" y le damos a enter. Veremos este código:

                      

Con esto ya estaremos listos para subir el Device Tree a GitHub.


5. Crear Repositorio

Ahora crearemos el repositorio en nuestro GitHub y almacenaremos el código allí. Lo primero de todo será situarnos en la carpeta la cual vayamos a subir.

*Pondré mi ejemplo con la carpeta device de mi Ace 3 (loganreltexx) modificada para OmniRom 4.4*

                                         
Ahora escribimos:

                                         

Eso inicializará un repo vacío en la carpeta ".git" en la ruta donde estamos. Lo siguiente será configurar los archivos que se copiarán en GitHub. Ejecuta:

                                         

Ahora comentaremos los archivos que vamos a subir con el siguiente comando:

                                        

Hecho esto vamos a GitHub y clicamos en la cruz y le damos a "Nuevo repositorio".




Entraremos en la página de configuración del repositorio. Ahí añadimos un nombre para el repo y una descripción. Siguiendo mi ejemplo, lo haría así:



Le damos a crear repositorio y verás la siguiente pantalla:




Debéis copiar el código HTTPS que aparece al principio, o debajo, es el mismo. Entonces volvemos a Terminal y escribimos lo siguiente:



*Cambia "omni" por el nombre de la ROM en la que se basa el device tree, y el link cámbialo por el correspondiente al tuyo*

Ahora crearemos la branch. Para ello:

                                  

*Android-4.4 lo cambias por la que estés trabajando (cm-11.0, kitkat, master, etc). Yo he puesto "android-4.4 porque así es como viene KitKat en el repo oficial de OmniRom*

Y comprobamos:

                                 

Hecha la comprobación, será el ansiado momento de subir los archivos. Tendrás que ejecutar en Terminal:

                                  

*Como es evidente, sustituye "omni" y "android-4.4" por lo que hayas puesto antes*

Te pedirá introducir la passphrase, la escribes y das a enter. Empezará a publicar los archivos de la carpeta elegida.


¡Listo! Ya Has Subido el Device Tree a GitHub

-----------------------------------------------------------------------------------------------------
Iré actualizando el post con más cosas útiles sobre GitHub. Esto es todo de momento. Saludos!


domingo, 16 de agosto de 2015

Desempaquetar Kernel

Muy buenas a todos! Hoy os traigo un tutorial sencillo sobre cómo desempaquetar/extraer los archivos de vuestro kernel, también aplicable a recovery.


Requisitos:

*Sistema operativo Windows o Linux
*Conocimiento mínimo sobre ordenadores
*Kernel/Recovery en formato ".img"

Atención: asegúrate de que el nombre del kernel/recovery no tiene espacios. Recomiendo llamarlos boot.img y recovery.img respectivamente.

Si ya tienes eso, empecemos con el tutorial:


1. Descargar Android Image Kitchen

Lo primero que haremos será descargar la herramienta necesaria para trabajar, por cortesía de @osm0sis, reconocido desarrollador de XDA.
Los enlaces de descarga son los siguientes:

- Windows: CLICK AQUÍ
- Linux: CLICK AQUÍ

Una vez terminada la descarga vayamos al siguiente paso.


2. Extraer Archivos

Ahora extrae el archivo descargado y copia la carpeta en el directorio que quieras (En Linux recomiendo en HOME).
Si usas Windows no hay problema, pero si usas Linux sitúate (una vez extraída la carpeta) en el directorio con Terminal. Si la has puesto en HOME, tendrás que ejecutar:

                                         



3. Desempaquetar Imagen

Ahora es el momento de desempaquetar la imagen. Para ello, seguiremos estos sencillos pasos:

1. Copia el archivo ".img" a la carpeta contenedora de los archivos del programa
2. Arrastra el kernel/recovery encima del archivo "unpackimg" y suelta
3. Se abrirá un cuadro de diálogo y el kernel se extraerá en una subcarpeta
4. Haz los cambios que quieras o lo que necesites

Si usas Linux, los pasos 1 y 2 los harás con terminal. Para ello, ya ubicado en el directorio" ejecuta el siguiente comando:

                                     

El nombre "boot.img" lo cambias por el nombre que tenga el archivo de imagen que quieras extraer.


4. Re-empaquetar Imagen

Ahora para volver a empaquetar la imagen con los cambios realizados, solo abrá que ejecutar el archivo "repackimg" haciendo doble click izquierdo. En Linux, se ejecutará el siguiente comando en Terminal:

                                   

El nombre "boot.img" lo cambias por el nombre que tenga el archivo de imagen que quieras empaquetar.


5. Limpiar Carpeta de Trabajo

Si quieres eliminar la carpeta con los datos extraídos de forma rápida, ejecuta el archivo "cleanup"
En Linux, usa el siguiente comando de terminal:

                                

Eso sería todo el tutorial. Espero que os haya sido de ayuda. Saludos!



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!