Программирование под Maemo и MeeGo для начинающих

Введение

В данной статье будет дано введение в разработку приложений для платформ Maemo и MeeGo. Начиная с самых азов, установки и настройки вспомогательного программного обеспечения, и заканчивая отладкой и развертыванием приложения. Мы создадим простое приложение, выполняющее основные операции над числами (калькулятор), данное приложенное довольно простое и имеет множество способов реализации, а мы рассмотрим пример нестандартного решения представленный в книге [7].


Maemo

Maemo — базирующаяся на Debian Linux платформа для портативных устройств. Используется в интернет-планшетах Nokia 770, Nokia N800, N810 и коммуникаторе Nokia N900. В основе Maemo лежат компоненты среды GNOME, в том числе графическая библиотека gtk. Большая часть кода Maemo открыта, и послужила основой для создания Ubuntu Mobile. Существует множество приложений для платформы Maemo, почти все они бесплатные и свободные. Платформа включает в себя ОС Maemo и Maemo SDK.



Maemo основана в основном на открытом коде и разработана Nokia Maemo Devices в сотрудничестве со многими проектами с открытым кодом, такими как ядро Linux, Debian и GNOME. Maemo основана на Debian GNU/Linux и отрисовывает большую часть своего графического интерфейса, систем и библиотек с помощью GNOME. Он использует менеджер окон Matchbox и Hildon в качестве графического интерфейса и инструмента приложения.



Пользовательский интерфейс в Maemo 4 похож на многие портативные интерфейсы и функцией «домашнего» экрана, который действует как центральная точка, из которой доступны все приложения и настройки. Главный экран разделен на районы запуска приложений, меню, и большой настраиваемой области, которая отображать информацию, такую как RSS-поток, интернет-радио проигрыватель и окно поиска Google.



Maemo 5 UI немного отличается: меню и информационная область находиться в верхней части дисплея, а также четыре настраиваемых настольных компьютеров со своими ярлыками и виджетами.


MeeGo

MeeGo — открытая платформа, анонсирована корпорациями Intel и Nokia на мобильном конгрессе в Барселоне, которая станет гибридом мобильных систем Moblin (Mobile Linux) и Maemo. Первая версия (1.0) MeeGo появилась 26 мая 2010 года, а устройства на базе ОС — появятся до конца 2010 года.



MeeGo предназначена для работы на широком спектре устройств, включая смартфоны, планшеты и нетбуки. Это позволит создавать приложения, которые без адаптации будут работать сразу на нескольких видах устройств. Магазином приложений для MeeGo станет принадлежащий Nokia Ovi Store.



MeeGo — независимая операционная система, которая, однако, использует наработки таких проектов, как Maemo, Moblin, Fedora и Debian.



Система MeeGo является полностью открытой, её исходные коды опубликованы. Intel и Nokia заявили, что все компании-производители аппаратного обеспечения получат равный доступ к MeeGo.



MeeGo будет сосуществовать с платформой Symbian, которая сейчас используется для смартфонов. Новая ОС, возможно, будет устанавливаться в лидирующие модели мобильных телефонов. В частности, она может быть установлена на смартфон Nokia N900.


Начинаем программировать под Maemo

Прежде чем начать процесс, нам необходимо установить некоторое вспомогательное программное обеспечение, а именно сам эмулятор и кроссплатформенную среду Scratchbox. Подробное описание установки среды Scratchbox и Maemo SDK рассмотрено на вики-странице [1].



Теперь давайте рассмотрим, как запустить эмулятор платформы Maemo. Весь процесс состоит из следующих пунктов.


Запуск эмулятора платформы Maemo
  1. Запустить эмулятор не под Scratchbox:
  2. $ Xephyr :2 -host-cursor -screen 800x480x16 -dpi 96 -ac &

  3. Запустить Scratchbox:
  4. $ /scratchbox/login

  5. Так как в FREMANTLE_ARMEL эмулятор не запускается, необходимо перейти на FREMANTLE_X86, для этого выполняем следующую команду:
  6. $ sb-conf select FREMANTLE_X86

  7. Если появляется ошибка, необходимо завершить все предыдущие процессы командой:
  8. $ sb-conf killall –signal=9

  9. Загружается FREMANTLE_ARMEL, выполняем следующие команды:
  10. $ export DISPLAY=:2

    $ af-sb-init.sh start

  11. Запускается платформа Maemo в эмуляторе Xephyr.
