Портирование Firefox OS

Firefox OS (также Boot to Gecko) использует ядро выделенное из Android с пользовательским интерфейсом, основанным на Gecko, поверх него. Данная статья является руководством по портированию ОС на новые устройства.

Данное руководство предполагает, что вы портируете на Android устройство; если вы портируйте на другое устройство, работа будет сложнее.

Подготовка системы сборки

Первым делом необходимо настроить систему сборки; как это сделать написано в этом руководстве Firefox OS build prerequisites.

Создание резервной копии существующей системы Android

Далее вы должны сделать резервную копию вашего Android устройства, прежде чем информация удалится тестовыми сборками B2G. Кроме того, некоторые части оригинальной системы потребуются в процессе сборки и установки. При выборе имени идентификатора устройства (device id name) мы рекомендуем использовать '_' вместо '-'.

mkdir my_device_backup
cd my_device_backup
adb pull /system system

Клонирование B2G репозитария

Первым делом необходимо склонировать репозитарии B2G, а так же хранилище манифестов.

git clone https://github.com/mozilla-b2g/B2G.git
git clone https://github.com/mozilla-b2g/b2g-manifest.git

Добавление нового устройства в config.sh

Далее нужно добавить новое устройство в config.sh в репозитарии B2G. Вы можете воспользоваться существующими в качестве шаблона. В основном это сводится к обеспечению инструкций для выборки правильных файлов для сборки. (This basically involves providing the instructions for fetching the correct files to do the build.)

Создание манифеста для нового устройства

Вам необходимо добавить файл манифеста для нового устройства. Опирайтесь на существующий в качестве шаблона. Вы можете использовать hamachi в качестве справки. Когда закончите, можете добавить и прикоммитить ваш новый манифест к вашему локальному b2g-manifest репозитарию.

git add my-new-device.xml
git commit

Затем вам понадобится файл config.sh чтобы использовать ваш локальный b2g-manifest репозитарий вместо оффициального. Чтобы это сделать укажите путь к вашему локальному хранилищу и соответствующую ветку в переменных GITREPO и BRANCH в файле config.sh, например:

GITREPO=${GITREPO:-"file:///home/yourname/b2g-manifest"}
BRANCH=${BRANCH:-master}

Создание дерева конфигурации нового устройства

Создание нового дерева конфигурации для нового устройства. Оно должно находится в дирректории device/<manufacturer>/<device_id>. И включать в себя как минимум:

  • AndroidBoard.mk
  • AndroidProducts.mk
  • BoardConfig.mk
  • extract-files.sh
  • full_<device_id>.mk
  • idc files for touchscreen
  • init files (init.rc, init.<target>.rc, uevent.rc, ...)

Содержимое списока может сильно меняться от устроства к устроству. В частности BoardConfig.mk и extract-files.sh могут существенно отличаться. Эта часть требует много усилий по аддаптации, тестированию и дебагу, чтобы выяснить какие бинарные части (binary blobs) необходимо извлечь. Чтобы получить более полное представление о том что должно находится здесь, взгляните на конфигурацию устройства hamachi. Не забывайте составлять вашу конфигурацию в соотвествии с манифестом устройства, который вы создали.

Note: Если вам удастся найти справку по CyanogenMod для вашего устройства, это ускорит процесс портирования. Форум XDA также хорошее место для обсуждения и поиска ресурсов.

Пересборка boot.img

После того как все сделано вам потребуется пересобрать загрузочный образ. Как правило это нужно не для самого ядра, а для принятия правок в init.rc.

Изменения в init.rc

init.rc который вы используйте не поставляется с B2G, поэтому вам следует извлечь его из устройства.

Основные вещи которые вам нужно исправить:

Импорт init.b2g.rc

Добавьте следующий код, чтобы импортировать init.b2g.rc:

on early-init
    start ueventd
    import /init.b2g.rc

Исправление прав доступа

Исправьте права доступа к файлам /system/b2g/b2g, /system/b2g/updater, /system/b2g/plugin-container; это должно быть сделано после строк, которые монтируют файловую систему в режим read/write:

