bada Apps zu Tizen migrieren

Samsung hat schon früh angedeutet, dass bada in Tizen aufgehen wird beziehungsweise bada Apps später auch mal auf Tizen-Geräten laufen könnten. Wie das aber konkret funktioniert, wissen wir erst seitdem Samsung das Migrationstool für bada Apps veröffentlicht hat.

Es hat sich herausgestellt, dass man unter Tizen leider nicht einfach so bestehende bada Apps installieren und ausführen kann. Entwickler müssen ihre App für Tizen neu kompilieren und in den Tizen-Store einstellen. Änderungen am Code selbst sind kaum notwendig, denn Samsung hat es geschafft, die meisten bada APIs nahezu komplett in Tizen nachzubilden. Hauptunterschied ist der geänderte Namespace von Osp zu Tizen. Diese Referenzen im Quellcode der App zu ändern, ist die Hauptaufgabe des oben genannten Migrationstools. Im besten Fall kann eine bada App also sofort kompiliert werden, nachdem man sie mit dem Tool in das Tizen SDK importiert hat.

In einigen Fällen muss man aber API-Aufrufe etwas modifizieren, zum Beispiel wenn Samsung die Parameter-Typen nicht genau so übernommen hat, wie es unter bada der Fall war. Hat man die UI-Steuerelemente für die Anzeige von Flash oder Karten verwendet, steht man vor einem größeren Problem. Diese Funktionen hat Samsung teilweise (noch) nicht wieder in Tizen (Stand: Tizen SDK 2.1b) integriert.

Um eure bada Apps für Tizen fit zu machen, benötigt ihr zuerst das Tizen SDK. Achtet bei der Installation darauf, dass ihr das Migrationstool gleich mitinstalliert. Eine detaillierte Anleitung dazu findet ihr hier. Danach könnt ihr im SDK über den folgenden Menüpunkt eure bada App importieren:

File → Import → Tizen → Import bada project

Im Laufe des Imports werdet ihr gefragt, ob ihr eure App zu einer reinen Tizen Native App oder zu einer App mit Osp Kompatibilitätsmodus machen wollt. Leider gibt es derzeit noch keine genaueren Informationen darüber, wo der exakte Unterschied zwischen beiden Varianten liegt. Samsung deutet aber im Manual (zu finden im Tizen SDK Installationsordner unter ‚documents‘) an, dass einige neuere Tizen Features nicht verfügbar sind wenn der Kompatibilitätsmodus aktiviert ist. Ich schlage daher vor, es erstmal ohne den Kompatibilitätsmodus zu versuchen. Sollte es so zu größeren Problemen kommen, kann man ihn immer noch aktivieren.

Wie auch für bada Apps benötigt ihr eine Manifest-Datei (manifest.xml), in der die gesamten Metadaten (zum Beispiel benötigte Privilegien oder minimale Hardware-Voraussetzung) der App zusammengefasst sind. Unter Tizen SDK 2.1b lässt sich eine App ohne Manifest-Datei nicht im Emulator starten. Da man derzeit auf developer.tizen.org noch keine solche Datei erstellen kann, habe ich mir beholfen, indem ich die Manifest-Datei einer Tizen Sample App, die sich über das SDK anlegen lässt, benutzt und für meine App modifiziert habe.

Wie oben schon erwähnt bleiben jetzt ggf. noch Änderungen am Code zu erledigen. Das allermeiste sind Kleinigkeiten wie zum Beispiel der folgende Rechtschreibfehler in der ursprünglichen bada API:

Osp::Base::Utility::StringTokenizer st2(token);
st2.SetDelimeters("~");

Samsung hat für die bada API das Wort ‚Delimiter‘ falsch geschrieben, und dieses dann für die Tizen API korrigiert:

Tizen::Base::Utility::StringTokenizer st2(token);
st2.SetDelimiters("~");

Diese Korrektur wird vom Migrationstool nicht automatisch ausgeführt und muss nach dem Import manuell durchgeführt werden. Die IDE zeigt solche Fehler aber nach einem Build-Versuch an, sodass es nicht lange dauern sollte, alle betroffenen Stellen zu finden.

Ein weiterer Fehler könnte euch erwarten, wenn Ihr zum Beispiel folgendes Interface verwendet:

Osp::Net::Http::IHttpTransactionEventListener

Auf den ersten Blick hat sich daran nicht viel geändert, wenn Ihr aber versucht Objekte die dieses Interface implementieren in eine ArrayList einzufügen, werdet Ihr unter Umständen Fehlermeldungen bekommen. Der Grund dafür erschließt sich mit einem genaueren Blick auf Dokumentation der ArrayList und des EventListeners. In der bada API war dieser Listener noch ein Abkömmling von Osp::Base::Runtime::IEventListener und Osp::Base::Object. In der Tizen API ist er nur noch von Tizen::Base::Runtime::IEventListener abgeleitet. Die ArrayList aber akzeptiert nur Objekte, die von Tizen::Base::Object abgeleitet sind, Ihr müsst diese Ableitung also manuell hinzufügen. Es ist nicht auszuschließen, dass solche Änderungen auch bei anderen Klassen oder Interfaces vorgenommen wurden.

Etwas mehr Arbeit hat man, wenn auf die verschiedenen Sensoren oder die GPS Daten des Smartphones zugreift. Zum Beispiel der aus bada bekannte Osp::Uix::SensorManager und alle dazugehörigen Klassen und Enums befinden sich nun in Tizen::Uix::Sensors, und aus Osp::Locations::QualifiedCoordinates wurde Tizen::Locations::Coordinates .

Abgesehen von solchen Kleinigkeiten hatte ich bislang keine Probleme mit der Konvertierung meiner bada Apps. Weitere manuell durchzuführenden Korrekturen sind in den Manuals zum Migrationstool aufgeführt, sodass ich jetzt hier nicht weiter auf jede Einzelne eingehen werde. Wenn euch während der Konvertierung Probleme auffallen, die sich nicht mit Hilfe der Anleitung lösen lassen, schreibt es in die Kommentare zu diesem Artikel, dann werde ich versuchen bei der Lösung zu helfen.

Das Migrationstool funktioniert zwar noch nicht perfekt, aber es macht doch schon einen großen Teil der Portierungsarbeit und vielleicht bessert Samsung ja sogar noch ein wenig nach.

Schreibe einen Kommentar