JesusAlber1
11/11/12, 15:00:07
He creado este tutorial porque actualmente la mayoría de las ROMs cocinadas suele incorporar AROMA (la mayoría de las sacadas de las cocinas de xda, que suelen ser las más extendidas). La idea es que todos los que quieran crear una CUSTOM ROM puedan implementar este instalador si necesidad de tener que invertir tiempo estudiando como hacerlo desde varios post y probando. Aquí está todo estructurado.
AROMA es un instalador que permite que elijamos diferentes opciones al flashear una ROM. Este instalador es muy cómodo, porque el creador de la ROM (cualquiera de nosotros que haga una Custom Rom) puede incorporar diferentes opciones para que cada usuario elija las que se adaptan más a sus necesidades o gustos.
Antes de modificar nada, recomiendo que quien vaya a hacer un instalador AROMA consiga un instalador de una ROM ya hecha. Esto es porque hay algunos parámetros como la calibración de la pantalla y demás que necesitamos conocer y que son diferentes en cada dispositivo. Por lo que es muy sencillo basarse en un instalador hecho, aunque al final lo modificaremos y quedará a nuestro gusto X-D
Si alguien quiere puede descargar el META-INF propio de AROMA, aunque tendríamos que emplear muchísimo tiempo para conseguir que fuera instalador de una ROM. (AROMA puede ser instalador de ROMs o un instalador de Tweaks o aplicaciones... Personalmente, creo que la potencia de AROMA se aprovecha mejor en el instalador de una ROM, ya que también podremos elegir aplicaciones y tweaks que meter)
Pondré como ejemplo SlimMania (ROM para Xperia Arc/S) hecha por luiseteyo y por mi, para el subforo de HTCmania de nuestro terminal.
SlimMania tiene unas características propias, con aplicaciones propias y aplicaciones del sistema propias tambien. Con esto quiero decir que nosotros hemos elegido unas opciones para AROMA determinadas, pero cualquiera puede poner las opciones que quiera. AROMA ES TOTALMENTE PERSONALIZABLE!
Copio el código de SlimMania, es bastante largo, pero es un claro ejemplo de lo que se puede hacer, además, cuanto más largo es mejor porque veis los diferentes grupos y opciones de cada grupo. Es un buen ejemplo!
Cabe destacar unos conceptos importantes de AROMA (no es necesario saberlos):
-selectbox: Conjunto de opciones donde es obligatorio marcar una (da igual la que sea). Se da al elegir opciones del sistema, es decir, el tipo de bloqueo de pantalla, teclado, barra de notificaciones... Ya que son necesarias para que el sistema operativo funcione correctamente. Por defecto, se suele poner una opción por si el usuario quiere instalar las recomendaciones y para que no se olvide marcar ninguna y que tenga que volver a flashear.
-checkbox: Conjunto de opciones donde se pueden elegir todas las que quiera o ninguna. Se da para elegir aplicaciones opcionales o tweaks no necesarios que puede meter el usuario si quiere...
-resread: muestra un archivo .txt modificado previamente por el desarrollador donde aparecen: términos y condiciones o el changelog de la ROM.
-ini_get(): función que llama al ini_set(), donde se han metido previamente unos datos que mostrará después el ini_get.
-casi todo lo que está entre comillas: "(lo que sea)" suele ser modificable por el creador para adptarlo a su propia ROM. Si tiene la estructura en aroma-config "@..." no debemos modificarlo, porque @ se refiere a un objeto especial. En updater-script sí debemos modificarlos.
Recomiendo instalar Notepad ++ (http://download.tuxfamily.org/notepadplus/6.2/npp.6.2.Installer.exe) para editar los textos o el editor de Linux.
Descargas:
SlimMania (ROM completa): http://d-h.st/Lqd
RECOMENDADO! SlimMania (Ejemplo de AROMA, con META-INF y carpeta aroma de aplicaciones sin aplicaciones, ejemplo de distribución de carpetas): http://www.mediafire.com/?1tgm8634eqk9dfi
Aroma installer (original, no recomendado porque faltan muchas cosas): http://d-h.st/vi6
Empezamos!
1-Descargamos cualquier ROM con AROMA de nuestro terminal y extraemos la carpeta META-INF del update.zip (cualquier .zip flasheable de una ROM). También debemos fijarnos en la carpetas carpetas que hay en el flasheable .zip (luego entenderemos mejor el código).
http://i.minus.com/i622V4w4LQFid.png
Al lado de la carpeta META-INF ,hay una carpeta llamada aroma, allí meteremos TODOS los archivos que se corresponderán con las opciones. Creamos una carpeta para cada aplicación o archivo y dentro metemos lo que queremos que se extraiga.
La de SlimMania es:
http://i.minus.com/iFt26e9IFfRRP.png
2-Abrimos la carpeta META-INF / com / google /android . Veremos una lista de archivos con una carpeta llamada aroma.
http://i.minus.com/iYWJjPoDrm10u.png
Abrimos los archivos seleccionados en rojo en el editor de texto (Notepad++ en mi caso): aroma-config y updater-script.
En la carpeta /META-INF/com/google/android/aroma tendremos unos archivos .txt importantes para nosotros, es necesario modificarlos, son los marcados (para modificarlos seguimos la estructura que tienen, no me voy a extender más porque sino sería un tutorial muy amplio)
También debemos modificar sample.png para poner la imagen que queramos con un tamaño 480x854 pixeles:
http://i.minus.com/ixcnIcG2p7xHi.png
Empezamos con el aroma-config. Os pondré fragmentos de mi código y explico para que sirve cada cosa. El creador pone comentarios en inglés con la estructura: #comentario. Yo los pondré en rojo :ok:
Todas las frases que pone modificable, son las que se pueden cambiar manualmente según queramos, la ROM que sea o según el idioma, NO se cambian automáticamente con el idioma de AROMA.
Introducción
Introducción en AROMA, configuración esencial: Datos de la ROM, calibración de pantalla (depende del modelo del teléfono), fuente del instalador e imagen propia de la ROM.
calibrate("0.9718","4","1.0176","-9"); Calibración de la pantalla, cada modelo tendrá una distinta, no la tocamos
loadlang("langs/es.lang"); Lenguaje del instalador AROMA, yo he puesto español (es.lang) en inglés sería (en.lang). Además del idioma del instalador debemos cambiar las frases que ponemos entre comillas, iré avisando cuales son)
fontresload( "0", "ttf/DroidSans.ttf", "12" ); Fuente del instalador, no la tocamos
fontresload( "1", "ttf/DroidSans.ttf", "18" );
ini_set("rom_name", "SlimMania"); Nombre de nuestra ROM
ini_set("rom_version", "1.0"); Versión de nuestra ROM
ini_set("rom_author", "JesusAlber1 & Luiseteyo"); Autores de la ROM
ini_set("rom_device", "Xperia arc S"); Modelo del teléfono
ini_set("rom_date", "29 10 2012"); Fecha de expedición de la ROM
splash(
#-- Duration 6000ms / 5 seconds
6000, Duración en milisegundos de la muestra de la imagen de nuestra ROM.
#-- <AROMA Resource Dir>/sample.png Tenemos que poner nuestra imagen con el nombre sample.png en la carpeta aroma que estaba en la misma carpeta que el archivo que modificamos
"sample"
);
Primera parte del código
Primera parte del código: Selección de tema del propio instalador AROMA, para que se haga más amena la instalación según el gusto de cada usuario.
################################################## ################################################## ###############
#
# STEP 1 - SELECT THEME
#
selectbox( Tipo de selección de opciones, explicado al principio del post
#-- Title
"<~themes.title>",
#-- Sub Title
"<~themes.desc>",
#-- Icon: <AROMA Resource Dir>/icons/personalize.png or <ThemeDir>/icon.personalize.png
"@personalize",
#-- Will be saved in /tmp/aroma/theme.prop Guarda las opciones en un archivo temporal llamado theme.prop (no nos afecta)
"theme.prop",
#---------------------------------[ Selectbox Without Group ]----------------------------------#
# TITLE | SUBTITLE | Initial Value #
#------------------+-----------------------------------------------------------+---------------#
"MIUI", "MIUI Theme by mickey-r & amarullz", 0, #-- selected.0 = 1 Tema estilo MIUI corresponde al 1
"ICS", "Ice Cream Sandwitch by DemonWav & amarullz", 0, #-- selected.0 = 2 Tema estilo ICS corresponde al 2
"MIUI V4", "MIUI 4 Theme by amarullz & Lennox", 0, #-- selected.0 = 3 Tema estilo MIUI v4 corresponde al 3
"Sense", "HTC Sense Theme by amarullz", 0 #-- selected.0 = 4 Tema estilo Sense de HTC corresponde al 4
#--------[ Initial Value = 0: Unselected, 1: Selected, 2: Group Item, 3: Not Visible ]---------#
);
##
# SET THEME
#
#-- Change Info:
# file_getprop : should use absolute path "/tmp/aroma/theme.prop"
# prop : just use relative path "theme.prop" will automatically read the "/tmp/aroma/theme.prop"
# Los if condicionan cada opción, es decir, si elegimos la opción 1 entonces el tema será MIUI, si elegimos la opción 2 entonces el tema será ICS y así hasta las 4 opciones
if prop("theme.prop","selected.0")=="1" then
theme("miui");
endif;
if prop("theme.prop","selected.0")=="2" then
theme("ics");
endif;
if prop("theme.prop","selected.0")=="3" then
theme("miui4");
endif;
if prop("theme.prop","selected.0")=="4" then
theme("sense");
endif;
Segunda parte del código:
Segunda parte del código: Muestra al usuario la información de la ROM más extendida y de forma más clara.
################################################## ################################################## ###############
#
# STEP 2 - SHOW ROM INFORMATION
#
viewbox(
#-- Title
"Bienvenido a SlimMania!", Mensaje de bienvenida al usuario, personalizable por cada desarrollador en el idioma correspondiente
#-- Text
"Vas a instalar <b>"+ Personalizable por cada desarrollador en el idioma correspondiente
#-- Get Config Value
ini_get("rom_name")+ Muestra al usuario el nombre de la ROM, puesto en las primeras líneas de AROMA
"</b> for <b>"+ini_get("rom_device")+"</b>.\n\n"+ Muestra al usuario el dispositivo en el que va a usar la ROM, también indicado en las primeras líneas de AROMA
" Version\t: <b><#selectbg_g>"+ini_get("rom_version")+"</#></b>\n"+ Muestra la versión de la ROM
" Codename\t: <b><#selectbg_g>SlimMania</#></b>\n"+ Muestra el código de la ROM (nombre identificativo, normalmente lo más breve posible), este nombre se cambia aquí!
" Updated\t: <b><#selectbg_g>"+ini_get("rom_date")+"</#></b>\n\n\n"+ Muestra la fecha en la que se creó la ROM, puesta en las primeras líneas también.
"Pulsa Siguiente para continuar con la Instalacion", Mensaje de cada desarrollador en su idioma correspondiente, es para continuar
#-- Icon
"@welcome"
);
Tercera parte del código
Tercera parte del código: Muestra el mensaje de los desarrolladores, en este caso es para aceptar los términos y condiciones de instalar la ROM (No nos hacemos responsables de bootlops ni brikeos...)
################################################## ################################################## ###############
#
# STEP 3 - LICENSE
#
agreebox(
#-- Title
"Terminos y condiciones", Modificable por cada uno
#-- Subtitle / Description
"Lee atentamente y acepta para continuar con la instalacion.", Modificable por cada uno
#-- Icon
"@license",
#-- Text Content ( Read from <AROMA Resource Dir>/license.txt )
resread("license.txt"), AROMA muestra el archivo license.txt, modificado previamente por el creador y se refiere a los términos y condiciones escritos. license.txt está en la carpeta aroma situada junto a aroma-config
#-- Checkbox Text
"Acepto los terminos y condiciones...", Modificable
#-- Unchecked Alert Message
"Por favor, marca la casilla de aceptar..." Modificable
);
Cuarta parte del código:
Cuarta parte del código: Muestra al usuario el changelog (respecto a versiones anteriores o sólo el nuevo, depende de qué pongamos en el archivo correspondiente).
################################################## ################################################## ###############
#
# STEP 4 - CHANGELOG
#
textbox(
#-- Title
"Changelog SlimMania", Modificable
#-- Subtitle
"Changelog de la nueva version de SlimMania", Modificable
#-- Icon
"@update",
#-- Arg 4
resread("changelog.txt") Muestra al usuario el archivo changelog.txt donde está el changelog escrito por el desarrollador. changelog.txt está en la carpeta aroma situada junto a aroma-config
);
Quinta parte del código:
Menú principal: Pide al usuario que elija entre Instalar la ROM o Salir del instalador.
##
# MAIN MENU
#
menubox(
#-- Title
ini_get("rom_name") + " " + ini_get("rom_version"), Muestra el nombre de la ROM y la versión
#-- Sub Title
"Elige una de las opciones:", Modificable
#-- Icon
"@welcome",
#-- Will be saved in /tmp/aroma/demo.prop Guardará los cambios en demo.prop, no tocamos nada.
"demo.prop",
#-------------------------+-----------------[ Menubox Items ]-------------------------+---------------#
# TITLE | SUBTITLE | Item Icons #
#-------------------------+-----------------------------------------------------------+---------------#
"Instalar ROM", "Instalar SlimMania en este dispositivo", "@install", #-- selected = 1 Modificar según la ROM y el idioma
"Otras opciones", "Salir, reiniciar, etc.", "@apps" #-- selected = 2 Más de lo mismo
);
Si el usuario elige la opción 2, es decir, Otras opciones, el instalador le llevará a una nueva ventana:
##
# MISC MENU
#
if prop("demo.prop","selected")=="2" then El usuario ha elegido 2 (este if se refiere a: "si el usuario elige la opción 2, entonces -pasa esto-).
#-- Show Other Demo
menubox(
#-- Title
"Cancelando...", Modificable
#-- Sub Title
"Elige una opción", Modificable
#-- Icon
"@cancel",
#-- Will be saved in /tmp/aroma/other_demo.prop Guarda los cambios en other_demo.prop, no tocamos nada.
"other_demo.prop",
#-------------------------+-----------------[ Menubox Items ]-------------------------+---------------#
# TITLE | SUBTITLE | Item Icons #
#-------------------------+-----------------------------------------------------------+---------------#
"Reiniciar", "Reiniciar el dispositivo", "@alert", #-- selected = 1 Modificable
"Salir", "Regresar al recovery", "@install" #-- selected = 2 Modificable
);
Ahora, dentro de este nuevo menú, el instalador dice:
#-- Reboot
if prop("other_demo.prop","selected")=="1" then Si el usuario elige 1, entonces reinicia
if
confirm(
#-- Title
"Reiniciar", Modificable
#-- Text
"¿Reiniciar el dispositivo?", Modificable
#-- Icon (Optional)
"@reboot"
)=="yes"
then
reboot("now"); Reinicia el dispositivo si hemos marcado "yes"
endif;
endif;
#-- Exit
if prop("other_demo.prop","selected")=="2" then Si el usuario elige la opción 2 de este menú:
if
confirm(
#-- Title
"Salir", Modificable
#-- Text
"¿Volver al recovery?", Modificable
#-- Icon (Optional)
"@exit"
)=="yes"
then
#-- Exit -
exit(""); El dispositivo sale del instalador si hemos marcado "yes"
endif;
endif;
#-- Back To Other Demo Menu Si el usuario no elige la segunda opción, va volviendo al menú anterior hasta llegar al menú donde se elige si Instalar la ROM u Otras opciones.
back(
getvar("1")
);
endif;
Si el usuario elige la opción 1, es decir, Instalar la ROM el instalador le llevará a la siguiente ventana: (será elegir el modelo, si queremos instalar la ROM en un terminal específico, omitimos este paso!)
menubox(
#-- Title
"Elige tu modelo:", Modificable
#-- Sub Title
"Elige el modelo de tu terminal:", Modificable
#-- Icon
"@personalize",
#-- Will be saved in /tmp/aroma/type.prop Guarda las opciones en type.prop, no tocamos nada
"type.prop",
#-------------------------------------+-----------------[ Menubox Items ]-------------------------+---------------#
# TITLE | SUBTITLE | Item Icons #
#-------------------------------------+-----------------------------------------------------------+---------------#
"Arc S", "Sony Xperia arc S LT18i", "@device", #-- selected = 1 La opción 1 es el Arc S, el nombre del dispositivo es modificable
"Arc", "Sony Xperia arc LT15i", "@device" #-- selected = 2 La opción 1 es el Arc, modificamos tanto "Arc" como "Sony Xperia arc LT15i"
);
Sexta parte del código:
Sexta parte del código: aquí elegiremos las opciones esenciales, es decir, tenemos que elegir una de las opciones, da igual la que sea, pero una tiene que haber para que funcione todo.
selectbox( Obliga a que siempre elijamos una sola opción, da igual la que sea, pero como como máximo y como mínimo tiene que ser una opción.
#-- Title
"Apariencia personalizada", Modificable
#-- Sub Title
"Elige lo que quieras que contenga tu nueva ROM", Modificable
#-- Icon
"@choose",
#-- Will be saved in /tmp/aroma/patch.prop Guardará estos cambios en patch.prop, un archivo temporal, no tocamos nada
"patch2.prop",
#-----------------------+-----------------[ Selectbox ]---------------------------+---------------#
# TITLE | SUBTITLE | Initial Value #
#-----------------------+---------------------------------------------------------+---------------#
"Bloqueo de pantalla", "", 2, #-- Group 1. key = "selected.1" El 2 dice que es un grupo nuevo, será el grupo numero 1 (selected.1)
"AOSP lockscreen", "Bloqueo de pantalla estilo AOSP, elegante y sencillo", 1, #-- selected.1 = 1 El 1 dice que está marcada por defecto y es la posición del grupo 1 (selected.1 = 1)
"Xperia T lockscreen", "Bloqueo del Xperia T con shortcuts. ¡No olvides el parche!", 0, #-- selected.1 = 2 El 0 dice que no está marcada por defecto y que es la posición 2 del grupo 1 (selected.1 = 2)
"Barra de notificaciones", "", 2, #-- Group 2. key = "selected.2" Grupo 2 (selected.2)
"Estilo GX 1", "Estilo GX, bateria en circulo blanco y toggles muy sencillos", 1, #-- selected.2 = 1 Opción 1 del grupo 2 (selected.2 = 1), además está marcada por defecto
"Estilo GX 2", "Estilo GX, similar a la anterior pero semitransparente", 0, #-- selected.2 = 2
"Estilo GX 3", "Estilo GX, bateria de procentaje similar a MIUI", 0, #-- selected.2 = 3
"Estilo GX 4", "Estilo GX, bateria MIUI y toggles diferentes", 0, #-- selected.2 = 4
"Estilo GX 5", "Estilo GX, bateria en circulo blanco y toggles de colores", 0, #-- selected.2 = 5 Opción 5 del grupo 2 (selected.2=5), no está marcada por defecto porque tiene un 0
"Teclado", "", 2, #-- Group 3. key = "selected.3" Grupo 3 (selected.3)
"Xperia stock", "Teclado de stock ICS", 1, #-- selected.3 = 1
"Xperia S", "Teclado del Xperia S", 0, #-- selected.3 = 2
"Iconos", "", 2, #-- Group 4. key = "selected.4"
"Iconos SIII", "Iconos del Samsung Galaxy SIII", 1, #-- selected.4 = 1
"Iconos stock", "Iconos de stock, propios de SONY", 0, #-- selected.4 = 2
"Navegador", "", 2, #-- Group 5. key = "selected.5"
"Dolphin Browser Beta", "Recomendado: Rapido, gran apariencia, soporta HTML 5", 1, #-- selected.5 = 1
"Navegador stock", "Navegador de stock, propio de SONY", 0, #-- selected.5 = 2
"Launcher", "", 2, #-- Group 5. key = "selected.6"
"SlimMania", "Recomendado: Launcher propio de SlimMania, con opciones adicionales", 1, #-- selected.6 = 1
"Launcher stock", "Launcher de stock de Xperia arc S, 4x4 con boton AOSP, simple", 0, #-- selected.6 = 2
"APEX", "Launcher APEX, con apariencia ICS, rapido y fluido", 0, #-- selected.6 = 3 Opción 3 del grupo 6 (seleted.6 = 3)
"ZEAM", "Launcher ZEAM, sencillo y comodo", 0, #-- selected.6 = 4
"MIUI launcher", "Launcher basado en el propio de MIUI, original y diferente", 0 #-- selected.6 = 5
#--------[ Initial Value = 0: Unselected, 1: Selected, 2: Group Item, 3: Not Visible ]---------#
);
Esta chuleta nos muestra que signnifica el primer número que hay despues de la descripción, el 1 muestra que la selecciona por defecto, aunque puede cambiarse. El 2 muestra que es un grupo diferente
Podemos crear tantos grupos como queramos, y tantas opciones dentro del grupo que queramos
Séptima parte del código:
Séptima parte del código: aquí elegiremos las opciones libres, es decir, se pueden coger o no. No hay ninguna opción necesaria, si queremos las cogemos, sino no.
checkbox(
#-- Title
"Aplicaciones opcionales", Modificable
#-- Sub Title
"Selecciona las aplicaciones opcionales que quieras instalar", Modificable
#-- Icon: <AROMA Resource Dir>/icons/personalize.png or <ThemeDir>/icon.personalize.png
"@choose",
#-- Will be saved in /tmp/aroma/patch.prop Guarda las opciones en un archivo temporal, no nos interesa
"patch.prop",
#-----------------------+-----------------[ Checkbox ]---------------------------+---------------#
# TITLE | SUBTITLE | Initial Value #
#-----------------------+---------------------------------------------------------+---------------#
"Aplicaciones opcionales", "Elige las aplicaciones siguientes que quieras instalar", 2, #-- Group 1. key = "item.1.x" Similar al anterioe, el 2 crea el grupo.
"Youtube", "Aplicacion Youtube", 0, #-- item.1.1 Aplicación 1 del grupo 1 (item.1.1). No está preseleccionada
"Gmail", "Aplicacion GMail para ver tu correo electronico de Google", 0, #-- item.1.2
"Email", "Aplicacion Email de stock de Xperia", 0, #-- item.1.3
"Script Manager", "Aconsejable instalar para configurar despues SuperCharguer", 1, #-- item.1.4 Aplicación 4 del grupo 1 (item.1.4). Está preseleccionada porque tiene el 1 correspondiente
"Notas", "Aplicacion Notas de stock de Xperia", 0, #-- item.1.5
"DroidSail", "Aplicacion que permite pasar apps a la SD, para mayor almacenamiento interno", 0, #-- item.1.6
"SDBooster", "Aplicacion para aumentar la velocidad de transferencia de datos con la SD", 1, #-- item.1.7
"Smart Connect", "Aplicacion para ejecutar ciertas acciones al conectar perifericos", 0, #-- item.1.8 Aplicación 8 del grupo 1 (item.1.8), no está preseleccionada porque tiene el 0 correspondiente
"ES explorador", "Explorador y administrador de archivos ", 0, #-- item.1.9
"Camara 3D", "Camara y Album 3D stock de SONY ", 0 #-- item.1.10
);
Si queremos añadir más grupos, es tan sencillo como poner la misma estructura que la primera linea, pero cambiando en cada caso y poniendo item.2.x, item.3.x (siendo x la aplicación dentro del grupo). Cada grupo nuevo, las x vuelven a empezar en 1.
Ejemplo: Grupo1-> item1.1, item1.2, item1.3
Grupo2-> item2.1, item2.2, item2.3 (cada uno con sus correspondientes aplicaciones)
Octava parte del código:
Octava parte del código: Aquí pedirá que se pulse Instalar o llevará el menú del principio para salir de la instalación o volver a elegir las opciones.
##
#
# Next Screen is Installation UI
#
ini_set("text_next", "Install"); Indica que el botón siguiente será para instalar
##
# READY TO INSTALL
#
viewbox(
#-- Title
"Instalacion preparada", Modificable
#-- Text
"Todo esta preparado para ser instalado.\n\n"+
"Presiona <b>Instalar</b> para comenzar.\n\n"+
"Si no estas seguro de tus elecciones, presiona <b>Atras</b>\n\n"+
"Pulsar Menu -> Deja la instalacion, salir.",
Las líneas anteriores modificables solo las letras, los \n significan salto de línea y <b> que la letra destaque, así que mejor no tocarlos
#-- Icon
"@install"
);
ini_set("text_next", "Next");
#-- Extract sleep to /tmp/aroma/sleep. It will be used in updater-script for testing wait script
restotmp("exec_demo/sleep","sleep");
Novena parte del código:
Novena parte del código: Proceso de instalación, mostrará al usuario lo que se está instalando y todo el proceso de instalación.
#
# INSTALLATION PROCESS
#
setvar("retstatus",
install(
#-- Title
"Instalacion", Modificable
#-- Installation Process message
"Instalando <b>"+ini_get("rom_name")+"</b>.\n\n"+ Muestra que está instalando la ROM (con su nombre)
"",
#-- Installation Icon
"@install",
#-- Installation Finish Message
"<b>"+ini_get("rom_name")+"</b> ha sido instalada correctamente. Pulsa Finalizar para acabar." Muestra el nombre de la ROM y que se ha instalado correctamente. Modificable después de </b>
)
);
ini_set("text_next", "Finish"); Botón de Finalizar
Décima parte del código:
Décima parte del código: Finalizar con el instalador, despedirse del usuario y reiniciar.
##
# FINISH
#
# You can use return value or "reboot_it" variable to retrive checkbox value
# Example:
# if (checkviewbox(....)=="1" then
# ... checked ...
# endif;
#
checkviewbox(
#-- Title
"Hecho", Modificable
#-- Text
"<b>"+ini_get("rom_name")+"</b> ha sido instalada correctamente. ¡Disfruta de SlimMania!\n\n", Muestra el nombre de la ROM y que se ha instalado. Modificable a partir de </b>
#-- Icon
"@welcome",
#-- Checkbox Text
"¡Reiniciando tu terminal!", Modificable
#-- Initial Checkbox value ( 0=unchecked, 1=checked ) - (Optional, default:0)
"1",
#-- Save checked value in variable "reboot_it" (Optional)
"now"
);
if
getvar("reboot_it")=="1" Si has seleccionado que reinicie...
then
reboot("now"); Reinicia el terminal
endif;
Continuamos con updater-script. Lo que modifiquemos en aroma-config debemos modificarlo después en updater-script para que realice la tarea correspondiente.
Si hemos hecho un updater-script para nuestra ROM, tenemos que modificarlo para el de AROMA, ya que la función que tiene es la misma (contiene la información del flasheo de la ROM), pero al intervenir AROMA tenemos que adaptarlo.
Parte esencial:
Aquí tendremos lo esencial para flashear una ROM: (Puede ser que cada dispositivo tenga uno específico, en ese caso, modificaremos el código en función al dispositivo)
format("yaffs2", "MTD", "system", "0");
mount("yaffs2", "MTD", "system", "/system");
mount("yaffs2", "MTD", "userdata", "/data");
ui_print("@Initializing file system..."); No tocar!
ui_print("Iniciando AROMA"); Modificable
show_progress(0.95, "-55000");
ui_print("- Instalando aplicaciones del sistema."); Modificable
package_extract_dir("system", "/system");
package_extract_dir("data", "/data");
Primera parte del código:Corresponde con el final de la quinta parte de aroma-config. Es necesario mirar aroma-config para configurarlo, ya que en función de las opciones que hayamos metido, así configuraremos.
Aquí tendremos la configuración relativa a la elección de dispositivo (cuando elegimos entre los dos dispositivos que puede ser).
ui_print("@Dispositivo"); Se refiere a la elección del dispositivo (configurada en aroma-config). Tenemos que poner después del @ el nombre del grupo de la elección (el grupo es la línea que hemos puesto con el número 2 en aroma-config
# arcs
if
file_getprop("/tmp/aroma/type.prop","selected") == "1" Si elegimos la opción 1...
then
ui_print("Xperia arc S LT18i"); Modificable, según la opción que sea
package_extract_dir("aroma/arcS", "/system/"); Busca la carpeta con ese nombre que hemos metido en la carpeta /aroma (en la raíz del flasehable.zip) En este caso extrae la carpeta aroma/arcS en la carpeta /system/ de la ROM.
endif;
# arc
if
file_getprop("/tmp/aroma/type.prop","selected") == "2" Si elegimos la opción 2...
then
ui_print("Xperia arc LT15i"); Modificable, según la opción que sea
package_extract_dir("aroma/arc", "/system/"); Esta vez, en vez de extraer la carpeta /aroma/arcS, extrae la carpeta aroma/arc. Así tendremos los archivos correspondientes a esta opción
endif;
Segunda parte del código: Correspondiente a la sexta parte del código de aroma-config.
Aquí tendremos la configuración correspondiente a las aplicaciones del sistema que queramos elegir.
##---- Customization
ui_print("@Bloqueo de pantalla"); Se refiere a la elección del bloqueo de pantalla, configurada en aroma-config). Tenemos que poner después del @ el nombre del grupo de la elección (el grupo es la línea que hemos puesto con el número 2 en aroma-config
# aosplock Código de referencia para el desarrollador, le dice de qué opción está hablando
if
file_getprop("/tmp/aroma/patch2.prop","selected.1") == "1" Si en el grupo 1 (selected.1), elegimos la opción 1, entonces...
then
ui_print("- Instalando AOSP lockscreen"); Modificable
package_extract_dir("aroma/AOSPlock", "/system/"); Extrae la carpeta aroma/AOSPlock en /system/.
endif;
# xperiatlock
if
file_getprop("/tmp/aroma/patch2.prop","selected.1") == "2" Si en el grupo 1, elegimos la opción 2...
then
ui_print("- Instalando Xperia T lockscreen. ¡No olvides el parche!");
package_extract_dir("aroma/XperiaTlock", "/system/");
endif;
ui_print("@Barra de notificaciones"); Tenemos que poner después del @ el nombre del grupo de la elección (el grupo es la línea que hemos puesto con el número 2 en aroma-config
# estilogx1
if
file_getprop("/tmp/aroma/patch2.prop","selected.2") == "1" Si en el grupo 2 (selected.2), elegimos la opción 1...
then
ui_print("- Estilo GX, bateria en circulo blanco y toggles muy sencillos");
package_extract_dir("aroma/EstiloGX1", "/system/app");
endif;
# estilogx2
if
file_getprop("/tmp/aroma/patch2.prop","selected.2") == "2"
then
ui_print("- Estilo GX,similar a la anterior pero semitransparente");
package_extract_dir("aroma/EstiloGX2", "/system/app");
endif;
# estilogx3
if
file_getprop("/tmp/aroma/patch2.prop","selected.2") == "3"
then
ui_print("- Estilo GX, bateria de procentaje similar a MIUI");
package_extract_dir("aroma/EstiloGX3", "/system/app");
endif;
# estilogx4
if
file_getprop("/tmp/aroma/patch2.prop","selected.2") == "4"
then
ui_print("- Estilo GX, bateria MIUI y toggles diferentes");
package_extract_dir("aroma/EstiloGX4", "/system/app");
endif;
# estilogx5
if
file_getprop("/tmp/aroma/patch2.prop","selected.2") == "5" Si elegimos la opción 5 del grupo 2 (selected.2)
then
ui_print("- Estilo GX, bateria en circulo blanco y toggles de colores");
package_extract_dir("aroma/EstiloGX5", "/system/app");
endif;
ui_print("@Teclado"); Cambiar nombre de grupo!
# tecladostock
if
file_getprop("/tmp/aroma/patch2.prop","selected.3") == "1"
then
ui_print("- Instalando Teclado de stock ICS");
package_extract_dir("aroma/XperiaStockTeclado", "/system/");
endif;
# tecladoxperias
if
file_getprop("/tmp/aroma/patch2.prop","selected.3") == "2"
then
ui_print("- Instalando Teclado del Xperia S");
package_extract_dir("aroma/XperiaSteclado", "/system/");
endif;
ui_print("@Iconos"); Cambiar nombre de grupo... Así en todos los grupos. (@nombreGrupo)
# iconoss3
if
file_getprop("/tmp/aroma/patch2.prop","selected.4") == "1"
then
ui_print("- Aplicaciones con Iconos del Samsung Galaxy SIII");
package_extract_dir("aroma/S3Iconos", "/system/app");
endif;
# iconosstock
if
file_getprop("/tmp/aroma/patch2.prop","selected.4") == "2"
then
ui_print("- Aplicaciones con Iconos de stock de SONY");
package_extract_dir("aroma/StockIconos", "/system/app");
endif;
ui_print("@Navegador");
# dolphin
if
file_getprop("/tmp/aroma/patch2.prop","selected.5") == "1"
then
ui_print("- Instalando Dolphin Browser Beta");
package_extract_dir("aroma/Dolphin", "/system/app");
endif;
# browstock
if
file_getprop("/tmp/aroma/patch2.prop","selected.5") == "2"
then
ui_print("- Instalando Navegador de stock de SONY");
package_extract_dir("aroma/BrowStock", "/system/app");
endif;
ui_print("@Launcher");
# slimlauncher
if
file_getprop("/tmp/aroma/patch2.prop","selected.6") == "1"
then
ui_print("- Instalando Launcher propio de SlimMania");
package_extract_dir("aroma/LaunchSlim", "/system/");
endif;
# launchstock
if
file_getprop("/tmp/aroma/patch2.prop","selected.6") == "2"
then
ui_print("- Instalando Launcher propio de SONY");
package_extract_dir("aroma/LaunchStock", "/system/");
endif;
# apex
if
file_getprop("/tmp/aroma/patch2.prop","selected.6") == "3"
then
ui_print("- Instalando Apex launcher");
package_extract_dir("aroma/Apex", "/system/");
endif;
# zeam
if
file_getprop("/tmp/aroma/patch2.prop","selected.6") == "4"
then
ui_print("- Instalando Zeam Launcher");
package_extract_dir("aroma/Zeam", "/system/");
endif;
# miui
if
file_getprop("/tmp/aroma/patch2.prop","selected.6") == "5" Si elegimos la opción 5 del grupo 6 (selected.6)...
then
ui_print("- Instalando Launcher estilo MIUI");
package_extract_dir("aroma/LaunchMIUI", "/system/");
endif;
Tercera parte: Corresponde a la séptima parte del código de aroma-config.
En este apartado trataremos la selección de aplicaciones opcionales.
ui_print("@Aplicaciones opcionales"); Cambiar nombre de grupo!
# youtube
if
file_getprop("/tmp/aroma/patch.prop","item.1.1") == "1" Como solo hay un grupo es item.1.x y como es la aplicación 1,entonces es item.1.1
then
ui_print("- Instalando Youtube");
package_extract_dir("aroma/Youtube", "/data/app");
endif;
# gmail
if
file_getprop("/tmp/aroma/patch.prop","item.1.2") == "1" En este caso la aplicación es item.1.2, y el == "1" se refiere a si está marcada o no (1 es marcada y 0 es no marcada). Si es 0, entonces no ponemos nada porque no haría nada.
then
ui_print("- Instalando GMail");
package_extract_dir("aroma/Gmail", "/data/app"); Extrae la carpeta aroma/Gmail en data/app porque queremos que sea una aplicación eliminable, si quisieramos que no se pueda eliminar la extraeríamos a /system/app
endif;
# email
if
file_getprop("/tmp/aroma/patch.prop","item.1.3") == "1"
then
ui_print("- Instalando Email de stock de Xperia");
package_extract_dir("aroma/Emailstock", "/system/app");
endif;
# scriptmanager
if
file_getprop("/tmp/aroma/patch.prop","item.1.4") == "1"
then
ui_print("- Instalando Script Manager");
package_extract_dir("aroma/ScriptManager", "/data/app");
endif;
# notas
if
file_getprop("/tmp/aroma/patch.prop","item.1.5") == "1"
then
ui_print("- Instalando Notas de stock de Xperia");
package_extract_dir("aroma/Notasstock", "/system/app");
endif;
# droidsail
if
file_getprop("/tmp/aroma/patch.prop","item.1.6") == "1"
then
ui_print("- Instalando DroidSail APP to SD");
package_extract_dir("aroma/droidsail", "/system/app");
endif;
# sdbooster
if
file_getprop("/tmp/aroma/patch.prop","item.1.7") == "1"
then
ui_print("- Instalando SD Booster");
package_extract_dir("aroma/SDbooster", "/system/app");
endif;
# smartconect
if
file_getprop("/tmp/aroma/patch.prop","item.1.8") == "1"
then
ui_print("- Instalando SmartConnect");
package_extract_dir("aroma/smartconnect", "/data/app");
endif;
# esexplorador
if
file_getprop("/tmp/aroma/patch.prop","item.1.9") == "1"
then
ui_print("- Instalando ES explorador");
package_extract_dir("aroma/ESexplorador", "/data/app");
endif;
# 3d
if
file_getprop("/tmp/aroma/patch.prop","item.1.10") == "1"
then
ui_print("- Instalando Camara y Album 3D");
package_extract_dir("aroma/3D", "/system/app");
endif;
Cuarta parte: Propia de updater-script (ya nos olvidamos de aroma-config). Lo necesario para flashear la ROM, similar a cualquier final de un updater-script.
Contiene lo propio para flashear cualquier ROM desde un .zip flasheable.
ui_print("");
ui_print("Flasheando SlimMania..."); Modificable
show_progress(0.14, 3);
package_extract_dir("sdcard", "/sdcard"); Funciones de un updater-script, no las toques a no se que sepas hacerlo
package_extract_dir("system", "/system");
package_extract_dir("data", "/data");
symlink("toolbox", "/system/bin/start");
symlink("toolbox", "/system/bin/lsmod");
symlink("toolbox", "/system/bin/r");
symlink("toolbox", "/system/bin/vmstat");
symlink("toolbox", "/system/bin/ifconfig");
symlink("toolbox", "/system/bin/ionice");
symlink("toolbox", "/system/bin/schedtop");
symlink("toolbox", "/system/bin/wipe");
symlink("toolbox", "/system/bin/reboot");
symlink("toolbox", "/system/bin/rmdir");
symlink("toolbox", "/system/bin/route");
symlink("toolbox", "/system/bin/chown");
symlink("toolbox", "/system/bin/lsof");
symlink("toolbox", "/system/bin/getevent");
symlink("toolbox", "/system/bin/mkdir");
symlink("toolbox", "/system/bin/netstat");
symlink("toolbox", "/system/bin/renice");
symlink("toolbox", "/system/bin/uptime");
symlink("mksh", "/system/bin/sh");
symlink("toolbox", "/system/bin/smd");
symlink("toolbox", "/system/bin/sync");
symlink("toolbox", "/system/bin/mount");
symlink("toolbox", "/system/bin/printenv");
symlink("toolbox", "/system/bin/top");
symlink("toolbox", "/system/bin/log");
symlink("toolbox", "/system/bin/sendevent");
symlink("toolbox", "/system/bin/ps");
symlink("toolbox", "/system/bin/dmesg");
symlink("toolbox", "/system/bin/umount");
symlink("toolbox", "/system/bin/kill");
symlink("toolbox", "/system/bin/stop");
symlink("toolbox", "/system/bin/newfs_msdos");
symlink("toolbox", "/system/bin/iftop");
symlink("toolbox", "/system/bin/chmod");
symlink("toolbox", "/system/bin/rmmod");
symlink("toolbox", "/system/bin/setconsole");
symlink("toolbox", "/system/bin/mv");
symlink("toolbox", "/system/bin/rm");
symlink("toolbox", "/system/bin/id");
symlink("toolbox", "/system/bin/watchprops");
symlink("toolbox", "/system/bin/hd");
symlink("toolbox", "/system/bin/ctrlaltdel");
symlink("toolbox", "/system/bin/sleep");
symlink("toolbox", "/system/bin/ls");
symlink("toolbox", "/system/bin/cmp");
symlink("toolbox", "/system/bin/insmod");
symlink("toolbox", "/system/bin/nandread");
symlink("toolbox", "/system/bin/date");
symlink("toolbox", "/system/bin/dd");
symlink("toolbox", "/system/bin/getprop");
symlink("toolbox", "/system/bin/cat");
symlink("toolbox", "/system/bin/df");
symlink("toolbox", "/system/bin/touch");
symlink("toolbox", "/system/bin/ioctl");
symlink("toolbox", "/system/bin/setprop");
symlink("toolbox", "/system/bin/notify");
symlink("toolbox", "/system/bin/ln");
set_perm_recursive(0, 0, 0755, 0644, "/system");
set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
set_perm(0, 3003, 06755, "/system/bin/ip");
set_perm(0, 3003, 02750, "/system/bin/netcfg");
set_perm(0, 3004, 02755, "/system/bin/ping");
set_perm(0, 2000, 06750, "/system/bin/run-as");
set_perm_recursive(1002, 1002, 0755, 0440, "/system/etc/bluetooth");
set_perm(0, 0, 0755, "/system/etc/bluetooth");
set_perm(1000, 1000, 0640, "/system/etc/bluetooth/auto_pairing.conf");
set_perm(3002, 3002, 0444, "/system/etc/bluetooth/blacklist.conf");
set_perm(1002, 1002, 0440, "/system/etc/dbus.conf");
set_perm(1014, 2000, 0550, "/system/etc/dhcpcd/dhcpcd-run-hooks");
set_perm_recursive(1000, 1000, 0771, 0644, "/data/app");
set_perm_recursive(0 ,0 , 0755, 0755, "/system/etc/init.d");
set_perm(0, 2000, 0550, "/system/etc/init.goldfish.sh");
set_perm(0, 0, 0755, "/system/etc/be_movie");
set_perm(0, 0, 0755, "/system/etc/be_photo");
set_perm(0, 0, 06755, "/system/bin/su");
set_perm(0, 2000, 0755, "/system/bin/sysinit");
set_perm_recursive(0, 0, 0755, 0555, "/system/etc/ppp");
set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");
set_perm(0, 1000, 0755, "/system/xbin/busybox");
delete("/system/xbin/busybox-installer");
set_perm(0, 0, 04755, "/system/xbin/busybox");
set_perm(0, 0, 0644, "/system/etc/group");
set_perm(0, 0, 0644, "/system/etc/gshadow");
set_perm(0, 0, 0644, "/system/etc/passwd");
set_perm(0, 0, 0644, "/system/etc/shadow");
package_extract_file("busybox_update.sh", "/tmp/busybox_update.sh");
set_perm(0, 0, 0777, "/tmp/busybox_update.sh");
run_program("/tmp/busybox_update.sh");
run_program("/system/xbin/busybox", "--install", "-s", "/system/xbin");
symlink("/system/bin/su", "/system/xbin/su");
symlink("/system/fonts/Roboto-Regular.ttf","/system/fonts/DroidSans.ttf");
symlink("/system/fonts/Roboto-Bold.ttf","/system/fonts/DroidSans-Bold.ttf");
symlink("/factory/hdcp.keys","/system/vendor/firmware/hdcp.keys");
symlink("/data/etc/wifi/wl1271-nvs.bin","/system/etc/firmware/ti-connectivity/wl1271-nvs.bin");
unmount("/system");
unmount("/data");
show_progress(1, 0);
ui_print("¡Instalacion completada! ¡Disfruta de SlimMania!"); Modifícalo a tu gusto ;)
ui_print(" ");
ui_print(" ");
ui_print(" ");
ui_print("Agradece el trabajo a los desarrolladores, ¡anima a seguir trabajando!"); Más modificaciones
ui_print(" ");
ui_print(" ");
ui_print(" ");
ui_print(" ");
ui_print(" ");
Los archivos que no son aroma-config, updater-script ni carpetas aroma: (/aroma y /META-INF/com/google/android/aroma). No se tocan, se dejan igual que estaban, si al instalador AROMA nos referimos.
AROMA es un instalador que permite que elijamos diferentes opciones al flashear una ROM. Este instalador es muy cómodo, porque el creador de la ROM (cualquiera de nosotros que haga una Custom Rom) puede incorporar diferentes opciones para que cada usuario elija las que se adaptan más a sus necesidades o gustos.
Antes de modificar nada, recomiendo que quien vaya a hacer un instalador AROMA consiga un instalador de una ROM ya hecha. Esto es porque hay algunos parámetros como la calibración de la pantalla y demás que necesitamos conocer y que son diferentes en cada dispositivo. Por lo que es muy sencillo basarse en un instalador hecho, aunque al final lo modificaremos y quedará a nuestro gusto X-D
Si alguien quiere puede descargar el META-INF propio de AROMA, aunque tendríamos que emplear muchísimo tiempo para conseguir que fuera instalador de una ROM. (AROMA puede ser instalador de ROMs o un instalador de Tweaks o aplicaciones... Personalmente, creo que la potencia de AROMA se aprovecha mejor en el instalador de una ROM, ya que también podremos elegir aplicaciones y tweaks que meter)
Pondré como ejemplo SlimMania (ROM para Xperia Arc/S) hecha por luiseteyo y por mi, para el subforo de HTCmania de nuestro terminal.
SlimMania tiene unas características propias, con aplicaciones propias y aplicaciones del sistema propias tambien. Con esto quiero decir que nosotros hemos elegido unas opciones para AROMA determinadas, pero cualquiera puede poner las opciones que quiera. AROMA ES TOTALMENTE PERSONALIZABLE!
Copio el código de SlimMania, es bastante largo, pero es un claro ejemplo de lo que se puede hacer, además, cuanto más largo es mejor porque veis los diferentes grupos y opciones de cada grupo. Es un buen ejemplo!
Cabe destacar unos conceptos importantes de AROMA (no es necesario saberlos):
-selectbox: Conjunto de opciones donde es obligatorio marcar una (da igual la que sea). Se da al elegir opciones del sistema, es decir, el tipo de bloqueo de pantalla, teclado, barra de notificaciones... Ya que son necesarias para que el sistema operativo funcione correctamente. Por defecto, se suele poner una opción por si el usuario quiere instalar las recomendaciones y para que no se olvide marcar ninguna y que tenga que volver a flashear.
-checkbox: Conjunto de opciones donde se pueden elegir todas las que quiera o ninguna. Se da para elegir aplicaciones opcionales o tweaks no necesarios que puede meter el usuario si quiere...
-resread: muestra un archivo .txt modificado previamente por el desarrollador donde aparecen: términos y condiciones o el changelog de la ROM.
-ini_get(): función que llama al ini_set(), donde se han metido previamente unos datos que mostrará después el ini_get.
-casi todo lo que está entre comillas: "(lo que sea)" suele ser modificable por el creador para adptarlo a su propia ROM. Si tiene la estructura en aroma-config "@..." no debemos modificarlo, porque @ se refiere a un objeto especial. En updater-script sí debemos modificarlos.
Recomiendo instalar Notepad ++ (http://download.tuxfamily.org/notepadplus/6.2/npp.6.2.Installer.exe) para editar los textos o el editor de Linux.
Descargas:
SlimMania (ROM completa): http://d-h.st/Lqd
RECOMENDADO! SlimMania (Ejemplo de AROMA, con META-INF y carpeta aroma de aplicaciones sin aplicaciones, ejemplo de distribución de carpetas): http://www.mediafire.com/?1tgm8634eqk9dfi
Aroma installer (original, no recomendado porque faltan muchas cosas): http://d-h.st/vi6
Empezamos!
1-Descargamos cualquier ROM con AROMA de nuestro terminal y extraemos la carpeta META-INF del update.zip (cualquier .zip flasheable de una ROM). También debemos fijarnos en la carpetas carpetas que hay en el flasheable .zip (luego entenderemos mejor el código).
http://i.minus.com/i622V4w4LQFid.png
Al lado de la carpeta META-INF ,hay una carpeta llamada aroma, allí meteremos TODOS los archivos que se corresponderán con las opciones. Creamos una carpeta para cada aplicación o archivo y dentro metemos lo que queremos que se extraiga.
La de SlimMania es:
http://i.minus.com/iFt26e9IFfRRP.png
2-Abrimos la carpeta META-INF / com / google /android . Veremos una lista de archivos con una carpeta llamada aroma.
http://i.minus.com/iYWJjPoDrm10u.png
Abrimos los archivos seleccionados en rojo en el editor de texto (Notepad++ en mi caso): aroma-config y updater-script.
En la carpeta /META-INF/com/google/android/aroma tendremos unos archivos .txt importantes para nosotros, es necesario modificarlos, son los marcados (para modificarlos seguimos la estructura que tienen, no me voy a extender más porque sino sería un tutorial muy amplio)
También debemos modificar sample.png para poner la imagen que queramos con un tamaño 480x854 pixeles:
http://i.minus.com/ixcnIcG2p7xHi.png
Empezamos con el aroma-config. Os pondré fragmentos de mi código y explico para que sirve cada cosa. El creador pone comentarios en inglés con la estructura: #comentario. Yo los pondré en rojo :ok:
Todas las frases que pone modificable, son las que se pueden cambiar manualmente según queramos, la ROM que sea o según el idioma, NO se cambian automáticamente con el idioma de AROMA.
Introducción
Introducción en AROMA, configuración esencial: Datos de la ROM, calibración de pantalla (depende del modelo del teléfono), fuente del instalador e imagen propia de la ROM.
calibrate("0.9718","4","1.0176","-9"); Calibración de la pantalla, cada modelo tendrá una distinta, no la tocamos
loadlang("langs/es.lang"); Lenguaje del instalador AROMA, yo he puesto español (es.lang) en inglés sería (en.lang). Además del idioma del instalador debemos cambiar las frases que ponemos entre comillas, iré avisando cuales son)
fontresload( "0", "ttf/DroidSans.ttf", "12" ); Fuente del instalador, no la tocamos
fontresload( "1", "ttf/DroidSans.ttf", "18" );
ini_set("rom_name", "SlimMania"); Nombre de nuestra ROM
ini_set("rom_version", "1.0"); Versión de nuestra ROM
ini_set("rom_author", "JesusAlber1 & Luiseteyo"); Autores de la ROM
ini_set("rom_device", "Xperia arc S"); Modelo del teléfono
ini_set("rom_date", "29 10 2012"); Fecha de expedición de la ROM
splash(
#-- Duration 6000ms / 5 seconds
6000, Duración en milisegundos de la muestra de la imagen de nuestra ROM.
#-- <AROMA Resource Dir>/sample.png Tenemos que poner nuestra imagen con el nombre sample.png en la carpeta aroma que estaba en la misma carpeta que el archivo que modificamos
"sample"
);
Primera parte del código
Primera parte del código: Selección de tema del propio instalador AROMA, para que se haga más amena la instalación según el gusto de cada usuario.
################################################## ################################################## ###############
#
# STEP 1 - SELECT THEME
#
selectbox( Tipo de selección de opciones, explicado al principio del post
#-- Title
"<~themes.title>",
#-- Sub Title
"<~themes.desc>",
#-- Icon: <AROMA Resource Dir>/icons/personalize.png or <ThemeDir>/icon.personalize.png
"@personalize",
#-- Will be saved in /tmp/aroma/theme.prop Guarda las opciones en un archivo temporal llamado theme.prop (no nos afecta)
"theme.prop",
#---------------------------------[ Selectbox Without Group ]----------------------------------#
# TITLE | SUBTITLE | Initial Value #
#------------------+-----------------------------------------------------------+---------------#
"MIUI", "MIUI Theme by mickey-r & amarullz", 0, #-- selected.0 = 1 Tema estilo MIUI corresponde al 1
"ICS", "Ice Cream Sandwitch by DemonWav & amarullz", 0, #-- selected.0 = 2 Tema estilo ICS corresponde al 2
"MIUI V4", "MIUI 4 Theme by amarullz & Lennox", 0, #-- selected.0 = 3 Tema estilo MIUI v4 corresponde al 3
"Sense", "HTC Sense Theme by amarullz", 0 #-- selected.0 = 4 Tema estilo Sense de HTC corresponde al 4
#--------[ Initial Value = 0: Unselected, 1: Selected, 2: Group Item, 3: Not Visible ]---------#
);
##
# SET THEME
#
#-- Change Info:
# file_getprop : should use absolute path "/tmp/aroma/theme.prop"
# prop : just use relative path "theme.prop" will automatically read the "/tmp/aroma/theme.prop"
# Los if condicionan cada opción, es decir, si elegimos la opción 1 entonces el tema será MIUI, si elegimos la opción 2 entonces el tema será ICS y así hasta las 4 opciones
if prop("theme.prop","selected.0")=="1" then
theme("miui");
endif;
if prop("theme.prop","selected.0")=="2" then
theme("ics");
endif;
if prop("theme.prop","selected.0")=="3" then
theme("miui4");
endif;
if prop("theme.prop","selected.0")=="4" then
theme("sense");
endif;
Segunda parte del código:
Segunda parte del código: Muestra al usuario la información de la ROM más extendida y de forma más clara.
################################################## ################################################## ###############
#
# STEP 2 - SHOW ROM INFORMATION
#
viewbox(
#-- Title
"Bienvenido a SlimMania!", Mensaje de bienvenida al usuario, personalizable por cada desarrollador en el idioma correspondiente
#-- Text
"Vas a instalar <b>"+ Personalizable por cada desarrollador en el idioma correspondiente
#-- Get Config Value
ini_get("rom_name")+ Muestra al usuario el nombre de la ROM, puesto en las primeras líneas de AROMA
"</b> for <b>"+ini_get("rom_device")+"</b>.\n\n"+ Muestra al usuario el dispositivo en el que va a usar la ROM, también indicado en las primeras líneas de AROMA
" Version\t: <b><#selectbg_g>"+ini_get("rom_version")+"</#></b>\n"+ Muestra la versión de la ROM
" Codename\t: <b><#selectbg_g>SlimMania</#></b>\n"+ Muestra el código de la ROM (nombre identificativo, normalmente lo más breve posible), este nombre se cambia aquí!
" Updated\t: <b><#selectbg_g>"+ini_get("rom_date")+"</#></b>\n\n\n"+ Muestra la fecha en la que se creó la ROM, puesta en las primeras líneas también.
"Pulsa Siguiente para continuar con la Instalacion", Mensaje de cada desarrollador en su idioma correspondiente, es para continuar
#-- Icon
"@welcome"
);
Tercera parte del código
Tercera parte del código: Muestra el mensaje de los desarrolladores, en este caso es para aceptar los términos y condiciones de instalar la ROM (No nos hacemos responsables de bootlops ni brikeos...)
################################################## ################################################## ###############
#
# STEP 3 - LICENSE
#
agreebox(
#-- Title
"Terminos y condiciones", Modificable por cada uno
#-- Subtitle / Description
"Lee atentamente y acepta para continuar con la instalacion.", Modificable por cada uno
#-- Icon
"@license",
#-- Text Content ( Read from <AROMA Resource Dir>/license.txt )
resread("license.txt"), AROMA muestra el archivo license.txt, modificado previamente por el creador y se refiere a los términos y condiciones escritos. license.txt está en la carpeta aroma situada junto a aroma-config
#-- Checkbox Text
"Acepto los terminos y condiciones...", Modificable
#-- Unchecked Alert Message
"Por favor, marca la casilla de aceptar..." Modificable
);
Cuarta parte del código:
Cuarta parte del código: Muestra al usuario el changelog (respecto a versiones anteriores o sólo el nuevo, depende de qué pongamos en el archivo correspondiente).
################################################## ################################################## ###############
#
# STEP 4 - CHANGELOG
#
textbox(
#-- Title
"Changelog SlimMania", Modificable
#-- Subtitle
"Changelog de la nueva version de SlimMania", Modificable
#-- Icon
"@update",
#-- Arg 4
resread("changelog.txt") Muestra al usuario el archivo changelog.txt donde está el changelog escrito por el desarrollador. changelog.txt está en la carpeta aroma situada junto a aroma-config
);
Quinta parte del código:
Menú principal: Pide al usuario que elija entre Instalar la ROM o Salir del instalador.
##
# MAIN MENU
#
menubox(
#-- Title
ini_get("rom_name") + " " + ini_get("rom_version"), Muestra el nombre de la ROM y la versión
#-- Sub Title
"Elige una de las opciones:", Modificable
#-- Icon
"@welcome",
#-- Will be saved in /tmp/aroma/demo.prop Guardará los cambios en demo.prop, no tocamos nada.
"demo.prop",
#-------------------------+-----------------[ Menubox Items ]-------------------------+---------------#
# TITLE | SUBTITLE | Item Icons #
#-------------------------+-----------------------------------------------------------+---------------#
"Instalar ROM", "Instalar SlimMania en este dispositivo", "@install", #-- selected = 1 Modificar según la ROM y el idioma
"Otras opciones", "Salir, reiniciar, etc.", "@apps" #-- selected = 2 Más de lo mismo
);
Si el usuario elige la opción 2, es decir, Otras opciones, el instalador le llevará a una nueva ventana:
##
# MISC MENU
#
if prop("demo.prop","selected")=="2" then El usuario ha elegido 2 (este if se refiere a: "si el usuario elige la opción 2, entonces -pasa esto-).
#-- Show Other Demo
menubox(
#-- Title
"Cancelando...", Modificable
#-- Sub Title
"Elige una opción", Modificable
#-- Icon
"@cancel",
#-- Will be saved in /tmp/aroma/other_demo.prop Guarda los cambios en other_demo.prop, no tocamos nada.
"other_demo.prop",
#-------------------------+-----------------[ Menubox Items ]-------------------------+---------------#
# TITLE | SUBTITLE | Item Icons #
#-------------------------+-----------------------------------------------------------+---------------#
"Reiniciar", "Reiniciar el dispositivo", "@alert", #-- selected = 1 Modificable
"Salir", "Regresar al recovery", "@install" #-- selected = 2 Modificable
);
Ahora, dentro de este nuevo menú, el instalador dice:
#-- Reboot
if prop("other_demo.prop","selected")=="1" then Si el usuario elige 1, entonces reinicia
if
confirm(
#-- Title
"Reiniciar", Modificable
#-- Text
"¿Reiniciar el dispositivo?", Modificable
#-- Icon (Optional)
"@reboot"
)=="yes"
then
reboot("now"); Reinicia el dispositivo si hemos marcado "yes"
endif;
endif;
#-- Exit
if prop("other_demo.prop","selected")=="2" then Si el usuario elige la opción 2 de este menú:
if
confirm(
#-- Title
"Salir", Modificable
#-- Text
"¿Volver al recovery?", Modificable
#-- Icon (Optional)
"@exit"
)=="yes"
then
#-- Exit -
exit(""); El dispositivo sale del instalador si hemos marcado "yes"
endif;
endif;
#-- Back To Other Demo Menu Si el usuario no elige la segunda opción, va volviendo al menú anterior hasta llegar al menú donde se elige si Instalar la ROM u Otras opciones.
back(
getvar("1")
);
endif;
Si el usuario elige la opción 1, es decir, Instalar la ROM el instalador le llevará a la siguiente ventana: (será elegir el modelo, si queremos instalar la ROM en un terminal específico, omitimos este paso!)
menubox(
#-- Title
"Elige tu modelo:", Modificable
#-- Sub Title
"Elige el modelo de tu terminal:", Modificable
#-- Icon
"@personalize",
#-- Will be saved in /tmp/aroma/type.prop Guarda las opciones en type.prop, no tocamos nada
"type.prop",
#-------------------------------------+-----------------[ Menubox Items ]-------------------------+---------------#
# TITLE | SUBTITLE | Item Icons #
#-------------------------------------+-----------------------------------------------------------+---------------#
"Arc S", "Sony Xperia arc S LT18i", "@device", #-- selected = 1 La opción 1 es el Arc S, el nombre del dispositivo es modificable
"Arc", "Sony Xperia arc LT15i", "@device" #-- selected = 2 La opción 1 es el Arc, modificamos tanto "Arc" como "Sony Xperia arc LT15i"
);
Sexta parte del código:
Sexta parte del código: aquí elegiremos las opciones esenciales, es decir, tenemos que elegir una de las opciones, da igual la que sea, pero una tiene que haber para que funcione todo.
selectbox( Obliga a que siempre elijamos una sola opción, da igual la que sea, pero como como máximo y como mínimo tiene que ser una opción.
#-- Title
"Apariencia personalizada", Modificable
#-- Sub Title
"Elige lo que quieras que contenga tu nueva ROM", Modificable
#-- Icon
"@choose",
#-- Will be saved in /tmp/aroma/patch.prop Guardará estos cambios en patch.prop, un archivo temporal, no tocamos nada
"patch2.prop",
#-----------------------+-----------------[ Selectbox ]---------------------------+---------------#
# TITLE | SUBTITLE | Initial Value #
#-----------------------+---------------------------------------------------------+---------------#
"Bloqueo de pantalla", "", 2, #-- Group 1. key = "selected.1" El 2 dice que es un grupo nuevo, será el grupo numero 1 (selected.1)
"AOSP lockscreen", "Bloqueo de pantalla estilo AOSP, elegante y sencillo", 1, #-- selected.1 = 1 El 1 dice que está marcada por defecto y es la posición del grupo 1 (selected.1 = 1)
"Xperia T lockscreen", "Bloqueo del Xperia T con shortcuts. ¡No olvides el parche!", 0, #-- selected.1 = 2 El 0 dice que no está marcada por defecto y que es la posición 2 del grupo 1 (selected.1 = 2)
"Barra de notificaciones", "", 2, #-- Group 2. key = "selected.2" Grupo 2 (selected.2)
"Estilo GX 1", "Estilo GX, bateria en circulo blanco y toggles muy sencillos", 1, #-- selected.2 = 1 Opción 1 del grupo 2 (selected.2 = 1), además está marcada por defecto
"Estilo GX 2", "Estilo GX, similar a la anterior pero semitransparente", 0, #-- selected.2 = 2
"Estilo GX 3", "Estilo GX, bateria de procentaje similar a MIUI", 0, #-- selected.2 = 3
"Estilo GX 4", "Estilo GX, bateria MIUI y toggles diferentes", 0, #-- selected.2 = 4
"Estilo GX 5", "Estilo GX, bateria en circulo blanco y toggles de colores", 0, #-- selected.2 = 5 Opción 5 del grupo 2 (selected.2=5), no está marcada por defecto porque tiene un 0
"Teclado", "", 2, #-- Group 3. key = "selected.3" Grupo 3 (selected.3)
"Xperia stock", "Teclado de stock ICS", 1, #-- selected.3 = 1
"Xperia S", "Teclado del Xperia S", 0, #-- selected.3 = 2
"Iconos", "", 2, #-- Group 4. key = "selected.4"
"Iconos SIII", "Iconos del Samsung Galaxy SIII", 1, #-- selected.4 = 1
"Iconos stock", "Iconos de stock, propios de SONY", 0, #-- selected.4 = 2
"Navegador", "", 2, #-- Group 5. key = "selected.5"
"Dolphin Browser Beta", "Recomendado: Rapido, gran apariencia, soporta HTML 5", 1, #-- selected.5 = 1
"Navegador stock", "Navegador de stock, propio de SONY", 0, #-- selected.5 = 2
"Launcher", "", 2, #-- Group 5. key = "selected.6"
"SlimMania", "Recomendado: Launcher propio de SlimMania, con opciones adicionales", 1, #-- selected.6 = 1
"Launcher stock", "Launcher de stock de Xperia arc S, 4x4 con boton AOSP, simple", 0, #-- selected.6 = 2
"APEX", "Launcher APEX, con apariencia ICS, rapido y fluido", 0, #-- selected.6 = 3 Opción 3 del grupo 6 (seleted.6 = 3)
"ZEAM", "Launcher ZEAM, sencillo y comodo", 0, #-- selected.6 = 4
"MIUI launcher", "Launcher basado en el propio de MIUI, original y diferente", 0 #-- selected.6 = 5
#--------[ Initial Value = 0: Unselected, 1: Selected, 2: Group Item, 3: Not Visible ]---------#
);
Esta chuleta nos muestra que signnifica el primer número que hay despues de la descripción, el 1 muestra que la selecciona por defecto, aunque puede cambiarse. El 2 muestra que es un grupo diferente
Podemos crear tantos grupos como queramos, y tantas opciones dentro del grupo que queramos
Séptima parte del código:
Séptima parte del código: aquí elegiremos las opciones libres, es decir, se pueden coger o no. No hay ninguna opción necesaria, si queremos las cogemos, sino no.
checkbox(
#-- Title
"Aplicaciones opcionales", Modificable
#-- Sub Title
"Selecciona las aplicaciones opcionales que quieras instalar", Modificable
#-- Icon: <AROMA Resource Dir>/icons/personalize.png or <ThemeDir>/icon.personalize.png
"@choose",
#-- Will be saved in /tmp/aroma/patch.prop Guarda las opciones en un archivo temporal, no nos interesa
"patch.prop",
#-----------------------+-----------------[ Checkbox ]---------------------------+---------------#
# TITLE | SUBTITLE | Initial Value #
#-----------------------+---------------------------------------------------------+---------------#
"Aplicaciones opcionales", "Elige las aplicaciones siguientes que quieras instalar", 2, #-- Group 1. key = "item.1.x" Similar al anterioe, el 2 crea el grupo.
"Youtube", "Aplicacion Youtube", 0, #-- item.1.1 Aplicación 1 del grupo 1 (item.1.1). No está preseleccionada
"Gmail", "Aplicacion GMail para ver tu correo electronico de Google", 0, #-- item.1.2
"Email", "Aplicacion Email de stock de Xperia", 0, #-- item.1.3
"Script Manager", "Aconsejable instalar para configurar despues SuperCharguer", 1, #-- item.1.4 Aplicación 4 del grupo 1 (item.1.4). Está preseleccionada porque tiene el 1 correspondiente
"Notas", "Aplicacion Notas de stock de Xperia", 0, #-- item.1.5
"DroidSail", "Aplicacion que permite pasar apps a la SD, para mayor almacenamiento interno", 0, #-- item.1.6
"SDBooster", "Aplicacion para aumentar la velocidad de transferencia de datos con la SD", 1, #-- item.1.7
"Smart Connect", "Aplicacion para ejecutar ciertas acciones al conectar perifericos", 0, #-- item.1.8 Aplicación 8 del grupo 1 (item.1.8), no está preseleccionada porque tiene el 0 correspondiente
"ES explorador", "Explorador y administrador de archivos ", 0, #-- item.1.9
"Camara 3D", "Camara y Album 3D stock de SONY ", 0 #-- item.1.10
);
Si queremos añadir más grupos, es tan sencillo como poner la misma estructura que la primera linea, pero cambiando en cada caso y poniendo item.2.x, item.3.x (siendo x la aplicación dentro del grupo). Cada grupo nuevo, las x vuelven a empezar en 1.
Ejemplo: Grupo1-> item1.1, item1.2, item1.3
Grupo2-> item2.1, item2.2, item2.3 (cada uno con sus correspondientes aplicaciones)
Octava parte del código:
Octava parte del código: Aquí pedirá que se pulse Instalar o llevará el menú del principio para salir de la instalación o volver a elegir las opciones.
##
#
# Next Screen is Installation UI
#
ini_set("text_next", "Install"); Indica que el botón siguiente será para instalar
##
# READY TO INSTALL
#
viewbox(
#-- Title
"Instalacion preparada", Modificable
#-- Text
"Todo esta preparado para ser instalado.\n\n"+
"Presiona <b>Instalar</b> para comenzar.\n\n"+
"Si no estas seguro de tus elecciones, presiona <b>Atras</b>\n\n"+
"Pulsar Menu -> Deja la instalacion, salir.",
Las líneas anteriores modificables solo las letras, los \n significan salto de línea y <b> que la letra destaque, así que mejor no tocarlos
#-- Icon
"@install"
);
ini_set("text_next", "Next");
#-- Extract sleep to /tmp/aroma/sleep. It will be used in updater-script for testing wait script
restotmp("exec_demo/sleep","sleep");
Novena parte del código:
Novena parte del código: Proceso de instalación, mostrará al usuario lo que se está instalando y todo el proceso de instalación.
#
# INSTALLATION PROCESS
#
setvar("retstatus",
install(
#-- Title
"Instalacion", Modificable
#-- Installation Process message
"Instalando <b>"+ini_get("rom_name")+"</b>.\n\n"+ Muestra que está instalando la ROM (con su nombre)
"",
#-- Installation Icon
"@install",
#-- Installation Finish Message
"<b>"+ini_get("rom_name")+"</b> ha sido instalada correctamente. Pulsa Finalizar para acabar." Muestra el nombre de la ROM y que se ha instalado correctamente. Modificable después de </b>
)
);
ini_set("text_next", "Finish"); Botón de Finalizar
Décima parte del código:
Décima parte del código: Finalizar con el instalador, despedirse del usuario y reiniciar.
##
# FINISH
#
# You can use return value or "reboot_it" variable to retrive checkbox value
# Example:
# if (checkviewbox(....)=="1" then
# ... checked ...
# endif;
#
checkviewbox(
#-- Title
"Hecho", Modificable
#-- Text
"<b>"+ini_get("rom_name")+"</b> ha sido instalada correctamente. ¡Disfruta de SlimMania!\n\n", Muestra el nombre de la ROM y que se ha instalado. Modificable a partir de </b>
#-- Icon
"@welcome",
#-- Checkbox Text
"¡Reiniciando tu terminal!", Modificable
#-- Initial Checkbox value ( 0=unchecked, 1=checked ) - (Optional, default:0)
"1",
#-- Save checked value in variable "reboot_it" (Optional)
"now"
);
if
getvar("reboot_it")=="1" Si has seleccionado que reinicie...
then
reboot("now"); Reinicia el terminal
endif;
Continuamos con updater-script. Lo que modifiquemos en aroma-config debemos modificarlo después en updater-script para que realice la tarea correspondiente.
Si hemos hecho un updater-script para nuestra ROM, tenemos que modificarlo para el de AROMA, ya que la función que tiene es la misma (contiene la información del flasheo de la ROM), pero al intervenir AROMA tenemos que adaptarlo.
Parte esencial:
Aquí tendremos lo esencial para flashear una ROM: (Puede ser que cada dispositivo tenga uno específico, en ese caso, modificaremos el código en función al dispositivo)
format("yaffs2", "MTD", "system", "0");
mount("yaffs2", "MTD", "system", "/system");
mount("yaffs2", "MTD", "userdata", "/data");
ui_print("@Initializing file system..."); No tocar!
ui_print("Iniciando AROMA"); Modificable
show_progress(0.95, "-55000");
ui_print("- Instalando aplicaciones del sistema."); Modificable
package_extract_dir("system", "/system");
package_extract_dir("data", "/data");
Primera parte del código:Corresponde con el final de la quinta parte de aroma-config. Es necesario mirar aroma-config para configurarlo, ya que en función de las opciones que hayamos metido, así configuraremos.
Aquí tendremos la configuración relativa a la elección de dispositivo (cuando elegimos entre los dos dispositivos que puede ser).
ui_print("@Dispositivo"); Se refiere a la elección del dispositivo (configurada en aroma-config). Tenemos que poner después del @ el nombre del grupo de la elección (el grupo es la línea que hemos puesto con el número 2 en aroma-config
# arcs
if
file_getprop("/tmp/aroma/type.prop","selected") == "1" Si elegimos la opción 1...
then
ui_print("Xperia arc S LT18i"); Modificable, según la opción que sea
package_extract_dir("aroma/arcS", "/system/"); Busca la carpeta con ese nombre que hemos metido en la carpeta /aroma (en la raíz del flasehable.zip) En este caso extrae la carpeta aroma/arcS en la carpeta /system/ de la ROM.
endif;
# arc
if
file_getprop("/tmp/aroma/type.prop","selected") == "2" Si elegimos la opción 2...
then
ui_print("Xperia arc LT15i"); Modificable, según la opción que sea
package_extract_dir("aroma/arc", "/system/"); Esta vez, en vez de extraer la carpeta /aroma/arcS, extrae la carpeta aroma/arc. Así tendremos los archivos correspondientes a esta opción
endif;
Segunda parte del código: Correspondiente a la sexta parte del código de aroma-config.
Aquí tendremos la configuración correspondiente a las aplicaciones del sistema que queramos elegir.
##---- Customization
ui_print("@Bloqueo de pantalla"); Se refiere a la elección del bloqueo de pantalla, configurada en aroma-config). Tenemos que poner después del @ el nombre del grupo de la elección (el grupo es la línea que hemos puesto con el número 2 en aroma-config
# aosplock Código de referencia para el desarrollador, le dice de qué opción está hablando
if
file_getprop("/tmp/aroma/patch2.prop","selected.1") == "1" Si en el grupo 1 (selected.1), elegimos la opción 1, entonces...
then
ui_print("- Instalando AOSP lockscreen"); Modificable
package_extract_dir("aroma/AOSPlock", "/system/"); Extrae la carpeta aroma/AOSPlock en /system/.
endif;
# xperiatlock
if
file_getprop("/tmp/aroma/patch2.prop","selected.1") == "2" Si en el grupo 1, elegimos la opción 2...
then
ui_print("- Instalando Xperia T lockscreen. ¡No olvides el parche!");
package_extract_dir("aroma/XperiaTlock", "/system/");
endif;
ui_print("@Barra de notificaciones"); Tenemos que poner después del @ el nombre del grupo de la elección (el grupo es la línea que hemos puesto con el número 2 en aroma-config
# estilogx1
if
file_getprop("/tmp/aroma/patch2.prop","selected.2") == "1" Si en el grupo 2 (selected.2), elegimos la opción 1...
then
ui_print("- Estilo GX, bateria en circulo blanco y toggles muy sencillos");
package_extract_dir("aroma/EstiloGX1", "/system/app");
endif;
# estilogx2
if
file_getprop("/tmp/aroma/patch2.prop","selected.2") == "2"
then
ui_print("- Estilo GX,similar a la anterior pero semitransparente");
package_extract_dir("aroma/EstiloGX2", "/system/app");
endif;
# estilogx3
if
file_getprop("/tmp/aroma/patch2.prop","selected.2") == "3"
then
ui_print("- Estilo GX, bateria de procentaje similar a MIUI");
package_extract_dir("aroma/EstiloGX3", "/system/app");
endif;
# estilogx4
if
file_getprop("/tmp/aroma/patch2.prop","selected.2") == "4"
then
ui_print("- Estilo GX, bateria MIUI y toggles diferentes");
package_extract_dir("aroma/EstiloGX4", "/system/app");
endif;
# estilogx5
if
file_getprop("/tmp/aroma/patch2.prop","selected.2") == "5" Si elegimos la opción 5 del grupo 2 (selected.2)
then
ui_print("- Estilo GX, bateria en circulo blanco y toggles de colores");
package_extract_dir("aroma/EstiloGX5", "/system/app");
endif;
ui_print("@Teclado"); Cambiar nombre de grupo!
# tecladostock
if
file_getprop("/tmp/aroma/patch2.prop","selected.3") == "1"
then
ui_print("- Instalando Teclado de stock ICS");
package_extract_dir("aroma/XperiaStockTeclado", "/system/");
endif;
# tecladoxperias
if
file_getprop("/tmp/aroma/patch2.prop","selected.3") == "2"
then
ui_print("- Instalando Teclado del Xperia S");
package_extract_dir("aroma/XperiaSteclado", "/system/");
endif;
ui_print("@Iconos"); Cambiar nombre de grupo... Así en todos los grupos. (@nombreGrupo)
# iconoss3
if
file_getprop("/tmp/aroma/patch2.prop","selected.4") == "1"
then
ui_print("- Aplicaciones con Iconos del Samsung Galaxy SIII");
package_extract_dir("aroma/S3Iconos", "/system/app");
endif;
# iconosstock
if
file_getprop("/tmp/aroma/patch2.prop","selected.4") == "2"
then
ui_print("- Aplicaciones con Iconos de stock de SONY");
package_extract_dir("aroma/StockIconos", "/system/app");
endif;
ui_print("@Navegador");
# dolphin
if
file_getprop("/tmp/aroma/patch2.prop","selected.5") == "1"
then
ui_print("- Instalando Dolphin Browser Beta");
package_extract_dir("aroma/Dolphin", "/system/app");
endif;
# browstock
if
file_getprop("/tmp/aroma/patch2.prop","selected.5") == "2"
then
ui_print("- Instalando Navegador de stock de SONY");
package_extract_dir("aroma/BrowStock", "/system/app");
endif;
ui_print("@Launcher");
# slimlauncher
if
file_getprop("/tmp/aroma/patch2.prop","selected.6") == "1"
then
ui_print("- Instalando Launcher propio de SlimMania");
package_extract_dir("aroma/LaunchSlim", "/system/");
endif;
# launchstock
if
file_getprop("/tmp/aroma/patch2.prop","selected.6") == "2"
then
ui_print("- Instalando Launcher propio de SONY");
package_extract_dir("aroma/LaunchStock", "/system/");
endif;
# apex
if
file_getprop("/tmp/aroma/patch2.prop","selected.6") == "3"
then
ui_print("- Instalando Apex launcher");
package_extract_dir("aroma/Apex", "/system/");
endif;
# zeam
if
file_getprop("/tmp/aroma/patch2.prop","selected.6") == "4"
then
ui_print("- Instalando Zeam Launcher");
package_extract_dir("aroma/Zeam", "/system/");
endif;
# miui
if
file_getprop("/tmp/aroma/patch2.prop","selected.6") == "5" Si elegimos la opción 5 del grupo 6 (selected.6)...
then
ui_print("- Instalando Launcher estilo MIUI");
package_extract_dir("aroma/LaunchMIUI", "/system/");
endif;
Tercera parte: Corresponde a la séptima parte del código de aroma-config.
En este apartado trataremos la selección de aplicaciones opcionales.
ui_print("@Aplicaciones opcionales"); Cambiar nombre de grupo!
# youtube
if
file_getprop("/tmp/aroma/patch.prop","item.1.1") == "1" Como solo hay un grupo es item.1.x y como es la aplicación 1,entonces es item.1.1
then
ui_print("- Instalando Youtube");
package_extract_dir("aroma/Youtube", "/data/app");
endif;
# gmail
if
file_getprop("/tmp/aroma/patch.prop","item.1.2") == "1" En este caso la aplicación es item.1.2, y el == "1" se refiere a si está marcada o no (1 es marcada y 0 es no marcada). Si es 0, entonces no ponemos nada porque no haría nada.
then
ui_print("- Instalando GMail");
package_extract_dir("aroma/Gmail", "/data/app"); Extrae la carpeta aroma/Gmail en data/app porque queremos que sea una aplicación eliminable, si quisieramos que no se pueda eliminar la extraeríamos a /system/app
endif;
if
file_getprop("/tmp/aroma/patch.prop","item.1.3") == "1"
then
ui_print("- Instalando Email de stock de Xperia");
package_extract_dir("aroma/Emailstock", "/system/app");
endif;
# scriptmanager
if
file_getprop("/tmp/aroma/patch.prop","item.1.4") == "1"
then
ui_print("- Instalando Script Manager");
package_extract_dir("aroma/ScriptManager", "/data/app");
endif;
# notas
if
file_getprop("/tmp/aroma/patch.prop","item.1.5") == "1"
then
ui_print("- Instalando Notas de stock de Xperia");
package_extract_dir("aroma/Notasstock", "/system/app");
endif;
# droidsail
if
file_getprop("/tmp/aroma/patch.prop","item.1.6") == "1"
then
ui_print("- Instalando DroidSail APP to SD");
package_extract_dir("aroma/droidsail", "/system/app");
endif;
# sdbooster
if
file_getprop("/tmp/aroma/patch.prop","item.1.7") == "1"
then
ui_print("- Instalando SD Booster");
package_extract_dir("aroma/SDbooster", "/system/app");
endif;
# smartconect
if
file_getprop("/tmp/aroma/patch.prop","item.1.8") == "1"
then
ui_print("- Instalando SmartConnect");
package_extract_dir("aroma/smartconnect", "/data/app");
endif;
# esexplorador
if
file_getprop("/tmp/aroma/patch.prop","item.1.9") == "1"
then
ui_print("- Instalando ES explorador");
package_extract_dir("aroma/ESexplorador", "/data/app");
endif;
# 3d
if
file_getprop("/tmp/aroma/patch.prop","item.1.10") == "1"
then
ui_print("- Instalando Camara y Album 3D");
package_extract_dir("aroma/3D", "/system/app");
endif;
Cuarta parte: Propia de updater-script (ya nos olvidamos de aroma-config). Lo necesario para flashear la ROM, similar a cualquier final de un updater-script.
Contiene lo propio para flashear cualquier ROM desde un .zip flasheable.
ui_print("");
ui_print("Flasheando SlimMania..."); Modificable
show_progress(0.14, 3);
package_extract_dir("sdcard", "/sdcard"); Funciones de un updater-script, no las toques a no se que sepas hacerlo
package_extract_dir("system", "/system");
package_extract_dir("data", "/data");
symlink("toolbox", "/system/bin/start");
symlink("toolbox", "/system/bin/lsmod");
symlink("toolbox", "/system/bin/r");
symlink("toolbox", "/system/bin/vmstat");
symlink("toolbox", "/system/bin/ifconfig");
symlink("toolbox", "/system/bin/ionice");
symlink("toolbox", "/system/bin/schedtop");
symlink("toolbox", "/system/bin/wipe");
symlink("toolbox", "/system/bin/reboot");
symlink("toolbox", "/system/bin/rmdir");
symlink("toolbox", "/system/bin/route");
symlink("toolbox", "/system/bin/chown");
symlink("toolbox", "/system/bin/lsof");
symlink("toolbox", "/system/bin/getevent");
symlink("toolbox", "/system/bin/mkdir");
symlink("toolbox", "/system/bin/netstat");
symlink("toolbox", "/system/bin/renice");
symlink("toolbox", "/system/bin/uptime");
symlink("mksh", "/system/bin/sh");
symlink("toolbox", "/system/bin/smd");
symlink("toolbox", "/system/bin/sync");
symlink("toolbox", "/system/bin/mount");
symlink("toolbox", "/system/bin/printenv");
symlink("toolbox", "/system/bin/top");
symlink("toolbox", "/system/bin/log");
symlink("toolbox", "/system/bin/sendevent");
symlink("toolbox", "/system/bin/ps");
symlink("toolbox", "/system/bin/dmesg");
symlink("toolbox", "/system/bin/umount");
symlink("toolbox", "/system/bin/kill");
symlink("toolbox", "/system/bin/stop");
symlink("toolbox", "/system/bin/newfs_msdos");
symlink("toolbox", "/system/bin/iftop");
symlink("toolbox", "/system/bin/chmod");
symlink("toolbox", "/system/bin/rmmod");
symlink("toolbox", "/system/bin/setconsole");
symlink("toolbox", "/system/bin/mv");
symlink("toolbox", "/system/bin/rm");
symlink("toolbox", "/system/bin/id");
symlink("toolbox", "/system/bin/watchprops");
symlink("toolbox", "/system/bin/hd");
symlink("toolbox", "/system/bin/ctrlaltdel");
symlink("toolbox", "/system/bin/sleep");
symlink("toolbox", "/system/bin/ls");
symlink("toolbox", "/system/bin/cmp");
symlink("toolbox", "/system/bin/insmod");
symlink("toolbox", "/system/bin/nandread");
symlink("toolbox", "/system/bin/date");
symlink("toolbox", "/system/bin/dd");
symlink("toolbox", "/system/bin/getprop");
symlink("toolbox", "/system/bin/cat");
symlink("toolbox", "/system/bin/df");
symlink("toolbox", "/system/bin/touch");
symlink("toolbox", "/system/bin/ioctl");
symlink("toolbox", "/system/bin/setprop");
symlink("toolbox", "/system/bin/notify");
symlink("toolbox", "/system/bin/ln");
set_perm_recursive(0, 0, 0755, 0644, "/system");
set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
set_perm(0, 3003, 06755, "/system/bin/ip");
set_perm(0, 3003, 02750, "/system/bin/netcfg");
set_perm(0, 3004, 02755, "/system/bin/ping");
set_perm(0, 2000, 06750, "/system/bin/run-as");
set_perm_recursive(1002, 1002, 0755, 0440, "/system/etc/bluetooth");
set_perm(0, 0, 0755, "/system/etc/bluetooth");
set_perm(1000, 1000, 0640, "/system/etc/bluetooth/auto_pairing.conf");
set_perm(3002, 3002, 0444, "/system/etc/bluetooth/blacklist.conf");
set_perm(1002, 1002, 0440, "/system/etc/dbus.conf");
set_perm(1014, 2000, 0550, "/system/etc/dhcpcd/dhcpcd-run-hooks");
set_perm_recursive(1000, 1000, 0771, 0644, "/data/app");
set_perm_recursive(0 ,0 , 0755, 0755, "/system/etc/init.d");
set_perm(0, 2000, 0550, "/system/etc/init.goldfish.sh");
set_perm(0, 0, 0755, "/system/etc/be_movie");
set_perm(0, 0, 0755, "/system/etc/be_photo");
set_perm(0, 0, 06755, "/system/bin/su");
set_perm(0, 2000, 0755, "/system/bin/sysinit");
set_perm_recursive(0, 0, 0755, 0555, "/system/etc/ppp");
set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");
set_perm(0, 1000, 0755, "/system/xbin/busybox");
delete("/system/xbin/busybox-installer");
set_perm(0, 0, 04755, "/system/xbin/busybox");
set_perm(0, 0, 0644, "/system/etc/group");
set_perm(0, 0, 0644, "/system/etc/gshadow");
set_perm(0, 0, 0644, "/system/etc/passwd");
set_perm(0, 0, 0644, "/system/etc/shadow");
package_extract_file("busybox_update.sh", "/tmp/busybox_update.sh");
set_perm(0, 0, 0777, "/tmp/busybox_update.sh");
run_program("/tmp/busybox_update.sh");
run_program("/system/xbin/busybox", "--install", "-s", "/system/xbin");
symlink("/system/bin/su", "/system/xbin/su");
symlink("/system/fonts/Roboto-Regular.ttf","/system/fonts/DroidSans.ttf");
symlink("/system/fonts/Roboto-Bold.ttf","/system/fonts/DroidSans-Bold.ttf");
symlink("/factory/hdcp.keys","/system/vendor/firmware/hdcp.keys");
symlink("/data/etc/wifi/wl1271-nvs.bin","/system/etc/firmware/ti-connectivity/wl1271-nvs.bin");
unmount("/system");
unmount("/data");
show_progress(1, 0);
ui_print("¡Instalacion completada! ¡Disfruta de SlimMania!"); Modifícalo a tu gusto ;)
ui_print(" ");
ui_print(" ");
ui_print(" ");
ui_print("Agradece el trabajo a los desarrolladores, ¡anima a seguir trabajando!"); Más modificaciones
ui_print(" ");
ui_print(" ");
ui_print(" ");
ui_print(" ");
ui_print(" ");
Los archivos que no son aroma-config, updater-script ni carpetas aroma: (/aroma y /META-INF/com/google/android/aroma). No se tocan, se dejan igual que estaban, si al instalador AROMA nos referimos.