chmod 0755 /system/b2g/b2g
chmod 0755 /system/b2g/updater
chmod 0755 /system/b2g/plugin-container

Вы можете начать с правки init.rc, извлеченного из устройства, вместо использования init.rc включенного в систему сборки. Если так, важно не забыть задать TARGET_PROVIDES_INIT_RC в BoardConfig.mk.

Пре-собранное ядро vs. сборка ядра из исходников

Вы можете воспользоваться пре-собранным ядром или собрать ядро из исходников. Чтобы собрать ядро из исходников добавьте AndroidKernel.mk и конфиг ядра в дерево конфигурации.

В качестве примера использующего сборку ядра из исходников сотри maguro из старой системы сборки.

Извлечение и правка существующего загрузочного образа

Существует возможность восстановить загрузочный образ телефона сделав дамп содержимого устройств /dev/mtd/mtd1 или /dev/mtd/mtd2, полученный файл образа может быть легко восстановлен:

adb shell 'cat /dev/mtd/mtd1 > /sdcard/boot.img'
adb pull /sdcard/boot.img

После извлечения файл загрузочного образа можно распаковать вспомогательной утилитой unmkbootimg. Утилита извлечет образ ядра (zImage) и ramdisk (initramfs.cpio.gz), а также распечатает команды пересобирающие образ с теми же параметрами, что и оригинальный, например:

$ unmkbootimg boot.img 
Kernel size 3872576
Kernel address 0x208000
Ramdisk size 265102
Ramdisk address 0x1500000
Secondary size 0
Secondary address 0x1100000
Kernel tags address 0x200100
Flash page size 2048
Board name is ""
Command line "androidboot.hardware=aphone"
Extracting kernel to file zImage ...
Extracting root filesystem to file initramfs.cpio.gz ...
All done.
---------------
To recompile this image, use:
  mkbootimg --kernel zImage --ramdisk initramfs.cpio.gz --base 0x200000 --cmdline 'androidboot.hardware=aphone' -o new_boot.img
---------------

Чтобы модифицировать файл виртуального диска, создайте директорию и распакуйте его туда:

mkdir initramfs_dir
cd initramfs_dir
gunzip -c ../initramfs.cpio.gz | cpio -i

Сделайте все необходимые изменения (например в init.rc) и перепакуйте виртуальный диск используя mkbootfs, убедитесь, что используйте версию собранную с хост утилитами B2G:

/path/to/your/B2G/out/host/linux-x86/bin/mkbootfs . | gzip > ../newinitramfs.cpio.gz

В завершении вернитесь в корнево каталог и перепакуйте загрузочный образ используя mkbootimg, также убедитесь, что используйте версию собранную с хост утилитами B2G:

/path/to/your/B2G/out/host/linux-x86/bin/mkbootimg --kernel zImage --ramdisk newinitramfs.cpio.gz --base 0x200000 --cmdline 'androidboot.hardware=aphone' -o newboot.img

Теперь, если скопировать новый загрузочный образ в out/target/product/$DEVICE/boot.img (где $DEVICE имя вашего устройства) он автоматический прошиваться при выполнении flash.sh. Вы также можете прошить образ вручную, используя следующие команды:

adb reboot bootloader
fastboot flash boot newboot.img
fastboot reboot

Добавление нового устройства в flash.sh

Добавление нового устройства в flash.sh; специфика того как это сделать зависит от того какие утилиты должны быть использованы для прошивки нового устройства.

Конфигурация, сборка, и прошивка нового устройства

Теперь вы можете попробовать собрать прошивку и прошить ваше новое устройство:

ANDROIDFS_DIR=my_device_backup ./config.sh <device_id> '../b2g-manifest/default.xml'
./build.sh
./flash.sh

Тест и дебаг

We need some details added here; indeed, this entire article could use some help.

FAQ

Forthcoming

See also

Метки документа и участники

 Внесли вклад в эту страницу: chrisdavidmills, Vusluk, Biostasis
 Обновлялась последний раз: chrisdavidmills,