Maemo SDK: vyvíjíme pro mobilní Linux

26. 11. 2009
Doba čtení: 8 minut

Sdílet

V nejbližších dnech uvede Nokia na trh zařízení N900. Jde o první smartphone s plnohodnotným operačním systémem Linux. Podrobné recenze přístroje i systému se brzy dočkáme i zde na Rootu. Dnes si ale ukážeme, jak nainstalovat vývojové prostředí Maemo SDK a jak začít s vývojem aplikací pro tento telefon.

V první řadě je potřeba zdůraznit, že Maemo verze 5 (Fremantle), která je použita v N900, je opravdový plnohodnotný Linux – je postavený na Debianu a jeho GUI používá knihovnu GTK+ (Qt je zatím „community supported“, od další verze by měly být v Maemo oficiálně podporované Qt knihovny). Aplikace pro tento telefon lze tedy vyvíjet stejně jako pro běžné linuxové distribuce s Xorg/GTK+/Qt. Můžete je psát v C, v Javě, v Pythonu, v Ruby, můžete použít Mono – možnosti vývoje jsou opravdu široké.

Maemo není nějaká novinka, kterou by Nokia nahonem vytáhla z rukávu jako reakci na Android či iPhone – první verze Maema, zvaná OS2005, byla dodávána s tablety Nokia 770 před čtyřmi lety a systém od té doby rozhodně nestagnoval. Nokia se netají záměrem přesunout Symbian do nižších kategorií svých mobilních telefonů a na highend a vyšší střední třídu nasadit právě Maemo. Konzistentním krokem z tohoto pohledu je i akvizice Trolltechu Nokií před dvěma lety. N900 je tak první vlaštovkou, za níž budou následovat další stroje, a lze se oprávněně domnívat, že do budoucna bude počet i dostupnost zařízení s OS Maemo růst.

Instalace SDK

Pro vývoj aplikací na platformě Maemo je možno použít, jak jsme si již řekli, v podstatě stejné nástroje jako pro vývoj běžných linuxových aplikací. Je však třeba počítat se zásadní odlišností danou procesorem: V N900 je použit procesor ARM (Cortex A8), který není na úrovni binárních souborů s architekturou x86 kompatibilní. Budeme tedy potřebovat crosscompiler pro tuto platformu. Naštěstí Nokia dodává pro vývoj slušný SDK (Software Development Kit). V dalším textu si ukážeme, jak jej nainstalovat.

Maemo SDK

Pokud chceme instalovat SDK, máme v zásadě dvě možnosti. SDK je postaveno na balíku Scratchbox. Scratchbox je křížový překladač (cross-compilation toolkit), a právě ten se postará o to, že můžeme jednoduše vytvářet z jednoho zdrojového kódu binární obrazy pro x86 i pro ARM. Scratchbox je určený pro distribuce založené na Debianu, takže uživatelé těchto distribucí (např. *buntu) mohou nainstalovat vše přímo do svého systému. Pokud z jakéhokoli důvodu chceme nebo musíme mít SDK pro Maemo oddělené, není problém rozeběhnout vše ve virtualizačním nástroji. Nokia dokonce nabízí obraz pro VMWare Player / VirtualBox, v němž je nainstalováno „čisté Ubuntu“ a připravené nástroje pro stažení a instalaci potřebných knihoven.

Pro počáteční testování je vhodnější mít SDK oddělené, proto si zvolíme cestu virtuálního PC. Chcete-li přesto zkusit vše rovnou a „naostro“, můžete, na webu Maemo je k dispozici podrobný popis instalace. Můžeme si vybrat, zda využijeme GUI instalátor nebo zda si SDK nainstalujeme pěkně ručně pomocí apt-get. Instalace není pro zkušeného uživatele nijak obtížná ani složitá, jen je potřeba dodržet přesně postup.

Na tomto místě je třeba upozornit, že v určitém bodě instalace po nás bude postup vyžadovat souhlas s EULA. Tento souhlas není pouhou formalitou – teprve po vyjádření souhlasu (je nutné vyplnit i CAPTCHA kód) obdržíme zdrojovou adresu k repository pro samotný Nokia SDK. Tuto adresu je třeba (podle postupu) zapsat do /etc/apt/sources.list ve Scratchpadu či do souboru, který vám sdělí instalační skript.

Pojďme si tedy ukázat postup instalace vývojového prostředí pro N900 ve virtuálním stroji. Budeme potřebovat virtualizační software, který dokáže pracovat se soubory vmd / vhc (VMware). Já jsem zvolil opensource VirtualBox.

