Einblick in Google Android
Artikel erschienen in Swiss IT Magazine 2008/04
Die Möglichkeit, selber Software für Mobiltelefone entwickeln zu können, besteht bereits seit einiger Zeit. Dennoch gehört die Entwicklung in diesem Bereich für viele Softwareentwickler zu den unerfreulichen Aufgaben.
Zunächst ist zu bedenken, dass eine Vielzahl an Geräten auf dem Markt ist. Diese unterscheiden sich unter anderem in der Leistungsfähigkeit des Prozessors, der Grösse des Displays, der Eingabemöglichkeit der Speicherausstattung und der Multimedia-Unterstützung. Ausserdem teilen sich etliche teilweise grundsätzlich verschiedene Betriebssysteme den Markt.
Dabei dominieren vor allem geschlossene, lizenzpflichtige Systeme wie Symbian, Windows Mobile, Blackberry oder Palm. Daneben existiert auch ein mittlerweile sogar stark wachsendes Segment an Plattformen auf Open-Source-Basis wie Open Moko oder Qtopia. Auch Googles Android gehört in dieses Segment.
Letztlich gestaltet sich auch das Testen der Software oft schwieriger als erwartet, weil sich Emulatoren nicht immer genauso wie das reale Gerät in einem bestimmten Netz verhalten.
Dies sind natürlich schlechte Voraussetzungen für eine grosse Auswahl an Applikationen, zumal die Netzbetreiber immer gerne mitreden, wenn es darum geht, welche Anwendungen auf ein Telefon gehören oder nicht.
Es gab in den letzten Jahren aber auch Anstrengungen, um die Situation zu verbessern. So hat Sun mit einigem Erfolg die Java Micro Edition lanciert, um das plattformunabhängige Entwicklungsparadigma auf mobile Systeme zu bringen.
Allerdings ist auch in Java ME die Entwicklung oft nicht einfach: Verschiedenste Profile machten das Leben des Entwicklers nicht gerade einfacher. Die steigende Leistungsfähigkeit der Mobiltelefone ermöglicht es nun aber, die vom PC bekannte Java Standard Edition zu verwenden. Damit wird nicht nur ein grösserer Entwicklerkreis angesprochen, sondern es werden auch mehr Möglichkeiten geboten – womit überhaupt erst eine offene Plattform wie Android möglich ist.
Mit Android geht Google einen Schritt weiter als Sun mit Java ME. Android definiert im Gegensatz zur Java ME den gesamten Stack vom Betriebssystem bis zur Java-API. Auch sind alle Anwendungen gleichberechtigt. Das heisst, ein Entwickler kann in Android nicht nur ein Spiel oder eine Zusatzanwendung programmieren, sondern im Prinzip auch die mit dem Gerät mitgelieferten «Kernanwendungen» wie Telefonbuch oder SMS durch Eigenentwicklungen ersetzen. Dies ist ganz klar ein Ansatz, der der Dominanz der Anbieter entgegenläuft.
Da Google selbst keine Mobiltelefone herstellen möchte, wurde die Open Handset Alliance ins Leben gerufen. Sie soll die Hardware-Plattform für Android verbreiten und besteht aus mehr als 30 Firmen aus den Bereichen:
- Netzwerkbetreiber (u.a. NTT DoCoMo, Sprint Nextel, T-Mobile)
- Gerätehersteller (wie HTC, LG, Motorola, Samsung)
- E-Commerce-Anbieter (wie Google und Ebay)
- Halbleiterproduzenten (Intel, Nvidia, Qualcomm, TI)
- Softwareproduzenten wie Wind River oder Esmertec.
Die ersten Handsets auf Basis von Android werden gegen Ende Jahr erwartet, nachdem erste Prototypen an der Mobile World Conference zu sehen waren. Neue Geschäftsmodelle mit Firmen wie Ebay sind ebenfalls zu erwarten.
Die Basis von Android (siehe Abbildung auf dieser Seite) ist ein speziell für mobile Systeme angepasster Linux-Kernel. In diesem findet man natürlich alle Hardware-nahen Treiber. In der nächsten Schicht findet man Bibliotheken für die Anwendungsentwicklung wie SSL oder WebKit (Webbrowser), aber auch das Mediaframework und SQLite. SQLite ist eine leichtgewichtige relationale Datenbank, die Anwendungsentwickler direkt nutzen können.
In der nächsten Schicht finden sich das Application Framework mit Activity Manager, Window Manager und Telephony Manager. Dazu kommen interessante Funktionen wie der Location Manager, der für ortsbezogene Anwendungen eingesetzt werden kann, beziehungsweise die XMPP-API, die die Realisierung von Jabber-Anwendungen ermöglicht.
Die letzte Schicht bilden die Anwendungen selbst. Hier findet man, wie schon zuvor erwähnt, die Kernanwendungen wie Adressbuch oder Telefon gleichberechtigt neben den eigenen Anwendungen.
Die verschiedenen APIs werden in Core und optionale APIs aufgeteilt. Während die Core-APIs von allen Handsets implementiert werden müssen, können die optionalen APIs (wie Location Based Services oder OpenGL-3-D- Grafik) je nach Fähigkeiten des jeweiligen Geräts vorhanden sein oder nicht.
Architektur von Google Android
Ab der Schicht «Application Framework» wird in Java programmiert. Allerdings ist hier eine Besonderheit zu beachten: Zum Einsatz kommt nicht die klassische Java VM von Sun, sondern eine Eigenimplementierung von Google namens Dalvik VM. Sie ist für mobile Geräte optimiert und unterstützt die Java-Syntax sowie einige Kern-Bibliotheken, aber nicht den vom «normalen» Java erzeugten Bytecode, also die Class-Dateien.
Dies ist ein wichtiger Unterschied zu den bekannten Java VMs. Die Class-Dateien müssen stattdessen mit einem separaten Werkzeug in Dex-Dateien umgewandelt werden, die dann von Dalvik ausgeführt werden können. Daher ist es nicht möglich, Java-Bibliotheken, die typischerweise als JAR zur Verfügung stehen, unmittelbar unter Android zu verwenden. Es wird aber wohl nur eine Frage der Zeit sein, bis man entsprechend angepasste Bibliotheken von wichtigen Projekten finden wird. Beispielsweise hat kaum einen Monat nach Ankündigung der Android-Plattform das db4o-Projekt, das eine objektorientierte Datenbank bereitstellt, eine für Android angepasste Bibliothek zur Verfügung gestellt.
Zur Entwicklung von Anwendungen stellt Google sowohl Kommandozeilenwerkzeuge als auch Plug-ins für Eclipse für x86 (Mac OS X, Ubuntu Linux, Windows) zur Verfügung. Integriert ist ein Hardware-Emulator, der Handsets verschiedener Auflösung, Display-Orientierung und Eingabemöglichkeiten darstellen kann. Da zurzeit abgesehen von einigen Developer Kits von TI oder Qualcomm noch keine reale Hardware verfügbar ist, kann man seine Anwendungen auf diesen Emulatoren entwickeln.
Die Installation des Android-SDK gestaltet sich einfach. Man kann – wie als Java-Entwickler gewohnt – in Eclipse programmieren und somit alle bekannten Eclipse-Funktionalitäten wie Code-Ergänzung oder Syntax-Hervorhebung nutzen. Zum Ausführen der Anwendung muss ein Run-Schema definiert werden, in dem man angibt, in welchem Emulator die Anwendung gestartet werden soll.
Die Anwendungsentwicklung für Anwendungen mit Benutzerschnittstelle basiert auf dem Konzept von Activities und Intents. Eine Activity entspricht einem Screen, also einem Formular oder einer Display-Anzeige, mit der der Benutzer interagieren kann.
Das Konzept des Intent ist sehr interessant: Ein Intent ist eine Absicht, die ein Benutzer ausdrückt. Ein Beispiel für so eine Absicht: Der Benutzer wählt im Adressbuch einen Eintrag aus und klickt auf die Telefonnummer in der Erwartung, dass ein Telefonanruf gestartet wird. Die «Absicht» ist also die Initialisierung eines Anrufs.
Das Interessante an diesem Konzept ist nun, dass ein Late Binding solcher Intents möglich ist. Das System kann also erst zur Laufzeit entscheiden, welche Anwendung konkret diese Absicht bearbeiten soll. Auf diese Weise können Kernanwendungen wie der Telefonmanager durch eigene Anwendungen ausgetauscht oder entschieden werden, welche Applikation am besten zur Behandlung eines Intent geeignet ist. Ein Intent kann somit als Klebstoff für Aktivitäten angesehen werden.
Der Benutzer kann sich mit Hilfe der Intents von einer Aktivität zur nächsten weiterbewegen, wobei die alten Aktivitäten von Android auf einem Stack abgelegt werden – solange genug Speicher vorhanden ist und der Anwendungsentwickler das erlaubt. Der Benutzer kann diese Informationen nutzen, um mit der Zurück-Taste zu den vorherigen Aktivitäten zurückzukehren.
Die Entwicklung von Benutzerschnittstellen ist immer eine Herausforderung, ganz besonders dann, wenn man Geräte mit unterschiedlichen Bildschirmgrössen und Auflösungen unterstützen möchte. Dies ist schon bei der Programmierung von Desktop-Anwendungen ein Problem, da verschiedene Betriebssysteme Elemente unterschiedlich darstellen. Daher wurde schon in der Java Standard Edition das Konzept der Layoutmanager eingeführt. Dasselbe Prinzip findet man auch in Android wieder. Elemente der Benutzerschnittstelle werden dabei meist nicht fix positioniert, sondern deren Position zueinander beschrieben. Die Wahl des geeigneten Layoutmanagers (wie Frame, Linear, Table) sorgt dann für die wunschgemässe Anordnung.
Bei Android wird die Definition eines UI-Schirmes als View bezeichnet und einer Activity zugeordnet. Viewgroups können verwendet werden, um UI-Elemente zu strukturieren. Alternativ kann das UI-Layout auch mit XML beschrieben werden (siehe Abbildung auf dieser Seite).
Eine Android-Anwendung ist daher typischerweise eine Sammlung von Activities mit Views und Intents. Es können aber auch Anwendungen geschrieben werden, die im Hintergrund als Service laufen. Ebenso sind Benachrichtigungen für den Benutzer auf verschiedenen Ebenen vorgesehen, beispielsweise durch Icons in der Symbolleiste.
Um eine Android-Anwendung zu entwickeln, steht eine umfangreiche API zur Verfügung. Sie umfasst unter anderem Pakete für Datenbank-Zugriff (SQLite), Grafik (optional auch 3D mittels OpenGL), Netzwerk, Telefon sowie verschiedene Java-Basisbibliotheken wie java.util oder java.nio. Dazu kommen einige andere Open-Source-Bibliotheken wie jUnit.
Die Basiskonfiguration einer Android-Anwendung wird in einer Manifest-Datei abgelegt. In dieser werden globale Konfigurationsvariablen gespeichert sowie die Intent-Filter definiert. Diese dienen der Beschreibung, wann und unter welchen Voraussetzungen die Aktivitäten in der Anwendung gestartet werden.
Weiter sind verschiedene Möglichkeiten der Datenspeicherung vorgesehen:
- Key/Value Preferences
- Files
- Datenbanken (mit SQLite oder anderen Produkten wie db4o)
- Content Provider zum Datenaustausch zwischen Anwendungen
- über das Netzwerk
Auch ein Security-Modell sowie Internationalisierung über Ressourcen ist vorgesehen.
Auch wenn Apple mit dem iPhone den Mobiltelefon-Markt aufgerüttelt und Google damit ein wenig die Show gestohlen hat, ist Android ein sehr interessantes Konzept. Im Gegensatz zum iPhone steht es auch von vornherein unter einer Open-Source-Lizenz, die jedem Entwickler ermöglicht, eigene Beiträge zu leisten. Apple kontrolliert dagegen mit aller Macht, was auf das eigene Telefon kommt – oder eben nicht.
Android ist gut konzipiert und schon jetzt gut dokumentiert. Ebenso sind leistungsfähige Entwicklungswerkzeuge verfügbar. Eine wichtige Frage ist sicherlich, ob nicht nur Google, sondern auch die anderen Firmen in der Open Handset Alliance tatsächlich hinter Android stehen und in der Lage sind, bald vernünftige Handsets anzubieten, die auch global in einer entsprechenden Stückzahl von den Netzanbietern vertrieben werden.
Android hat jedenfalls, wie auch die Konkurrenz-Angebote wie Java ME und deren Nachfolger, das Potential, wirklich neuartige und innovative Anwendungsentwicklungen auf mobilen Geräten zu ermöglichen und dabei die Mobiltelefone von den Fesseln der Netzanbieter etwas zu befreien.
Zuletzt sollte noch auf die Android Developer Challenge hingewiesen werden: Google hat 10 Millionen Dollar Preisgeld für Android-Anwendungen ausgeschrieben. Das Preisgeld wird in zwei Etappen ausbezahlt: Die erste Eingabefrist endet Anfang März, die zweite im Herbst dieses Jahres. Auf diese Weise sollten mit Erscheinen der ersten Android-Telefone auch genug Applikationen bereitstehen.
Alexander Schatten (alexander@schatten.info) ist Assistent am Institut für Softwaretechnik und interaktive Systeme der Technischen Universität Wien.