Boot to Gecko (FirefoxOS) utiliza un kernel derivado de Android, con una interfaz de usuario basada en Gecko sobre él. Este artículo provee la guía básica de cómo portar el sistema operativo en nuevos dispositivos.
Esta guía asume que tu estas portando en un dispositivo nuevo que está funcionando con Andriod; Si estás portando a otro dispositivo, el trabajo va a ser más enredado.
Prequisitos
Configurando la compilación de tu sistema
El primer paso es configurar la compilación del sistema; puedes seguir la guía en prerequisitos para compilar B2G.
Crear una copia de seguridad local del sistema original de Android
A continuación, deberás hacer una copia de seguridad de tu dispositivo Android antes de empezar a bombardearlo con tu compilación de pruebas de B2G. Además, algunos de estos comandos serán necesarios para el proceso de compilación e instalación.
mkdir my_device_backup cd my_device_backup adb pull /system system
Nota: Esto es opcional pero es recomendado, ya que algunas veces es posible tener perdidas mayores ocasionadas por problemas de compilaciones, en donde si no posees una copia de los archivos propietarios de tu telefono, lo mas probable es que el problema sea irreparable.
B2G
Crea un fork del repositorio de B2G
Para esto necesitas una cuenta en Github.com, si no la tienes, creala y luego realiza un fork del siguiente repositiorio:
https://github.com/mozilla-b2g/B2G
Si no sabes como crear un fork de un repositorio en visita este sitio para obtener ayuda.
Clona tu repositorio de B2G
Una vez hecho el fork anterior, para empezar a portar B2G a tu nuevo dispositivo, es necesario que clones el repositiorio en tu equipo, clonamos el reposiorio de la siguiente manera:
git clone https://github.com/Your-User-Name/B2G.git
Remplaza Your-User-Name con el usuario de tu cuenta de Github.
Agrega un nuevo dispositivo al config.sh
El siguiente paso, es agregar un nuevo dispositivo a config.sh
; puedes usar uno de los existentes como plantilla. Esto básicamente consiste en proporcionar las instruciones para obtener los archivos correctos para hacer la compilación.
Busca la linea siguiente en tu archivo config.sh
:
case "$1" in
Seguidamente agrega:
"device-name") echo DEVICE=device-name >> .tmp-config && repo_sync $1 ;;
Nota: Debes remplazar la parte en que dice device-name, con el nombre de tu dispositivo, como por ejemplo si tu dispositivo fuera el Samsung Galaxy S3, quedaria asi:
"i9300") echo DEVICE=i9300 >> .tmp-config && repo_sync $1 ;;
Como ultimo paso (opcional, no influye en nada si realizas o no este paso), buscas esta parte en tu archivo config.sh
:
echo Usage: $0 \(device name\) echo echo Valid devices to configure are: echo - galaxy-s2 echo - galaxy-nexus echo - nexus-s echo - nexus-s-4g echo - otoro echo - unagi echo - pandaboard echo - emulator echo - emulator-x86 exit -1 ;;
Y agregas tu dispositivo:
echo - device-name
Nota: Debes remplazar la parte en que dice device-name, con el nombre de tu dispositivo, como por ejemplo si tu dispositivo fuera el Samsung Galaxy S3, quedaria asi:
echo - i9300
Crear un árbol de configuración para el nuevo dispositivo
Este arbol de configuracion debe incluir, al menos:
AndroidBoard.mk
AndroidProducts.mk
BoardConfig.mk
extract-files.sh
full_<device_id>.mk
- archivos idc para pantallas táctiles
- archivos de inicio (
init.rc
,init.<target>.rc
,uevent.rc
, ...)
El contenido aquí puede variar en gran medida entre un dispositivo y otro. En particular, BoardConfig.mk y extract-files.sh podrían variar significativamente. Esta parte requiere un conjunto de hacking, pruebas, y depuración para averiguar que pedazos binarios deberán ser extraidos. Este arbol de configuracion debe estar hosteado en un repo en tu cuenta de Github, mira este repositorio de ejemplo para que te hagas una idea de como tiene que quedar. (Solo es un ejemplo y no tiene que quedar igual a este, todos los telefonos tienen distinto Hardware)
Nota: No es necesario que crees estos archivos por tu propia cuenta, por lo general la mayoria de los telefonos y dispositivos que corren CyanogenMod o AOKP tienen un repositorio en Github con todos estos archivos del arbol de configuracion, puedes distinguirlos, porque la mayoria de estos repositorios llevan el nombre de: ej "android_device_samsung_i9300" (como es en este caso ejemplo, el nombre varia dependiendo de tu dispositivo). Asi que es recomendable que antes de que empieces a crear estos archivos por tu cuenta, revises algunos de los repositorios de CyanogenMod o AOKP, para ver si el arbol de configuracion de tu dispositivo ya esta creado por alguien mas.
Caso contrario ocurre con los dispositivos ZTE o algunos otros dispositivos a los cuales CyanogenMod o AOKP aun no han llegado, que requieren que crees estos archivos por tu propia cuenta desde 0. El Foro XDA es otro buen lugar para debatir y ver recursos.
Una vez que tengas estos archivos, si te ha tocado crearlos desde 0 o tienes los archivos del arbol de configuracion en tu equipo, es totalmente necesario que los subas a un repositorio en tu cuenta de Github como se habia mencionado anteriormente. Si no sabes como crear el repositorio en donde alojar tus archivos de configuracion, por favor revisa esta guia. Al final del proceso deberas tener un repositorio como este:
https://github.com/Your-User-Name/android-device-your-new-device
En donde dice Your-User-Name deberia aparecer tu nombre de usuario de tu cuenta en Github, y en donde dice android-device-new-device, deberia aparecer el nombre que le has puesto a tu repositiorio cuando estabas creandolo. (ej: android-device-samsung-i9300)
Si por el contrario has tenido suerte de encontrar que CyanogenMod o AOKP, o algun otro usuario ya ha creado estos archivos, tienes que hacer un fork del repo en tu cuenta. En pocas palabras, es necesario que tengas todos los repos de tu dispositivo ha realizar el port de FirefoxOS, alojados en tu cuenta de Github.
El Archivo Manifest
Crea un fork del repositorio b2g-manifest
De nuevo realizamos un fork al repositorio de b2g-manifest.
https://github.com/mozilla-b2g/b2g-manifest
Si no sabes como crear un fork de un repositorio en visita este sitio para obtener ayuda.
Este fork tiene que quedar igualmente en tu cuenta de Github.
Crea tu propio repositorio de b2g-manifest
Una vez mas, es necesario que el repositorio que acabas de clonar en el paso anterior, sea hosteado por una cuenta de Github tuya en donde puedas hacer las modificaciones especiales para tu dispositivo. Quedando de la siguiente manera:
git clone https://github.com/Your-User-Name/b2g-manifest.git
Crear el archivo de manifiesto para el nuevo dispositivo
Ahora necesitas agregar los repositorios requeridos para el archivo de manifiesto para el nuevo dispositivo; este archivo de manifiesto es llamado device-name.xml (el nombre de este archivo debe ser cambiado por el nombre de tu dispositivo, conservando la extension que lo caracteriza, el .xml). Este archivo debe tener la siguiente estructura:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="aosp"
fetch="https://android.googlesource.com/" />
<remote name="b2g"
fetch="git://github.com/mozilla-b2g/" />
<remote name="linaro"
fetch="git://android.git.linaro.org/" />
<remote name="mozilla"
fetch="git://github.com/mozilla/" />
<remote name="mozillaorg"
fetch="https://git.mozilla.org/releases" />
<default revision="refs/tags/android-4.0.4_r1.2"
remote="linaro"
sync-j="4" />
<!-- Gonk specific things and forks -->
<project path="build" name="platform_build" remote="b2g" revision="master">
<copyfile src="core/root.mk" dest="Makefile" />
</project>
<project path="dalvik" name="fake-dalvik" remote="b2g" revision="master" />
<project path="gaia" name="gaia.git" remote="mozillaorg" revision="master" />
<project path="gecko" name="gecko.git" remote="mozillaorg" revision="master" />
<project path="gonk-misc" name="gonk-misc" remote="b2g" revision="master" />
<project path="rilproxy" name="rilproxy" remote="b2g" revision="master" />
<project path="external/moztt" name="moztt" remote="b2g" revision="master" />
<!-- Stock Android things -->
<project path="abi/cpp" name="platform/abi/cpp" />
<project path="bionic" name="platform/bionic" />
<project path="bootable/recovery" name="platform/bootable/recovery" />
<project path="device/common" name="device/common" />
<project path="device/sample" name="device/sample" />
<project path="external/apriori" name="platform_external_apriori" remote="b2g" revision="master" />
<project path="external/bluetooth/bluez" name="platform/external/bluetooth/bluez" />
<project path="external/bluetooth/glib" name="platform/external/bluetooth/glib" />
<project path="external/bluetooth/hcidump" name="platform/external/bluetooth/hcidump" />
<project path="external/bsdiff" name="platform/external/bsdiff" />
<project path="external/bzip2" name="platform/external/bzip2" />
<project path="external/dbus" name="platform/external/dbus" />
<project path="external/dhcpcd" name="platform/external/dhcpcd" />
<project path="external/dnsmasq" name="platform/external/dnsmasq" />
<project path="external/elfcopy" name="platform_external_elfcopy" remote="b2g" revision="master" />
<project path="external/elfutils" name="platform_external_elfutils" remote="b2g" revision="master" />
<project path="external/expat" name="platform/external/expat" />
<project path="external/fdlibm" name="platform/external/fdlibm" />
<project path="external/flac" name="platform/external/flac" />
<project path="external/freetype" name="platform/external/freetype" />
<project path="external/giflib" name="platform/external/giflib" />
<project path="external/gtest" name="platform/external/gtest" remote="linaro" revision="master" />
<project path="external/harfbuzz" name="platform/external/harfbuzz" />
<project path="external/icu4c" name="platform/external/icu4c" />
<project path="external/iptables" name="platform/external/iptables" />
<project path="external/jpeg" name="platform/external/jpeg" />
<project path="external/libgsm" name="platform/external/libgsm" />
<project path="external/liblzf" name="platform/external/liblzf" />
<project path="external/libnfc-nxp" name="platform/external/libnfc-nxp" />
<project path="external/libnl-headers" name="platform/external/libnl-headers" />
<project path="external/libpng" name="platform/external/libpng" />
<project path="external/libvpx" name="platform/external/libvpx" />
<project path="external/mksh" name="platform/external/mksh" />
<project path="external/opensans" name="platform_external_opensans" remote="b2g" revision="master" />
<project path="external/openssl" name="platform/external/openssl" />
<project path="external/protobuf" name="platform/external/protobuf" />
<project path="external/safe-iop" name="platform/external/safe-iop" />
<project path="external/screencap-gonk" name="screencap-gonk" remote="b2g" revision="master" />
<project path="external/sonivox" name="platform/external/sonivox" />
<project path="external/speex" name="platform/external/speex" />
<project path="external/sqlite" name="platform/external/sqlite" />
<project path="external/stlport" name="platform/external/stlport" />
<project path="external/strace" name="platform/external/strace" />
<project path="external/tagsoup" name="platform/external/tagsoup" />
<project path="external/tinyalsa" name="platform/external/tinyalsa" />
<project path="external/tremolo" name="platform/external/tremolo" />
<project path="external/webp" name="platform/external/webp" />
<project path="external/webrtc" name="platform/external/webrtc" />
<project path="external/wpa_supplicant" name="platform/external/wpa_supplicant" />
<project path="external/wpa_supplicant_8" name="platform/external/wpa_supplicant_8" />
<project path="external/zlib" name="platform/external/zlib" />
<project path="external/yaffs2" name="platform/external/yaffs2" />
<project path="frameworks/base" name="platform/frameworks/base" />
<project path="frameworks/opt/emoji" name="platform/frameworks/opt/emoji" />
<project path="frameworks/support" name="platform/frameworks/support" />
<project path="hardware/libhardware" name="platform/hardware/libhardware" />
<project path="hardware/libhardware_legacy" name="platform/hardware/libhardware_legacy" />
<project path="hardware/ril" name="platform/hardware/ril" />
<project path="libcore" name="platform/libcore" />
<project path="ndk" name="platform/ndk" />
<project path="prebuilt" name="platform/prebuilt" />
<project path="system/bluetooth" name="platform/system/bluetooth" />
<project path="system/core" name="platform/system/core" />
<project path="system/extras" name="platform/system/extras" />
<project path="system/media" name="platform/system/media" />
<project path="system/netd" name="platform/system/netd" />
<project path="system/vold" name="platform/system/vold" />
<!-- Cosas de tu dispositivo -->
</manifest>
El archivo manifesto es muy facil de crear, simplemente necesitaras el codigo anterior y entenderlo un poco. Copia el codigo anterior
Booteo de B2G
Recompilar boot.img
Una vez lo tengas todo hecho, necesitas recompilar la imágen de arranque. Esto no suele ser necesario para el propio Kernel, pero recoge los cambios en init.rc
.
Cambios a init.rc
El init.rc que utilizas no es el proporcionado por B2G; en su lugar, tienes que tirarlo desde el dispositivo
Las principales cosas que necesitarás modificar son:
Importar init.b2g.rc
Añade las siguientes líneas para importar init.b2g.rc
:
on early-init start ueventd import /init.b2g.rc
Fijar permisos
Corrige los permisos en los archivos /system/b2g/b2g
, /system/b2g/updater
, /system/b2g/plugin-container
; esto se deberá hacer después de las líneas que montan los archivos del sistema de lectura/escritura:
chmod 0755 /system/b2g/b2g chmod 0755 /system/b2g/updater chmod 0755 /system/b2g/plugin-container
Es posible que quieras iniciar modificando init.rc
del nuevo dispositivo en vez de usar el init.rc
proveido por la compilación del sistema; si es así, necesitas recordar configurar TARGET_PROVIDES_INIT_RC
en BoardConfig.mk
.
Kernel precompilado vs. compilando el kernel desde una fuente
Puedes usar un Kernel precompilado, o podrías compilar el Kernel desde una fuente. Para compilar el Kernel desde una fuente, añade AndroidKernel.mk y la configuración del kernel al árbol de configuración del dispositivo.
El maguro en la vieja compilación del sistema es un ejemplo de compilación del kernel desde una fuente.
Flasheo del dispositivo
Añade el nuevo dispositivo a flash.sh
Añade el nuevo dispositivo a flash.sh
; las especificaciones de como hacer esto dependerán de que herramientas necesitas usar para flashear el nuevo dispositivo.
Primer arranque
Configura, compila y flashea el nuevo dispositivo
Ahora puedes probar compilando y flasheando tu nuevo dispositivo:
ANDROIDFS_DIR=my_device_backup ./config.sh <device_id> default.xml ./build.sh ./flash.sh
Probar y depurar
Necesitamos añadir algunos detalles aqui; de hecho, este artículo podría usar algo de ayuda.
FAQ
¿A que dispiositivos se le puede hacer Port?
Si tu dispositivo corre Android 4.0.4 lo mas probable es que pueda correr FirefoxOS, no obstante no quiere decir que a la primera correra sin ningun problema. El Porting es todo un proceso de prueba y error, es posible que tardes mas tiempo solucionando problemas en los archivos que compiles, que recopilandolos todos.
Mi dispositivo es de arquitectura ARMv6, ¿correra alli?
Puede que si o puede que no, todo depende de tus conocimientos y de hasta donde puedas llegar con el Port, por ahora solo se conoce un caso en los foros de Geeksphone en donde un usuario a logrado completar un Port estable a uno de los telefonos que ofrece Geeksphone de arquitectura ARMv6.
¿Alguien mas esta trabajando en realizar Port a los diferentes dispositivos?
Quienes realizan los Port son desarrolladores, geeks o mozillians. No se puede definir un equipo especial de Mozilla que este trabajando en ello. Por otro lado la comunidad Mozilla Hispano tiene un proyecto conformado por un grupo de personas con el fin de lograr el Port a varios dispositivos. Para mas informacion puedes visitar este link.
¿Necesito algunos conocimientos previos para empezar a realizar el Port?
Si, de hecho hay dos tipos de casos que pueden suceder mientras realices el Port. El primero de ellos es que tengas la suerte de que todos los sources y archivos que encuentre en Github para tu Port esten bien y compilen sin ningun problema (Poco probable que suceda). El segundo caso es que te toque re escribir algunos, si no son todos los archivos y sources de tu dispositivo para lograr que compilen y que arranquen FirefoxOS (Es lo que probablemente te pueda suceder con seguridad). Por lo que por recomendacion, seria bueno que tuvieras previos conocimientos acerca del funcionamiento de Android, algo de C y C++.