Создание приложения под Maemo

Создаем пустой проект для приложения в Qt Creator'е. Весь код приложение размещается в трех файлах main.cpp, calculator.cpp и calculator.h, добавляем файлы к проекту.



calculator.h

#include <QWidget> 
#include <QStack> 
#include <QGridLayout> 
#include <QLCDNumber> 
#include <QPushButton> 

class Calculator : public QWidget 
{ 
    Q_OBJECT 

public: 
    Calculator(QWidget *parent = 0); 
    QPushButton* createButton(const QString& str); 
    void calculate(); 

private: 
    QLCDNumber* lcdDisplay; 
    QStack<QString> stk; 
    QString strDisplay; 

public slots: 
    void slotButtonClicked(); 
}; 





calculator.cpp

#include "calculator.h" 

Calculator::Calculator(QWidget *parent) : QWidget(parent) 
{ 
    lcdDisplay = new QLCDNumber(12); 
    lcdDisplay->setSegmentStyle(QLCDNumber::Flat); 
    lcdDisplay->setMinimumSize(150, 50); 

    QChar aButtons[4][4] = 	{{'7', '8', '9', '/'}, 
                            	{'4', '5', '6', '*'}, 
                                {'1', '2', '3', '-'}, 
                                {'0', '.', '=', '+'}}; 

    QGridLayout *ptopLayout = new QGridLayout; 
    ptopLayout->addWidget(lcdDisplay, 0, 0, 1, 4); 
    ptopLayout->addWidget(createButton("CE"), 1, 3); 

    for (int i = 0; i < 4; ++i) 
        for (int j = 0; j < 4; ++j) 
            ptopLayout->addWidget(createButton(aButtons[i][j]), i + 2, j); 

    setLayout(ptopLayout); 
} 

QPushButton* Calculator::createButton(const QString &str) 
{ 
    QPushButton *pcmd = new QPushButton(str); 
    pcmd->setMinimumSize(40, 40); 
    connect(pcmd, SIGNAL(clicked()), SLOT(slotButtonClicked())); 
    return pcmd; 
} 

void Calculator::calculate() 
{ 
    double dOperand2        = stk.pop().toDouble(); 
    QString strOperation    = stk.pop(); 
    double dOperand1        = stk.pop().toDouble(); 
    double dResult          = 0; 

    if (strOperation == "+") { 
        dResult = dOperand1 + dOperand2; 
    } 
    if (strOperation == "-") { 
        dResult = dOperand1 - dOperand2; 
    } 
    if (strOperation == "/" && dOperand2 != 0) { 
        dResult = dOperand1 / dOperand2; 
    } 
    if (strOperation == "*") { 
        dResult = dOperand1 * dOperand2; 
    } 

    lcdDisplay->display(dResult); 
} 

void Calculator::slotButtonClicked() 
{ 
    QString str = ((QPushButton*)sender())->text();

    if (str == "CE") { 
        stk.clear(); 
        strDisplay = ""; 
        lcdDisplay->display("0"); 
        return; 
    } 
    if (str.contains(QRegExp("[0-9]"))) { 
        strDisplay += str; 
        lcdDisplay->display(strDisplay.toDouble()); 
    } 
    else if (str == ".") { 
        strDisplay += str; 
        lcdDisplay->display(strDisplay); 
    } 
    else { 
        if (stk.count() >= 2) { 
           stk.push(QString().setNum(lcdDisplay->value()));
           calculate(); 
           stk.clear(); 
           stk.push(QString().setNum(lcdDisplay->value()));
           if (str != "=")
               stk.push(str); 
        } 
        else { 
            stk.push(QString().setNum(lcdDisplay->value())); 
            stk.push(str); 
            strDisplay = ""; 
            lcdDisplay->display("0"); 
        } 
    } 
}





main.cpp

#include <QApplication> 
#include "calculator.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    Calculator calculator; 

    calculator.setWindowTitle("Calculator"); 
    calculator.resize(230, 200); 
    calculator.show(); 

    return app.exec(); 
}




Запуск проекта на эмуляторе



