App Portierung auf MeeGo mit Qt

2010-09-03 19:27


Da ich ja am 4. September beim Intel Off-IFA Event einen Vortrag zum Thema Portierung auf MeeGo mit Qt halte, möchte ich auch einige Gedanken dazu auf meinem Blog festhalten. Der Vortrag ist nur 10 Minuten lang, so dass ich wohl einiges anreissen kann, aber für Details und anderes ist da halt einfach keine Zeit. Auch konzentriert sich der Vortrag natürlich sehr auf MeeGo, Qt läuft aber auch noch auf vielen anderen Plattformen.

Über Portierung habe ich ja schon Anfang dieses Jahres mal geschrieben. Dort hat sich natürlich nicht viel geändert, nur das ich jetzt mit Qt und mobilen Plattformen etwas mehr Erfahrung habe. Daher werde ich mich auch in diesem Blogbeitrag auf die Portierung für Apps im Bereich Netbooks und Smartphones beschränken. Auf den Code hat dies eigentlich keinen Einfluss, Qt Apps für mobile Geräte sollten auch auf anderen nicht mobilen Plattformen nach einer neuen Compilierung laufen. Einschränkungen gelten hier zurzeit noch für Qt Mobility, so dass zum Beispiel natürlich ein GPS Sensor vorhanden und von Qt auf der Plattform unterstützt werden muss.
Für Netbooks bzw. Tablets sind hier als Plattformen Windows7 und MeeGo zu nennen, sowie weitere Linuxderivate für Netbooks. Ebenfalls wäre noch das WeTab zu nennen, welches nun MeeGo verwendet. Im Smartphonesektor ist Symbian in diversen Ausprägungen noch zu nennen, neben MeeGo natürlich. Spannend ist hier wohl, ob sich Intel auf Netbooks beschränkt, oder es auf Intelprozessoren aufbauende MeeGo Handys von bekannten Herstellern geben wird. Nokia setzt hier bisher auf ARM als Hardware Plattform, für die Entwicklung mit Qt spielt dies allerdings keine Rolle.

tl_files/codenode/qtportierung/portierungqtmeego.png



Und wie Portiert man nun?

Wenn man von Plattformen wie dem iPhone oder Android eine App auf Qt portiert, so gibt es immer 2 Möglichkeiten.
Die einfachere ist, den Code der App 1:1 zu portieren, bei einfachen Apps ist dies auch erfolgversprechend. Die Methode ist auch schnell, so das die App mit relativ wenig Aufwand portiert ist. Das Problem was sich hier aber unter Umständen stellt, ist das es eigentlich besser gehen würde. Häufig ist es lohnenswert, eine App bei der Portierung abzuklopfen, ob man die Besonderheiten von Qt nicht nutzen kann. Dies führt evtl. auch zu einem besseren Look & Feel auf den Qt Plattformen.
Besonderheiten von Qt sind so zum Beispiel:
  • QGraphicsScene
  • QAnimationFramework
  • QStateMachine
  • Model/View
Diese Liste ist natürlich nicht vollständig, Qt bietet unter anderem auch eine gute Webkit-Integration an. Mit der QGraphicsScene lassen sich umfangreiche 2d Elemente und Effekte darstellen, welche durch das QAnimationFramework auch noch Animiert werden können. Mit einer QStateMachine bietet Qt auch ein Framework zur Programmierung mit StateMachines und entsprechenden Events. Qt hat ebenfalls ein eigenes und sehr mächtiges Model/View Framework, mit einem eigenen Modell lassen sich so leicht entsprechende Controls mit Inhalt füllen.
Dann muss man noch erwähnen, das alle Oberflächen in Qt mit CSS verändert werden können. Damit kann man eine UI an alle Besonderheiten anpassen. Zusätzlich gibt es mit QML nun die Möglichkeit für das UI eine Deklarative Sprache zu wählen. Bei traditioneller Oberflächenerstellung mit Qt empfiehlt sich die Benutzung von Layouts, somit passt sich der Fensterinhalt an die Größe an. Dies klappt sehr gut, da eine App Form ja nur wenige Elemente enthalten sollte.

Eigener Code

Häufig ist es ja so, das es schon bestehenden C++ Code gibt, und man diesen auch gerne in der neuen App benutzen möchte. Dies kann viele Vorteile haben, und helfen Entwicklungszeit einzusparen. Auch bei Spielen ist häufig die Übernahme von OpenGL und Engine Code interessant. Qt ist eigenständig entwickelt, und verwendet intern keine STL, jedoch ist die Kombination von Qt mit STL, boost oder anderen 3rd Party Bibliotheken problemlos möglich. Somit lässt sich schon vorhandener Code in C/C++ weiter verwenden, unter Umständen müssen noch Wrapper oder Schnittstellen für die Kommunikation mit Qt geschrieben werden.
Hier bietet sich für Daten zum Beispiel das Model/View Konzept von Qt an. Wichtig ist hierbei die Überprüfung auf Kompatibilität mit der Zielplattform. Andere mobile Plattformen welche C++ nutzen, besitzen häufig Eigenheiten, wie fehlende Exceptions oder eingeschränkter STL oder fehlender RTTI Support. Manchmal kann es hier Sinn ergeben, den Code für die Verwendung mit Qt entsprechend abzuändern.

Ein paar Details aus der Praxis

Für Qt kann ich hier zurzeit keine Horrorstories erzählen, die ich selbst erlebt habe. Mit Google lassen sich sicher aber welche finden. Einige eigene Erfahrungen bei der Portierung von C++ Anwendungen von Windows auf Linux oder Solaris habe ich aber schon gemacht. So gibt es verschiedene STL Ausführungen, welche zu einander leicht verschieden sein können. So gibt es in der STL von Microsoft einige kleinere Details, welche vom Standard abweichen, bzw unter GCC anders sind. Diese Stellen müssen dann entsprechend bei der Portierung nachgezogen werden, ebenfalls kann dies für Zuweisungen gelten. Daher sollte man auch mit sehr strikten Compilereinstellungen arbeiten um dies zu vermeiden.
Dann gibt es noch die Plattform spezifischen Fehler. Hier kann auch Threading zu Problemen führen. Zwar ist wohl in vielen Apps die Verwendung von Threads überflüssig, aber bei einer Anwendung mit wxWidgets habe ich schon erlebt, wie knifflig so etwas zu debuggen ist. Unter Windows lief es damals wunderbar, unter Linux nicht. Der Fehler war dann sogar in wxWidgets, im Code von wxLock, wenn ich mich richtig erinnere.
Gerade solche Bugs sind bei der Portierung nicht hervorsehbar, und können trotz nur einer Codezeile ein Projekt um Tage verzögern. Daher sollte man bei eigenem Code intensiv testen und auf einen sauberen Stil achten. Auch sollte man testen, ob das auftretende Problem Plattformspezifisch ist, oder es sich z.B. unter Windows/Linux Desktop nachstellen lässt. Dies vereinfacht unter Umständen die Fehlersuche und das Debugging.

Zurück