Nejprve si ze stránek Maemo stáhneme patřičný virtuální obraz. Po stažení, rozbalení na patřičné místo a spuštění ve virtualizačním SW naběhne virtuální PC s nainstalovaným Ubuntu. Tato instalace neobsahuje však přímo SDK, pouze skripty k jeho stažení a instalaci. Naleznete je přímo na ploše ve složce s názvem „Installation“.

Při instalaci v prostředí VirtualBoxu jsem se setkal s tím, že skripty po spuštění přímo z GUI hlásily, že „síť není dostupná“. Po spuštění z terminálu (jsou v „~/Maemo_Insta­ll/Scripts/In­stall“) proběhly bez problémů.

Maemo SDK

Instalace začíná instalací Scratchboxu. Můžete použít skript „Install Scratchbox“. Instalace je přímočará, nenarazil jsem na žádné problémy, jen vzhledem k velikosti stahovaných dat nějakou chvíli trvá. Po instalaci Scratchboxu následuje krok 2, tedy souhlas s EULA pro proprietární kód Nokia. I zde doporučuji nechat potřebné akce na instalačním skriptu, který otevře potřebnou stránku a sdělí, kam je třeba napsat adresu repository.

Další část instalace probíhá v prostředí Scratchboxu, a to jak pro platformu x86, tak pro platformu ARM. Stahují se a instalují knihovny a nástroje od Nokie, potřebné pro překlad pro jednotlivé platformy. Opět doporučuji použít instalační skript, který provede vše potřebné. Pozor! Pokud jste u předchozího kroku nevložili odkaz na repository nebo pokud jste jej vložili nesprávně, instalace zdánlivě proběhne, ale zjistíte, že spousta věcí nefunguje.

Instalací binárních souborů od Nokie končí základní část přípravy vývojového prostředí pro N900. Je tedy načase vyzkoušet, zda se vše povedlo, tak jak mělo.

Maemo SDK

Test

Spustíme si X server Xephyr (nainstaloval se spolu se Scratchboxem):

Xephyr :2 -host-cursor -screen 800x480x16 -dpi 96 -ac -kb &

Jakmile na obrazovce běží okno Xephyru, můžeme spustit uživatelské rozhraní Maema. Nejprve spustíme Scratchbox, řekneme mu, ke kterému displeji se má připojit, a spustíme aplikační framework pomocí af-sb-init.sh.

$ /scratchbox/login

Welcome to Scratchbox, the cross-compilation toolkit!

Use 'sb-menu' to change your compilation target.

See /scratchbox/doc/ for documentation.

[sbox-FREMANTLE_X86: ~]>export DISPLAY=:2
[sbox-FREMANTLE_X86: ~] >af-sb-init.sh start

Pokud vše proběhlo tak jak mělo, máte nyní na obrazovce virtuální okno, ve kterém vám běží uživatelské rozhraní Nokie N900 – v podstatě máte tak k dispozici emulátor UI, na kterém je možno testovat chování aplikací. Fungují i takové funkce jako stahování a instalace nových balíčků či nastavení systému.

Maemo SDK

Překládáme

V prostředí Scratchboxu máte k dispozici vše, co potřebujete k přeložení programu. Scratchbox používá oddělenou adresářovou strukturu, takže se vám nemíchá do domovského adresáře. Spustíme si Scratchbox:

$ /scratchbox/login

… a můžeme si zkusit vytvořit první program v C. Vytvoříme tedy klasický hello.c soubor, ve kterém bude:

#include <stdio.h>
int main() {
   printf("Hello world\n");
}

a přeložíme ho:

$ gcc -Wall -g hello.c -o hello

Vše by mělo proběhnout bez chyb, a výsledek si můžete vyzkoušet („./hello“) – vrátí očekávatelné.

S terminálovým programem daleko nedojdeme. Zkusíme si proto, jak vytvořit program, který bude spolupracovat s GUI. Nejzákladnější „Hello world s GTK+“ nalezneme v Maemo wiki, kopie je zde:

/**
 * gtk-hello.c
 *
 * This maemo code example is licensed under a MIT-style license,
 * that can be found in the file called "License" in the same
 * directory as this file.
 * Copyright (c) 2007-2008 Nokia Corporation. All rights reserved.
 *
 * A simple GTK+ Hello World. You need to use Ctrl+C to terminate
 * this program since it doesn't implement GTK+ signals (yet).
 */

#include <stdlib.h> /* EXIT_* */
/* Introduce types and prototypes of GTK+ for the compiler. */
#include <gtk/gtk.h>