Запуск приложения на эмуляторе Xephyr состоит из нескольких шагов:

  1. Скопировать файлы create-qtc-project-file.sh и qtcreator-project.template в корень проекта. Файлы находятся в архиве sbox-utils.tar.gz (скачать, http://dl.yarlug.org/devel/Maemo/sbox-utils.tar.gz)
  2. Запускаем скрипт create-qtc-project-file.sh под scratchbox (X86). В результате будет создан файл имя_проекта.pro.user
  3. Запускаем эмулятор Xephyr и собственно сам Maemo.
  4. Собираем проект и получаем бинарник.
  5. С помощью специального скрипта для запуска Maemo приложений run-standalone.sh запускаем приложение под scratchbox'ом:
  6. $ ./run-standalone.sh ./Name_of_Project



Запущенное приложение под платформой Maemo показано на Рис. 1.



Рис. 1. Maemo калькулятор


Заключение

Разработка приложения для платформы Maemo не отличается от разработки для настольных систем, все благодаря кросс-платформенности Qt. Все отличие заключается в тестировании, отладке и развертывании приложения, а также использования специальных библиотек. Так как во время разработки приложения под рукой может не оказаться реального устройства, для этих целей были разработаны специальные эмуляторы и среды для тестирования и развертывания разрабатываемого приложения.


Начинаем программировать под MeeGo



Первым шагом при знакомстве с данной платформой и особенно разработкой для нее необходимо установить вспомогательное программное обеспечение, а именно Qt 4.7 SDK, Qt Creator, MeeGo Touch Framework (MTF).

Установка MeeGo Touch 1.0 вручную на Ubuntu 10.04
  1. Для MeeGo Touch необходим Qt версии 4.7, если все ещё не установлен, устанавливаем (скачать: qt.nokia.com/downloads).
  2. Прописать переменные среды:
  3. $ export QTDIR=/[path to installed qtsdk]/qt/
  4. $ export PATH=${QTDIR}/bin:${PATH}
  5. Скачать и установить Touch Theme (для запуска приложений на настольной машине):
    1. Клонируем из хранилища:
    2. $ git clone git:gitorious.org/meegotouch/meegotouch-theme.git — Собираем: $ qmake — Устанавливаем:$ sudo make install — Установить необходимые пакеты: $ sudo apt-get install build-essential libgl1-mesa-dev libglu1-mesa-dev libxdamage-dev — Скачать и установить MeeGo Touch: — Клонируем из хранилища: $ git clone git:gitorious.org/meegotouch/libmeegotouch.git

    3. Конфигурируем, собираем и устанавливаем:
    4. $ ./configure && make && sudo make install

Возможные проблемы: При сборке возникли ошибки в следующих местах:

../libmeegotouch/src/corelib/scene/msceneeventeater.cpp
39:	setFlag(QGraphicsItem::ItemStopsClickFocusPropagation);
../libmeegotouch/src/corelib/widgets/mscenewindow.cpp
105:	setFlag(QGraphicsItem::ItemStopsClickFocusPropagation);
121 :	setFlag(QGraphicsItem::ItemStopsClickFocusPropagation);
../libmeegotouch/src/views/mlabelview_simplce.cpp
244:	staticText.setTextOption(viewPrivate->textOptions);
370:	staticText2.setTextOption(staticText.textOption());





Первая ошибка заключалось, в том, что свойство ItemStopsClickFocusPropagation не является членом класса QGraphicsItem и вторая похожая ошибка. Я просто закомментировал эти строки на время.



Процесс работы над расширением функционала и отлавливание ошибок не останавливается не на минуту, и соответственно в следующих версиях MTF все ошибки будут исправлены и добавлены новые :)


