#1
|
||||
|
||||
Como compilar android
Vamos a partir de la idea de que todos tenemos unos conocimientos medios de linux así que lo primero de todo es tener en cuenta que para poder compilar Android necesitamos un sistema de archivos que haga diferencia entre Mayúsculas y minúsculas (case sensitive), es algo obligatorio y que necesitaremos ciertas herramientas necesarias para compilar.
Aclaro que con esto compilamos el source de android, por lo tanto el resultado sera una build ADP y lo mas seguro es que tengas que cambiar el SPL para poder instalarla. Para Mac con xcode, macports, gmake libsdl, git-core y gnupg seria suficiente, mientras que para linux necesitaremos algo mas... git-core, gnupg, sun-java5-jdk, flex, bison, gperf, libsdl-dev, libesd0-dev, libwxgtk2.6-dev, build-essential, zip, curl, libncurses5-dev, zlib1g-dev segun la distribucion de linux que tengas se necesitaran mas o menos cosas y como no tener instalado correctamente el SDK de Android. Los pasos que indicare son usados en Mac, pero en linux han de ser los mismos. 1) Descargar la aplicación REPO con la que podremos descargar los distintos proyecto de Android. Código:
curl http://android.git.kernel.org/repo > /bin/repo chmod a+x /bin/repo 2) Crear una carpeta para nuestro proyecto. Código:
mkdir /<donde yo quiera>/cupcake 3) Empezamos a descargar el source Código:
cd /<ruta>/cupcake repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake Si editamos el archivo manifest.xml Código:
cd .repo nano manifest.xml Cita:
<project path="kernel"
name="kernel/common" revision="refs/heads/android-2.6.27" /> Si no decidimos modificar nada podemos proceder a descargar todo el codigo fuente de android para luego compilarlo. Código:
repo sync Cita:
usamos el parámetro -b para indicar un proyecto en concreto, cupcake, master, donut,... esto tardara varios minutos en descargarse.
Ahora ya tenemos descargado el Source de Android, pero esto solo nos serviría para compilar algo genérico y que no nos serviría demasiado para un HTC DREAM o MAGIC, hace falta descargar una serie de archivos mas específicos para nuestro terminal. 4) Descargamos el local_manifest.xml del siguiente enlace http://source.android.com/documentation/building-for-dream/local_manifest.xml?attredirects=0 y lo copiamos en la siguiente ruta Código:
/<ruta>/cupcake/.repo Cita:
<?xml version="1.0" encoding="UTF-8"?>
<manifest> <remove-project name="kernel/common"/> <project path="kernel" name="kernel/msm" revision="refs/heads/android-msm-htc-$ <project path="vendor/htc/dream" name="platform/vendor/htc/dream"/> <project path="hardware/msm7k" name="platform/hardware/msm7k"/> </manifest> 5) Ahora volvemos a sincronizar desde la raiz del proyecto. Código:
repo sync 6) Ya tenemos lo necesario para compilar el source de android para una HTC DREAM o MAGIC pero nos hacen falta algunas librerías para evitar problemas, para eso tenemos que conectar el teléfono por USB al ordenador ya que vamos a tener que sacar las librerías de este, una vez conectado haremos lo siguiente ya que primero hay que modificar el script para extraer una libreria la cual muchas veces el compilador no es capaz de compilar bien. Código:
cd vendor/htc/dream nano extract-files.sh Cita:
adb pull /system/lib/libOmxCore.so propietary/libOmxCore.so
Ahora ya podemos ejecutar el script Código:
./extract-files.sh este script nos descargara del teléfono las librerías necesarias mediante adb. 7) Por ultimo copiamos una pequeña plantilla de configuración del SO, volvemos a la raiz del proyecto y hacemos lo siguiente. Código:
cp build/buildspec.mk.default buildspec.mk Cita:
Antes
Cita:
#TARGET_PRODUCT:=generic
Cita:
Después
Cita:
TARGET_PRODUCT:=htc_dream
8) Ya podemos empezar a compilar Código:
make Código:
make -j2 external/qemu/sockets.c: In function 'sock_address_init_resolve': external/qemu/sockets.c:637: error: 'EAI_NODATA' undeclared (first use in this function) external/qemu/sockets.c:637: error: (Each undeclared identifier is reported only once external/qemu/sockets.c:637: error: for each function it appears in.) make: *** [out/host/linux-x86/obj/EXECUTABLES/emulator_intermediates sockets.o] Error 1 Nuestro compañero crebaindamme nos ha encontrado una solucion http://www.pocketmagic.net/?p=682 Resumo lo que hay que hacer. 1) Editamos el archivo sockets.c ubicado en external/qemu Código:
nano /<ruta>/external/qemu/sockets.c Cita:
Antes:
# include <netinet/tcp.h> # include <netdb.h> # if HAVE_UNIX_SOCKETS Cita:
Despues:
# include <netinet/tcp.h> # define __USE_GNU # include <netdb.h> # if HAVE_UNIX_SOCKETS Código:
Make ( o Make -j2 ) Cuando termine de compilarse en out/target/product/dream tendremos las imágenes generadas, system.img recovery.img, boot.img ademas de lo binarios, aplicaciones y todo el contenido de las imagenes. Código:
-rw-r--r-- 1 ridli staff 12B 20 may 22:04 android-info.txt -rw-r--r-- 1 ridli staff 1,6M 21 may 17:59 boot.img -rw-r--r-- 1 ridli staff 285B 30 may 00:17 clean_steps.mk drwxr-xr-x 3 ridli staff 102B 21 may 17:40 core drwxr-xr-x 2 ridli staff 68B 20 may 22:03 data -rw-r--r-- 1 ridli staff 14K 30 may 00:18 installed-files.txt -rwxr-xr-x 1 ridli staff 1,4M 9 may 02:14 kernel drwxr-xr-x 12 ridli staff 476B 21 may 18:12 obj -rw-r--r-- 1 ridli staff 47B 30 may 00:17 previous_build_config.mk -rw-r--r-- 1 ridli staff 373K 30 may 00:18 ramdisk-recovery.img -rw-r--r-- 1 ridli staff 143K 21 may 17:58 ramdisk.img drwxr-xr-x 3 ridli staff 102B 30 may 00:18 recovery -rw-r--r-- 1 ridli staff 1,8M 30 may 00:18 recovery.img drwxr-xr-x 8 ridli staff 442B 21 may 17:58 root drwxr-xr-x 4 ridli staff 170B 21 may 17:58 symbols drwxr-xr-x 10 ridli staff 374B 21 may 18:04 system -rw------- 1 ridli staff 46M 30 may 00:18 system.img -rw------- 1 ridli staff 2,1K 21 may 17:57 userdata.img Ahora nos queda lo mas importante, comprobar que nuestro trabajo esta bien hecho y para ello vamos a usar las herramientas del SDK de Android, vamos a la carpeta donde tengamos el SDK y entramos en el directorio tools que es donde estan las herramientas que vamos a necesitar. 1) Comprobar que tenemos creado un dispositivo virtual (AVD) sobre la que usar nuestras imagenes. Código:
./android list avd Available Android Virtual Devices: Name: cupcake Path: /Users/ridli/.android/avd/cupcake.avd Target: Android 1.5 (API level 3) Skin: HVGA --------- Name: master Path: /Users/ridli/.android/avd/master.avd Target: Android 1.1 (API level 2) Skin: HVGA Cita:
-c --sdcard Path to a shared SD card image, or size of a new sdcard for the new AVD
-s --skin Skin of the new AVD -p --path Location path of the directory where the new AVD will be created -n --name Name of the new AVD [required] -t --target Target id of the new AVD [required] -f --force Force creation (override an existing AVD) Target 1 = master (1.1) Target 2 = cupcake (1.5) Código:
./android create avd -n <nombre> -t 2 Android 1.5 is a basic Android platform. Do you wish to create a custom hardware profile [no] no Created AVD 'cupcake' based on Android 1.5 2) Procederemos a iniciar el emulador de android con nuestra imagen de system para comprobar su funcionamiento. Código:
./emulator -avd <nombre> -system /<ruta del proyecto>/out/target/product/dream/system.img Si veis alguna cosa masl en el tutorial, algo que se deba de matizar un poco mas no dudeis en avisarme para que lo arregle/cambie Última edición por ridli Día 14/07/09 a las 16:43:31. |
Los siguientes 10 usuarios han agradecido a ridli su comentario: | ||
|
#2
|
||||
|
||||
Gran aporte Ridli... Muy bueno, cuando tenga tiempo me pondre a hacer pruebas.
Para mi este post y el de crear un update.zip merecen chincheta. |
#3
|
||||
|
||||
Gracias ridli
__________________
No atiendo consultas sobre Meizu M2 Note y/o Android por privado, usad el foro que para algo está. Dispositivo: Meizu M2 Note ~®oot~
|
#5
|
||||
|
||||
gracias a vosotros y espero que os sirva de ayuda.
De todas formas veo muchas visitas y pocos comentarios, no se si es que en algun punto os da error o esta mal redactado.. no se.. |
#6
|
||||
|
||||
A mi me interesa mucho este Tema pero me has pillado muy ocupado en este mes, cuando termine las tareas me meteré en ello y ya te comentare cosas, aqui o en tu foro habitual. Salu2.
__________________
No atiendo consultas sobre Meizu M2 Note y/o Android por privado, usad el foro que para algo está. Dispositivo: Meizu M2 Note ~®oot~
|
#7
|
||||
|
||||
Estoy intentando hacer una compilacion. Como no indicas si ha que hacerlo como root o como usuario normal.
Por ejemplo, el 1er. comando no me deja hacerlo como usuario sino como superusuario root curl http://android.git.kernel.org/repo > /bin/repo Este otro lo hago como usuario y sale errores. Cita:
repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake
Traceback (most recent call last): File "/bin/repo", line 590, in <module> main(sys.argv[1:]) File "/bin/repo", line 557, in main _Init(args) File "/bin/repo", line 176, in _Init _CheckGitVersion() File "/bin/repo", line 205, in _CheckGitVersion proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) File "/usr/lib64/python2.6/subprocess.py", line 595, in __init__ errread, errwrite) File "/usr/lib64/python2.6/subprocess.py", line 1106, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory
__________________
No atiendo consultas sobre Meizu M2 Note y/o Android por privado, usad el foro que para algo está. Dispositivo: Meizu M2 Note ~®oot~
|
#8
|
||||
|
||||
Al principio aclaro que hay que tener unos conocimientos medios de linux/unix porque al igual que para hacer cualquier modificacion en bin (he puesto bin por poner un sitio, que tambien podia ser ~/bin ) o instalar las librerias o aplicaciones necesarias seria necesario quizas buscar un poco por si algun repositorio no las tiene. Es que sino el manual ha de ser mucho mas extenso porque habria que explicar de donde sacar librerias que no estan en respositorios algunas veces, ojo que no digo que no que seas una patata con linux, sino que algunas cosas no las he puesto por eso.
Me parece que ese error te sale por no tener instalado GIT. Última edición por ridli Día 05/06/09 a las 21:28:03. |
#9
|
||||
|
||||
Hola Ridli... He intentado hacer una compilación... Hago todo el proceso, pero al final cuando estoy haciendo el make me sale el siguiente error, y deja de compilar:
host C: emulator <= external/qemu/sockets.c external/qemu/sockets.c: En la función ‘sock_address_init_resolve’: external/qemu/sockets.c:637: error: ‘EAI_NODATA’ no se declaró aquí (primer uso en esta función) external/qemu/sockets.c:637: error: (Cada identificador no declarado solamente se reporta una vez external/qemu/sockets.c:637: error: para cada funcion en la que aparece.) make: *** [out/host/linux-x86/obj/EXECUTABLES/emulator_intermediates/sockets.o] Error 1 ¿Sabes a que se puede deber? Yo creo que falta alguna configuración... En fin, ya me contaras. Un saludo |
#10
|
||||
|
||||
Hola... acabo de encontrar una solución... a ver si la pruebo hoy al medio día y os digo algo. Aquí está:
http://www.pocketmagic.net/?p=682 Ridli, seguramente sería importante ponerlo en el primer post. Bueno... lo pruebo primero y luego comento. En este link viene el añadido de como ejecutar codigo C en android. Un saludo. Última edición por crebaindamme Día 09/06/09 a las 13:13:51. |
#11
|
||||
|
||||
Bueno chicos... después de hora y media compilando... pude comprobar mediante el emulador que si!!! He compilado mi primera rom de Android (claro está que no era mía si no de Google, pero es un primer paso), con lo cual el link que puse antes solucionó el problema.
Ahora el siguiente paso es saber si se podría cargar esa rom en el telefono mediante : fastboot flash system system.img O cómo se podría hacer un update.zip a partir de esto... En fin... seguiré buscando cositas a ver si encuentro algo. Un saludo |
#12
|
||||
|
||||
Siento no haberte contestado pero ando con muchas cosas encima y apenas tengo tiempo, me.
El problema que tiene Linux es que hay tantas distros y cada una la tiene instalado cada cual como quiere que es algo dificil saber que hace falta y que no hace falta, por lo que veo en tu mensaje es un problema del compilador y por la solucion que has puesto es eso mismo, ahora mismo lo añado. Como hacer un update.zip lo tienes en otro hilo, ademas de que lo hice para trabajar desde una version compilada del source, de todas formas para instalar tu build lo puedes hacer como tu dices. 1) arrancar desde fastboot 2) fastboot erase system. 3) fastboot flash system /<ruta>/system.img Depende de la version que tengas previamente instalada te hara falta hacer wipe o cambiar el boot. |
#13
|
||||
|
||||
Ok... Gracias Ridli. Si, tienes razón, cuando había leido el otro post no me había dado cuenta de que hacías el update zip con una imagen precompilada, pensé que simplemente modificabas otro update.zip. Ahora lo acabo de ver... Bien, el miedo que tengo es con el contenido del update-script que no lo entiendo muy bien:
¿Si lo haces mal... simplemente te da fallo y no instala el update o lo instala igualmente y cascas la rom instalada anteriormente? El boot no tiene nada que ver con el recovery ¿no? Como ves ando un poco pez con algunas cosillas, pero al menos ya estoy metiendo mano y probando (que no es poco jejejejejjejejje). Ah... quería saber tambien qué aplicaciones sería bueno meter para no perder el acceso root ¿bastaría con el Superuser.apk?, me supongo que no, que habría que meter algo más o tocar en alguna otra parte ¿no? No te preocupes por lo de no haber contestado... te entiendo perfectamente Un saludo |
#14
|
||||
|
||||
Hmm... Superuser.apk es una aplicacion que te permite controlar el acceso como root, no para evitar perderlo.
Boot.img es el arranque del telefono mientras que recovery es un modo recuperacion que no tiene nada que ver con el arranque normal. La estructura del boot.img no es muy diferente entre una version y otra, lo unico medianamente importante es el kernel, pero teniendo cupcake instalado no deberias de tener muchos problemas en cambiar de una version a otra sin cambiar el Boot, depende como te digo de que tenias antes instalado pero de toda formas nunca viene mal instalar el nuevo boot para evitar problemas. Volviendo al tema del root.. mientras que con una version "oficial" tienes que hacer una copia del SH en Cupcake directamente tienes un binario que lo controla pero este hace un chequeo del uid del usuario que lo ejecuta, si no coincide con el de root o con alguno de los grupos que han de tener permiso te dice que lo intentes otro dia, las soluciones que tienes son sencillas. Borras la imagen de system, cambias el SU por uno ya modificado y vuelves a empaquetarlo todo con Make Código:
rm -rf out/target/product/dream/system.img rm -rf out/target/product/dream/obj/PACKING/systemimage_unopt_intermediates/system.img cp </ruta su modificado>/su out/target/product/dream/system/bin/ make o bien modificas su.c antes de compilar (o despues borrando las versiones pre-compiladas y compiladas en out/... y vuelves ha compilar/empaquetar) y editas lo siguiente: Código:
nano system/extras/su/su.c Cita:
Antes:
int main(int argc, char **argv) { struct passwd *pw; int uid, gid,muid; Cita:
Despues:
int main(int argc, char **argv) { struct passwd *pw; int uid, gid; Cita:
Antes:
} else { uid = pw->pw_uid; gid = pw->pw_gid; } } /* Until we have something better, only root and the shell can use su. * myuid = getuid(); if (myuid != AID_ROOT && myuid != AID_SHELL) { fprintf(stderr,"su: uid %d not allowed to su\n", myuid); return 1; } if(setgid(gid) || setuid(uid)) { fprintf(stderr,"su: permission denied\n"); Cita:
Despues:
} else { uid = pw->pw_uid; gid = pw->pw_gid; } } if(setgid(gid) || setuid(uid)) { fprintf(stderr,"su: permission denied\n"); |
#15
|
||||
|
||||
Muchas gracias Ridli... Lo probare, ya te contaré que tal.
Un saludo |
#16
|
||||
|
||||
Bueno... he tenido unos problemillas con mi linux y no he podido compilar. Pero ya he visto donde se cambia el tema. El caso es que se me queda colgado en la mitad del proceso make (creo q igual se pega algo de lo que tengo instalado con lo que tuve q instalar para compilar android... o eso, o se queda corto de memoria), así que reinstalare el SO (cuando tenga un ratillo) y probaré de nuevo. El caso es q me paso un par de veces cuando lo intente la primera vez... pero al final lo conseguí. Ahora es completamente imposible.
En fin, ya os contaré. Un saludo |
#17
|
||||
|
||||
Pega un pantallazo de como se te queda por si es problema de la compilacion, si ya has compilado antes e intentas volver a compilar porque has añadido una aplicacion o has modificado algo del source tienes que borrar las imagenes afectadas al igual que los binarios compilados que has modificado en el source, si no lo haces no te modifica nada y de algun mensaje raro.
Si modificas el SU por ejemplo ademas de borrar las imagenes de system tambien hay que borrar el binario compilado, que se me fue la pinza :P out/target/product/dream/obj/EXECUTABLES/su_intermediates/LINKED/su out/target/product/dream/obj/EXECUTABLES/su_intermediates/su out/target/product/dream/symbols/system/bin/su out/target/product/dream/system/xbin/su |
#18
|
||||
|
||||
Jajajajajaja... no, no te preocupes. Creo q el problema esta en el Linux, que al requerir de bastante memoria para compilar me deja el procesador petado, o eso, o es una incompatibilidad entre el compilador y alguna otra aplicación que tenía por ahí. Ahora al medio día he vuelto a instalar el SO, todavía me falta terminar de ponerlo a punto para probar de nuevo. Ya te contaré.
Gracias por este último aporte (tomo nota). Una preguntilla... una vez compilado, en out/target/product/dream se encuentra toda la estructura de directorios que se van a incluir en la imagen. Si introduzco una aplicación ya compilada como apk en la estructura (eliminando claro está la imagen anterior), al volver a hacer el make ¿esa aplicación quedaría metida en la imagen para poder probar la rom en el emulador o por el contrario hay que meterla desde el origen (en codigo java) y realizar el make completo? Tengo más preguntas pero creo que llendo poquito a poco y descubriendo cosas aprenderé más. Además no quiero agobiarte con una ristra de preguntas.... De todos modos cuando me quede atascado ya te comentare. Muchas gracias por todo. Un saludete |
#19
|
||||
|
||||
Jajajajajaja... no, no te preocupes. Creo q el problema esta en el Linux, que al requerir de bastante memoria para compilar me deja el procesador petado, o eso, o es una incompatibilidad entre el compilador y alguna otra aplicación que tenía por ahí. Ahora al medio día he vuelto a instalar el SO, todavía me falta terminar de ponerlo a punto para probar de nuevo. Ya te contaré.
Gracias por este último aporte (tomo nota). Una preguntilla... una vez compilado, en out/target/product/dream se encuentra toda la estructura de directorios que se van a incluir en la imagen. Si introduzco una aplicación ya compilada como apk en la estructura (eliminando claro está la imagen anterior), al volver a hacer el make ¿esa aplicación quedaría metida en la imagen para poder probar la rom en el emulador o por el contrario hay que meterla desde el origen (en codigo java) y realizar el make completo? Tengo más preguntas pero creo que llendo poquito a poco y descubriendo cosas aprenderé más. Además no quiero agobiarte con una ristra de preguntas.... De todos modos cuando me quede atascado ya te comentare. Muchas gracias por todo. Un saludete |
|
#20
|
||||
|
||||
Ok... lo probare y ya os contaré...
Con respecto a las dudas, también pienso lo mismo, por eso voy poniendo más o menos los progresos que voy haciendo. Una de las dudas más gordas que tengo y que estuve buscando (pero todavía no encontré por ahí nada claro) es con el update-script para crear el update.zip (lo único que encontré fué un post de Jesus Freak que decía que había que mirar el código fuente del recovery, y era lo que tenía pensado hacer): la duda viene de la asignación de permisos a cada elemento. Me explico, cuando haces el set_perm se le asigna mediante un codigo, lo que yo entiendo como permiso de ejecución. El problema estriba en el código introducido ya que no encontré en ninguna parte un manual claro que diga que código hay que meter para un determindado permiso (no se si me he explicado). Por lo demás y hasta el punto en el que estoy creo que los manuales se siguen correctamente y son muy claros. En cualquier caso te iré comentando. Un saludo. |