int main(int argc, char** argv) {

  /* We'll have two references to two GTK+ widgets. */
  GtkWindow* window;
  GtkLabel* label;

  /* Initialize the GTK+ library. */
  gtk_init(&argc, &argv);

  /* Create a window with window border width of 12 pixels and a
     title text. */
  window = g_object_new(GTK_TYPE_WINDOW,
    "border-width", 12,
    "title", "Hello GTK+",
    NULL);

  /* Create the label widget. */
  label = g_object_new(GTK_TYPE_LABEL,
    "label", "Hello World!",
    NULL);

  /* Pack the label into the window layout. */
  gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(label));

  /* Show all widgets that are contained by the window. */
  gtk_widget_show_all(GTK_WIDGET(window));

  /* Start the main event loop. */
  g_print("main: calling gtk_main\n");
  gtk_main();

  /* Display a message to the standard output and exit. */
  g_print("main: returned from gtk_main and exiting with success\n");

  /* The C standard defines this condition as EXIT_SUCCESS, and this
     symbolic macro is defined in stdlib.h (which GTK+ will pull in
     in-directly). There is also a counter-part for failures:
     EXIT_FAILURE. */
  return EXIT_SUCCESS;
}

Pokud si tento kód uložíte jako, řekněme, gtk-hello.c a zkusíte přeložit pomocí

$ gcc -Wall -g gtk-hello.c -o gtk-hello

zjistíte, že překladač vypíše spoustu chyb a skončí. Příčina je zřejmá – chybějící informace o hlavičkových souborech a o knihovnách. Aby nebylo potřeba vypisovat sáhodlouhé texty a cesty, nabízí SDK nástroj zvaný „pkg-config“, který vypíše potřebné místo nás. Například

$ pkg-config --cflags gtk+-2.0

vypíše patřičné -I parametry. Překlad tedy spustíme pomocí

$ gcc -Wall -g gtk-hello.c  \
 `pkg-config --cflags gtk+-2.0` -o gtk-hello  \
 `pkg-config --libs gtk+-2.0`

Takto ošetřený příkaz by měl přeložit zdrojový kód naprosto bez problémů a jeho výsledkem bude spustitelný soubor gtk-hello. (Další informace mohou zájemci zjistit pomocí „ pkg-config --list-all | sort“)

Pokud se pokusíme spustit gtk-hello přímo ( ./gtk-hello), výsledkem bude varování, že není nadefinován displej, do něhož má výstup probíhat. Spustíme si proto Xephyr (výše uvedeným příkazem nebo poklikáním na ikonu na ploše) a nastavíme proměnnou DISPLAY.

 [sbox-FREMANTLE_X86: ~] > export DISPLAY=:2
 [sbox-FREMANTLE_X86: ~] > ./gtk-hello

Program se spustí, zabere celé okno a zobrazí v něm „Hello world“. Ukončit ho musíme stiskem Ctrl C. Pokud chceme vidět, jak bude program vypadat v aplikačním prostředí, musíme si jej nejprve spustit:

[sbox-FREMANTLE_X86: ~] > af-sb-init.sh start
[sbox-FREMANTLE_X86: ~] >./gtk-hello

Výsledkem je okno s aplikačním prostředím, a v něm běžící Hello World. Naše aplikace nemá definovanou obsluhu signálů, tudíž na zavření nijak nereaguje. Kliknutím na křížek ji tedy nezavřeme, pouze odsuneme do pozadí, kde stále poběží. Musíme ji ukončit ručně v terminálu stiskem Ctrl C.

Pro testování je vhodnější místo prostého spuštění binárního kódu použít nástroj run-standalone. Vyzkoušejte si:

[sbox-FREMANTLE_X86: ~] >run-standalone.sh ./gtk-hello

Run-standalone nastaví patřičné proměnné prostředí podle nastavení vzhledu, takže výsledek bude respektovat skinování telefonu apod. Aplikace spuštěná s run-standalone bude stále stejně toporná, ale alespoň bude vypadat k světu – viz screenshot.

bitcoin_skoleni

Maemo SDK

A co dál?

První kroky jsou za námi. SDK funguje, přeložili jsme si první program a otestovali jej. Co dál? Popisovat další kroky by bylo už nad rámec tohoto prvotního seznámení s Maemo SDK, proto v tuto chvíli odkážu případné zájemce o vývoj na stránky systému Maemo a na Maemo Wiki. Další materiál ke studiu naleznete na následujících odkazech:

Autor článku

Martin Malý je autorem serveru Bloguje, mikroblogu Teidu či služby pro zkracování odkazů Jdem.cz. Vedl také magazín Zdroják.