Portando en CyanogenMod

Firefox OS es tradicionalmente compilado encima de AOSP. Esto no significa que nosotros solamente usemos AOSP. Varias ramas (forks) de AOSP existen que tienen como objetivo apoyar una amplia gama de hardware. CyanogenMod, el fork mas popular de AOSP, incluye cientos de añadiduras, modificaciones, y hacks para dar soporte a cientos de disposivitos Android al por menor. Este articulo explica como portar Firefox OS usando CyanogenMod.

Cuando compilamos Firefox OS encima de CyanogenMod podemos dar soporte al mismo numero de despositivos que CyanogenMod soporta. Debido a la gran cantidad de dispositivos soportados por CyanogenMod, es muy probable que ya tengas un dispositivo para el cual puedas compilar.

Importante: Esta guía es solamente para usuarios avanzados; debes de saber al menos cómo compilar CyanogenMod o AOSP.

Si nunca has compilado CyanogenMod para tu dispositivo entonces te sugerimos insistentemente que aprendas como hacerlo antes de portar Firefox OS. Esto tiene dos propositos: aprenderás como usar las herramientas necesarias para portar Firefox OS, y verificarás la calidad del 'port' de CyanogenMod.

Más explícitamente, ésta guía asume que tu dispositivo esta desbloqueado y tiene CyanogenMod instalado. Esta guia no te enseñara como rootear y/o desbloquear tu dispositivo, o como preparar tu maquina para compilar o como usar git para solucionar los fallos de combinación.

Un resumen de los pasos a seguir es el siguiente:

  1. Descargar el codigo fuente
  2. Modificar los 'repos' del dispositivo
  3. Modicar el núcleo
  4. Compilar e Instalar

Descargar el código de fuente

Para hacer: Convinar el manifiesto de mozilla-b2g: Bugzilla: 1211870.

Tenemos varias herramientas útiles para construir Firefox OS, todas ellas contenidas en un simple repositorio. Descárga estas herramientas por git para crear tu directorio de trabajo.

git clone https://github.com/cm-b2g/B2G.git && cd B2G

Hecho esto, necesitamos descargar el código fuente:

./config.sh cm-porting

El archivo config.sh  inicializa la herramienta repo usando el manifiesto  base-l-cm.xml  que se encuentra en el repositorio b2g-manifest.  Éste archivo XML es en realidad una lista de repositorios específicos del SO necesarios para construir B2G OS.  Luego, utiliza la herramienta repo para descargar todo el código de fuente.

La descarga de estos repositorios, muchos de los cuales tienen varias gigas,  tomará bastante tiempo, así que te recomendamos hacer esto en la noche si tienes una conección lenta, o justo después del almuerzo si tienes una conección rápida.

Este paso también crea un archivo .config que podrás editar después.

Manifiesto local para tu dispositivo

El manifiesto anterior no contiene ningún repositorio específico de dispositivo, asunto diferente al típico manifiesto. Necesitaremos entonces crear un local_manifest.xml con todos los repositorios de tu dispositivo. La manera más rápida de hacerlo es usando breakfast, un herramienta automática escrita por CyanogenMod para crear un manifiesto local y descargar los repositorios adicionales directamente de la cuenta de CyanogenMod en GitHub.

. build/envsetup.sh && breakfast 123

Reemplace 123 por el nombre clave de su dispositivo.

Si tu dispositivo no está oficialmente soportado por CyanogenMod, pero hay un 'port' no oficial, tu puedes crear el archivo local_manifest.xml manualmente en la carpeta  .repo/local_manifests.

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
     <remote name="xyz" fetch="git://github.com/xyz/" revision="cm-12.1" />
     <project name="device_oem_123" path="device/oem/123" remote="xyz" />
     <project name="device_oem_1xx-common" path="device/oem/1xx-common" remote="xyz" />
     <project name="kernel_oem_1xx" path="kernel/oem/1xx" remote="xyz" />
     <project name="vendor_oem" path="vendor/oem" remote="xyz" />
</manifest>

Recuerda correr repo sync cuando hayas creado tu manifiesto.

Modificar los 'repos' del dispositivo

Parte de la configuración de un dispositivo se encuentra en los archivos XML de superposición, usados por el sistema de construcción AOSP para establecer las opciones por defecto en las apps de Android. Firefox OS no los usa así que podemos reimplementar algunas de estas opciones, tales como el botón de inicio de la pantalla, el almacenamiento emulado, etc.

Podemos establecer opciones predeterminadas más sanas mediante la inclusión de dos archivos desde vendor/cm. La primera línea podría ser agregada en la parte superior de device.mk y la segunda en la parte inferior de BoardConfig.mk:

# Extra mk import at the top of device.mk
$(call inherit-product, vendor/cm/config/common_full.mk)

