Projekt-Setup für die Entwicklung kommerzieller Android-Applikationen

Referenzen und Kapseldesign

Inhaltsverzeichnis

Ein gesonderter Trick ist für die Ressourcen zu nutzen, die im assets-Verzeichnis liegen. Ist geplant, eine solche Datei im Kontext des Free-Version-Moduls aufzurufen (zum Beispiel beim Laden einer Textdatei für eine Level-Definition), erwartet die App, und somit der Android-Precompiler, das assets-Verzeichnis als Teil des Free-Version-Moduls. Da der Precompiler außerhalb des Eclipse- Workspace läuft, funktionieren die Eclipse-Referenzen hier nicht. Eine Lösung stellt ein symbolischer Link auf Dateisystem-Ebene dar (in Windows ein "mklink /D assets C:\user\kai\workspace\SpaceFishAndroLib\assets" oder in der Unix-Welt ein "ln -s /... assets").

Wichtiger Hinweis: Wenn man Filesysteme innerhalb des Workspace zusammenlinkt, werden alle Metadaten des Versionskontrollsystems ebenfalls verlinkt. Im Projekt "Free Version" ist das verknüpfte assets-Verzeichnis folglich in die ignore-Liste des Systems einzutragen.

Falls der Umfang der Dateien zwischen Free und Full Version stark differiert, kann es auch Sinn machen, anstelle des Links die jeweiligen Dateien vor dem Build-Prozess zu kopieren.

Fast identisch mit dem freien ist das Modul "Android Full Version". Der einzige Unterschied ist, dass die Splash-Activity das System auf Full Version einstellt. Das PC-Modul hingegen enthält alle JUnit-Tests für die Klassen des Core-Moduls, eine Implementierung des I/O-Layers und eine Main-Class, die einen Swing-Client für die PC-Version der App startet. Das PC-Modul referenziert im Build-Path nur das Core-Modul. Für die Open-GL-Anbindung verwendet die Implementierung Java Bindings for OpenGL (JOGL).

Im Fluki-Beispiel ist der PC-Client nur ein Test-Client. Er hat keine ausgeklügelte Benutzeroberfläche, für die Navigation zwischen den Spiel-Kampagnen gibt es beispielsweise keine grafischen Buttons, sondern nur ein einfaches Drop-down-Menü. (siehe Abbildung 1)

Die Bild-, Ton- und Textressourcen liegen im Android-Modul, um die Funktionen des Betriebssystems für Internationalisierung und Unterstützung unterschiedlicher Hardware möglichst vollständig nutzen zu können. Würde man nun eine Referenz auf das Android-Library-Modul in das PC-Modul einfügen, hätte man den Android-Content in selbiges eingebracht, was nicht erwünscht ist. Anstelle einer Projekt-Referenz im Build-Path werden die Ressource-Verzeichnisse (assets, drawable, values, raw) deshalb über "Eclipse-Referenzen" in das PC-Modul eingebunden.

Da das Erzeugen und Verwenden von Referenzen in Eclipse als Feature zwar mächtig, aber wenig bekannt ist, folgt eine Anleitung:

  1. Auswählen des Verzeichnisses, in dem die Referenz erscheinen soll.
  2. Rechtsklick, um ein neues Verzeichnis zu erzeugen.
  3. Klick auf den Advanced-Button.
  4. Auswählen von "Link to alternate location".
  5. Klick auf "Variables".
  6. Auswahl der Variablen "WORKSPACE_LOCATION" und des "Extend..."-Buttons.
  7. Auswahl des Projekts und des Quellordners, der verlinkt werden soll.
  8. Klick auf "OK".

Eclipse-Ordner verlinken (Abb. 8)


Die verlinkten Verzeichnisse erscheinen nun in der Ordnerliste mit einem entsprechenden Symbol.

PC-Module mit eingebundenen Ressourcen (Abb. 9)

Nachdem die Ressourcen in den src-Ordner des PC-Moduls eingebunden sind, lassen sich Bild-Dateien wie Texturen mit dem Classloader laden. Für Sound-Dateien ist zu beachten, dass das .ogg-Format auf Android das Format der Wahl ist. Ogg-Vorbis wird vom Java SDK nicht ohne weiteres unterstützt. Das Verwenden der Bibliothek easyogg ermöglicht das Abspielen ogg-codierter Sounds.

Bei den Texten muss man ein bisschen mehr Arbeit investieren, die aber nicht kompliziert ist. Alle Android- Text-Ressourcen sind als Name-Value-Paare in XML-Dateien gespeichert. Im PC-Modul ist deswegen ein XML-Parser enthalten, der alle XML-Dateien des /values-Verzeichnis einliest und die enthaltenen Paare in einer HashMap speichert.

Um nun eine Nachricht anzuzeigen, ruft das Core-Modul das aktuelle Message-System auf und definiert den Text über eine der Enum-Konstanten. In ihr ist der Name der Nachricht enthalten. Das PC-Message- System holt den Text aus der HashMap und zeigt ihn über eine OpenGL-Textfunktion an. Das Android- Message-System verwendet zur Anzeige hingegen eine dynamisch eingeblendete TextView.

Das Konzept der I/O-Kapselung der plattformspezifischen Teile folgt einem einfachen Grundsatz: Die Schnittstellen sollten so einfach wie möglich sein. Oder wie Kent Beck es in "Extreme Programming Explained"[1] formuliert: "Don't build frameworks".

Beispiel: Das Fluki-Spiel basiert auf OpenGL. Es würde keinen Sinn machen, die OpenGL-Basis vor der Core-Engine zu verstecken, da sowohl die Android- als auch die PC-Version OpenGL zur Implementierung verwenden. Das Resultat dieses Ansatzes ist, dass das Interface zum Grafik-Subsystem sowohl High-Level-Funktionen wie beforeLevelRender als auch Low-Level-Funktionen wie pushMatrix enthält um Duplikate der Business-Logik zu vermeiden.