Установка MeeGo Touch 1.1 из репозитория Ubuntu 10.04
  1. Настраиваем менеджер пакетов:
    1. Добавить следующую строчку в /etc/apt/sources.list.d/meego-sdk.list
    2. deb http://repo.meego.com/MeeGo/sdk/host/repos/ubuntu/10.04/ /

    3. Добавить ключ репозитория:
    4. $ gpg –keyserver pgpkeys.mit.edu –recv 0BC7BEC479FC1F8A

      $ gpg –export –armor 0BC7BEC479FC1F8A | sudo apt-key add -

    5. Обновить базу данных менеджера пакетов: $ sudo apt-get update
    6. Чтобы проверить, что MeeGo репозиторий был корректно добавлен, запустите следующую команду. Будут выведены детали от пакете MADDE.
    7. $ apt-cache policy madde

  2. Установить MeeGo SDK:
  3. $ sudo apt-get install meego-sdk
  4. Установить MeeGo объект:
    1. Создать MeeGo обьект, используя MADDE (обьекты: ARM (N900): meego-core-armv7l-1.1; Aava: meego-handset-ia32-1.1, meego-netbook-ia32-1.1):
    2. $ sudo mad-admin create -f <target>
    3. Чтобы проверить, что объекты были установлен корректно, выполните следующие команды:
    4. $ mad -t <target> pscreate -t qt-simple qthello 
      	$ cd qthello 
      	mad -t <target> qmake 
      	mad -t <target> make
    5. Проверяем, что приложение qt-simple создан для правильного объекта, выполним:
    6. $ file build/qthello

За более подробной информацией по установке MeeGo Touch 1.1 обращаемся к ресурсу [2].


Запуск Meego-Handset [Netbook] edition на эмуляторе Xephyr
  1. Скачать образ Meego handset edition или netbook edition и разархивируем его:
  2. $ wget http://download3.meego.com/meego-handset-sdk-20101012-1.1.80.20101024.1603-sda.raw.tar.bz2 

    или

    $ wget http://download3.meego.com/meego-netbook-sdk-20101012-1.1.80.20101024.1603-sda.raw.tar.bz2 
    $ tar xjvf http://download3.meego.com/meego-handset-sdk-20101012-1.1.80.20101024.1603-sda.raw.tar.bz2 

    Примечание: MeeGo сборки появляются ежедневно, их можно скачать с [6].

  3. Скачать meego-sdk-chroot скрипт:
  4. $ wget http://download3.meego.com/meego-sdk-chroot Сделать скрипт исполняемым: $ chmod +x ./meego-sdk-chroot

  5. Настроить Х для запуска Xephyr:
  6. $ xhost +SI:localuser:<user name>
  7. Смонтировать образ MeeGo в директорию и запустить meego-sdk-chroot скрипт:
  8. $ sudo mkdir ../[name_of_mount_directory]
    	$ sudo mount -o loop,offset=512 ./[meego_handset_raw] 
    	$ ../[name_of_mount_directory]
    	$ sudo ./meego-sdk-chroot ../[name_of_mount_directory] 

    Теперь мы находимся в оболочке meego chroot. Замечание: Для отмонтирования образа используем команду: $ sudo umount ../[name_of_mount_directory]

  9. Запускаем MeeGo:
  10. $ export DISPLAY=:0; устанавливаем переменную среды $ zypper install meego-simulator-launcher-handset ; только для meego-handset $ startmeego &



При выполнении последней команды произойдет запуск оболочки MeeGo-Handset. Исходя от смонтированного образа (Handset или Netbook) у вас запуститься тот или иной образ.



MeeGo Handset на Xephyr



Рис. 2. MeeGo-Handset UI



MeeGo Netbook на Xephyr




Рис. 3. MeeGo-Netbook UI



Давайте запустим наш ранее разработанный калькулятор для платформы Maemo на MeeGo-Handset и MeeGo-Netbook.