# Extra mk import at the bottom of BoardConfig.mk
include vendor/cm/BoardConfig.mk

Todavía se necesitan más opciones, ya que muchas son propiamente específicas del dispositivo . A continuación encontrarás una lista de adiciones y eliminaciones específicas de dispositivos comunes. Esta lista no es exhaustiva, pero agregando las dos líneas mencionadas arriba y configurando todas las de abajo,  tendrás un sistema funcional.

# for Gecko to use the correct resolution assets
# Valid options are: 1.5 | 2 | 2.25
GAIA_DEV_PIXELS_PER_PX := 2.25
# for Gecko to use the correct boot animation
# Valid options are: hvga | fwvga | qHD | 720p | 1080p
BOOTANIMATION_ASSET_SIZE := 1080p
# for Gecko to support separate internal storage partition
# This is for legacy devices only. You must prvide your own volume.cfg file
GECKO_BOARD_SEPARATE_STORAGE_PARTITON := true
# for Gecko to support virtual home button
PRODUCT_PROPERTY_OVERRIDES += \
    ro.moz.has_home_button=0
# for Gecko to support usb mass storage
# You may need to add mass_storage to init.oem.usb.rc
PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
-    persist.sys.usb.config=mtp
+    persist.sys.usb.config=mass_storage
# for Gecko to support NFC
PRODUCT_PROPERTY_OVERRIDES += \
    ro.moz.nfc.enabled=true

PRODUCT_PACKAGES += \
    nfcd
# Changes in init.device.rc
-on property:init.svc.bootanim=running
-on property:init.svc.bootanim=stopped
-on property:service.bootanim.exit=1
+on property:sys.boot_completed=1

Modificar el núcleo

Necesitamos habilitar en el núcleo algunas características de seguridad adicionales para Firefox OS. Estas características no estaban presentes en núcleos Android hasta Marshmallow así que muchos dispositivos necesitarán algunos parches 'backported' adicionales para el núcleo. Más información al respecto en Bugzilla: 790923.

Es suficiente tomar la mejor selección de parches para tu núcleo; el sistema de compilación habilitará automáticamente las nuevas características. Para un trabajo de ejemplo ver el LGE MSM8994 kernel.

Importante: Este paso es obligatorio. Firefox OS no arrancará sin estas características de seguridad.

Compilar e instalar

¿Recuerdas el archivo .config creado anteriormente? Ahora necesitamos reemplazar cm-porting con el nombre clave de tu dispositivo.

$ grep -r PRODUCT_NAME device/oem/123

Nota: No uses el valor en cm.mk, usa el que está en device.mk, este debería ser algo como full_123. Puedes hacer el reemplazo manualmente o con sed:

$ sed -i "s/cm-porting/full_123/g" .config

Ahora es momento de comenzar la compilación:

$ ./bldcm.sh

Esto tomará, en todo caso, de 30 minutos a un par de horas dependiendo de tu PC, así que podría ser un buen momento para ir a la tienda y preparar algo de comer, o ayudar en las tareas de la casa.

Instalar Firefox OS a través de fastboot

Si tu dispositivo soporta fastboot, puedes simplemente mandar las imágenes de partición directamente al dispositivo:

cd out/target/product/123/
fastboot flash boot boot.img
fastboot flash recovery recovery.img
fastboot flash system system.img
fastboot flash userdata userdata.img

Instalar Firefox OS através del recovery

Si tu dispositivo no soporta fastboot entonces puedes usar update.zip en su lugar. Este puede ser inicializado por el dispositivo a través de adb sideload. Una vez allí, deberás mandar el archivo .zip:

adb sideload out/target/product/123/fota/fullimg/update.zip

Solución de problemas

¿Algo no funciona? ¡Es momento de remangarse la camisa!

Lo primero que debes hacer es determinar si la característica está funcionando en CyanogenMod. Puede que simplemente falte  alguna configuración para Firefox OS.

Si la característica no funciona en CyanogenMod entonces significa que debes implementarla para tu 'port'. Sería bueno si también presionas tu revisión yendo atrás en el código.

Cámara

Algunas partes de Android fueron removidas del proceso de compilación por ser innecesarias. Si tu cámara  arrojaburbujas de queja sobre la pérdida de funciones, verifica los marcos o la base para ver si las funciones fueron removidas. Podría ser posible traerlas de vuelta.

WiFi

El dispositivo podría no ver ciertos Puntos de Acceso si no están en un canal oficial. Este parecería ser un problema de CyanogenMod o incluso de AOSP, ya que este afecta distintos tipos de hardware y diferentes OEMs.

Etiquetas y colaboradores del documento

 Colaboradores en esta página: diegomez, chrisdavidmills, Penserbjorne
 Última actualización por: diegomez,