Запуск калькулятора на MeeGo-Netbook
  1. Запускаем MeeGo-Netbook на эмуляторе, как было показано выше.
  2. Монтируем директорию с проектом, для этого проделаем следующие шаги:
  • Создаем директорию в MeeGo-Handset:
  • $ sudo mkdir [meego_netbook_mount_dir]/home/meego/code

  • Монтируем директорию с исходниками калькулятора:
  • $ sudo mount –bind [calculator_sources]/ [meego_netbook_mount_dir]/home/meego/code Примечание: Выполняем данную команду в стандартной командной оболочке (bash).

  • Заходим в примонтированную директорию и запускаем калькулятор:
  • $ cd home/meego/code/calculator

    $ DISPLAY=:2 ./calculator

    Примечание:
    Выполняем данную команду в командной оболочке meego (meego chroot).



    Запушенный калькулятор на MeeGo-Netbook показан на Рис. 4.



    Рис. 4. MeeGo-Netbook калькулятор



    Теперь давайте запустим калькулятор на MeeGo-Handset. Для запуска приложения необходимо проделать все те же самые шаги, что и для MeeGo-Netbook, но только запустить сборку MeeGo-Handset. Запушенный калькулятор на MeeGo-Handset показан на Рис. 5.



    Рис. 5. MeeGo-Handset калькулятор

    Как видно на Рис. 5, калькулятор выглядит не совсем, так как мы ожидали. Давайте разберемся, в чем же проблема. А проблема в то, что для MeeGo-Handset приложения разрабатываются с помощью специального набора инструментов, а именно MeeGo Touch Framework (MTF, libmeegotouch). Давайте посмотрим, как это делается.


    Изменение приложения для MeeGo-Handset

    MeeGo Touch (libmeegotouch) это инструмент разработки приложений для мобильных устройств с сенсорными экранами, основанный на Qt. Он входит в состав MeeGo Platform API. Предоставляет все необходимые строительные блоки для создания собственных приложений, которые следуют MeeGo Handset UX принципам. Инструмент построен на основе Qt Graphics View Framework.



    В Qt Creator создаем проект “Empty Project”, добавляем файлы main.cpp, calculator.cpp и calculator.h калькулятора. В файле проекта необходимо указать следующие строки для установленного MeeGo Touch (MTF 1.0):

    CONFIG += meegotouch
    INCLUDEPATH += /usr/local/include/meegotouch
    LIBS        += /usr/local/lib/libmeegotouchcore.so \
                   /usr/local/lib/libmeegotouchsettings.so \
                   /usr/local/lib/libmeegotouchviews.so \
                   /usr/local/lib/libmeegotouchextensions.so



    После этого мы можем приступать к изменению программы для использования его на MeeGo.


    Изменения, связанные с MTF

    main.cpp

    #include <MApplication>
    #include <MApplicationWindow>
    #include <MApplicationPage>
    #include "calculator.h"
    
    int main(int argc, char **argv)
    {
         MApplication app(argc,argv);
         MApplicationWindow window;
         MApplicationPage page;
         Calculator *calc = new Calculator();
    
         page.setTitle("Calculator");
         page.setCentralWidget(calc);
         page.appear(&window);
    
         window.show();
    
         return app.exec();
    }



    Давайте посмотрим на изменения, которые затронули main.cpp:

    1. Все заголовочные файлы начинаются с заглавное буквы “М”.
    2. Так как MeeGo Touch основан на Qt в нем могут применяться основные системные классы и функции, главные изменения затронули графическую составляющую инструмента, а именно виджеты, окна и т.д.
    3. MApplication имеет схожее применение, что и в Qt.
    4. MApplicationWindow обеспечивает основу для построения пользовательского интерфейса, предоставляет навигационную панель общую для всех приложений, которая включает в себя домашнюю кнопку и кнопку закрытия, панель инструментов (в альбомной ориентации), а также меню приложения. Т.е данный класс отвечает за то, что связанно с главным окном приложения, которое содержит все остальные элементы.
    5. MApplicationPage также является инструментом для построения пользовательского интерфейса приложения. По умолчанию страница создает для горизонтально просмотра, где пользователь может размещать свои компоненты с помощью методов centralWidget() или setCentralWidget(MWidget *) (в MTF 1.0, setCentralWidget(QGraphicsWidget *)). Страницы отображаются на экране с помощью метода appear(QGraphicsScene*, DeletionPolicy) или appear(MWindow *, DeletionPolicy). Вызов метода appear() запускает показ анимации связанной со страницей. Если вы хотите показать страницу мгновенно, обратитесь к MSceneManager API.



    За подробностями обращайтесь к документации по Platfrom API [4].

    calculator.h

    #include <QStack>
    #include <MGridLayoutPolicy>	// класс, отвечающий за сеточную компоновку
    #include <MButton>		// класс кнопки
    #include <MLayout>		// главный класс компоновки
    #include <MTextEdit>		// класс текстового поля
    #include <QGraphicsWidget>	// главный класс для всех виджетов сцены (поверхности)
    
    class Calculator : public QGraphicsWidget
    {
        Q_OBJECT
    
    public:
        Calculator(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
        MButton* createButton(const QString& str);
        ...
        ...
    private:
        MTextEdit *lcdDisplay;
        QStack<QString> stack;
        QString strDisplay;
        ...
        ...
    };



    Чтобы добавить виджет Calculator на страницу приложения с помощью метода setCentralWidget() его необходимо унаследовать от класса QGraphicsWidget. В MTF 1.1 функция установки центрального виджета страницы setCentralWidget() принимает в качестве устанавливаемого компонента MWidget.



    calculator.cpp

    #include "calculator.h"
    
    Calculator::Calculator(QGraphicsItem *parent, Qt::WindowFlags wFlags) :
        QGraphicsWidget(parent, wFlags)
    {
        lcdDisplay = new MTextEdit();
        lcdDisplay->setReadOnly(true);
        lcdDisplay->setMinimumSize(150, 50);
        
        ...
        
        MLayout *layout = new MLayout;
        MGridLayoutPolicy *ptopLayout = new MGridLayoutPolicy(layout);
        ptopLayout->addItem(lcdDisplay, 0, 0, 1, 4);
        ptopLayout->addItem(createButton("CE"), 1, 3);
    
        for (int i = 0; i < 4; ++i)
            for (int j = 0; j < 4; ++j)
                ptopLayout->addItem(createButton(aButtons[i][j]), i + 2, j);
    
        layout->setPolicy(ptopLayout);
        setLayout(layout);
    }
    ...
    ...
    ...



    Это в основном главные изменения, которые коснулись приложения при переносе на MeeGo-Handset. Есть некоторые изменения связанные с отображением результата вычислений с помощью QLCDNumber, т.к данного класса в MTF 1.0 не оказалось, пришлось его заменить на MTextEdit.



    Результат изменений представлен на Рис. 6.



    Рис. 6. MeeGo-Handset калькулятор



    Как видно из представленных изменений, перенос приложения для MeeGo-Handset не составляет особого труда. Со временем MTF будет только набирать функциональность и мощь, что даст разработчикам более широкий простор для маневра и более современных и качественных приложений.


    Заключение

    Maemo – устоявшаяся платформа, которая имеет свою аудиторию и сообщество разработчиков. Содержит, как свои преимущества, так и недостатки, которые привлекают или отталкивают разработчиков. Главная особенность это открытость платформы, но некоторые компоненты являются проприетарными. Основным двигателем является компания Nokia, которая двигает свои идеи и прислушивается к мнению сообщества.



    MeeGo является совместной разработкой компаний Nokia и Intel, которая только начинает набирать обороты и завоевывать рынок. Данная платформа основана на Maemo и Moblin, и вобрала в себя все преимущества этих платформ и приобрела собственные.



    Обе платформы развиваются и будут широко использоваться в ближайшем будущем. Основной акцент смешается к платформе MeeGo, которая может использоваться на многом количестве устройств, начиная мобильными устройствами и заканчивая телевизорами. Maemo используется на hi-end мобильных устройствах Nokia и хорошо закрепилась на своем месте.


    Список литературы

    1. Установка Scratchbox и Maemo SDK: http://osll.spb.ru/wiki/maemo/_scratchbox_install_
    2. Установка и настройка MeeGo SDK:http://wiki.meego.com/SDK/Docs/1.1/Getting_started_with_the_MeeGo_SDK_for_Linux.
    3. Запуск MeeGo на эмуляторе Xephyr: http://wiki.meego.com/MeeGo_SDK_with_Xephyr
    4. Platform API: http://apidocs.meego.com/1.1/platform/html/index.html
    5. MeeGo API 1.1:http://apidocs.meego.com/1.1/core/html/index.html
    6. Сборки MeeGo: http://repo.meego.com/MeeGo/builds/
    7. Шлее М. – Qt 4.5. Профессиональное программирование на С++. – СПБ.: БХВ-Петербург, 2010г., 896с.
    8. Hello World for MeeGo-Handset: http://wiki.meego.com/SDK/Docs/1.1/Creating_Hello_World, http://blog.telaic.pl/?p=63.
    9. Обзор Maemo, MeeGo: http://ru.wikipedia.org/wiki/Maemo, http://ru.wikipedia.org/wiki/MeeGo



    Kirill Yudenok / OSLL