kwietnia282008

Jeśli nie Java, to co? Czyli inne języki programowania na platofrmę Android

Poprzednio opisaliśmy, co tak naprawdę zamiast Javy siedzi wewnątrz Androida. Zważywszy na to, że sercem systemu jest Linux, nasuwa się pytanie, czy można tworzyć na niego aplikacje w językach innych niż Java? Ponadto, wokół samej Javy wyrosło sporo pomyślnych projektów integrujących ją z innymi językami programowania. Ponieważ urządzenia mobilne posiadają mało pamięci i nisko taktowane procesory, całkiem naturalne wydaje się poszukiwać rozwiązań opartych na C++ i C. Czy Android jako otwarta platforma umożliwia to wszystko?

C i C++

Podstawowym narzędziem programistycznym w każdym Linuxie (Unixie) jest oczywiście C. To właśnie w tym języku napisano nie tylko jądro systemu i sterowniki (moduły) ale także znaczną większość aplikacji, począwszy od powłoki i usług sieciowych, aż po środowiska graficzne (np. GNOME) i aplikacje użytkowe. Oprócz C ważną rolę w ekosystemie Linux’owym odgrywa także C++ (szczególnie w KDE).

Ponieważ Android jest w głębi duszy kolejnym Linux’em, wszystko powinno być możliwe :) . Aaron P. D’Souza podał przykład jak skompilować i uruchomić w emulatorze niewielki konsolowy program napisany w C++. Potrzebny jest jedynie specjalny pakiet GNU/ARM Linux (download). Podobne rozwiązanie opisuje Benno.

Niestety, tak napisane programy nie integrują się w ogóle z całą funkcjonalnością platformy. Nie mogą wyświetlać grafiki, ani tym bardziej wysyłać SMSów, odtwarzać muzyki czy przede wszystkim komunikować się z pozostałymi aplikacjami napisanymi w Javie. Można jednak zrobić w drugą stronę: typowa aplikacja Javowa może wywoływać kod napisany w C/C++ poprzez interfejs JNI. Davanum Srinivas opisuje cały proces krok po kroku. Dzięki temu, jeśli jakiś fragment aplikacji (np. obliczenia matematyczne, kompresja audio/video) zajmują zbyt wiele czasu, można pokusić się o zaimplementowanie go w C i wywoływać z poziomu Javy.

Jednak mariaż C z Androidem budzi kontrowersje. Na grupach dyskusyjnych rozstrząsa się sens i przydatność takich pomysłów. Przede wszystkim, o ile program napisany w C łatwo przygotować tak, aby działał w emulatorze, w rzeczywistości, aby z aplikacji można było korzystać na każdym telefonie, należałoby skompilować taki program na każde urządzenie osobno. Tak jest w przypadku systemu Symbian OS. Ponadto, Google specjalnie skoncentrował się na Javie po to, aby uniknąć problemów z kompatybilnością aplikacji i wyeliminować potrzebę tworzenia różnych wersji tej samej aplikacji na różne modele urządzeń.

Hatem Ben Yacoub z Open Handset Magazine poddał w wątpliwość takie próby.

Python, Jython

Niektórze narządzia wchodzące w skład SDK takie jak np activityCreator.py napisane są w Python’ie. Wiadomo też, że Python, obok Javy i JavaScript’u, jest jednym z ulubionych języków inżynierów Google. Czy można więc pisać aplikacje na Androida w Pythonie?

Pierwsze próby skompilowania Pythona na gphone’a podjął Marcelo Barros de Almeida, lecz nie udało mu się jak dotąd uruchomić interpretera ani interaktywnego shella. Ponadto aplikacje uruchamiane w środowisku Pythona, zamiast w JVM musiałyby się komunikować z platformą poprzez specjalne binding’i pomiędzy Pythonem a Javą, a właściwie Dalvik’iem.

Lepszym rozwiązaniem będzie tutaj użycie Jython’a - implementacji Pythona na JVM. Programy napisane w Jythonie mogą używać zarówno standardowych bibliotek Python’owskich, jak i tych dostepnych w Javie i nie potrzebują do tego żadnych bind’ingów. Kod napisany w pythonie jest tłumaczony do bytecode’u Javy. Ponadto Jython może pracować w trybie interpretera kodu źródłowego. Próbę uruchomienia Jythona na Androidzie podjął hdante, lecz także napotkał problem. Nic dziwnego, wcześniej opisywaliśmy już różnicę pomiędzy JVM a wirtualną maszyną Dalvik’a. W SDK w tej chwili brakuje pełnej implementacji Java Reflection API, a fundamenty języków dynamicznych takich jak Python opierają się o mechanizm reflection.

Podobne próby i rozważania na ten temat podjęto tutaj i tuaj.

Ruby i JRuby

Z tego samego powodu nie udaje się też użyć Ruby‘ego ani JRuby‘ego. Brak pełnej implementacji Javy w SDK powoduje java.beans.IntrospectionException i uniemożliwia uruchomienie programów napisanych w JRuby.

Groovy

Popularność Jythona i JRuby zainspirowała powstanie języka Groovy. Mówi się o nim, że tak wygladałaby Java, gdyby zaprojektowano ją dzisiaj. Groovy jest dynamicznym językiem przeznaczonym do pracy w JVM. Stanowi on doskonałe rozszerzenie Javy i świetnie sprawdza się w zastosowaniach webowych.

Niestety, podobnie jak poprzednie technologie, Groovy w dużej mierze opiera się o Reflecion. Ponadto operuje bezpośrednio na bytecodzie Javy, a nie na Dalvik’u. Z tego powodu tylko częściowo udało się dotychczas skompilowac okrojoną jego wersję. Skrypty jednak nie dają się uruchomić. Tutaj także brak java.beans.Inspector uniemożliwia integrację Groovy’ego z Androidem. Dyskusja tutaj.

Scala

Scala jest eksperymentalnym językiem programowania, który ostatnio zdobywa wielu zwolenników. Do niedawna można było pisać w niej programy na platformę .NET i J2SE oraz J2ME. W najnowszej wersji pojawił się target prosto na Androida!

Tutaj można znaleźć krótki opis jak napisać w Scali program i zainstalować go w emulatorze.

Tym samym Scala jest w tej chwili jedynym językiem dynamicznym z samej czołówki w pełni zaimplementowanym na Androidzie.

Inni gracze na boisku

Jest jeszcze wiele innych technologii, które programiści chętnie widzieliby dostępne na gphone’ach. Sun tworzy właśnie JavaFX Mobile (SavaJX), która ma szansę zastąpić J2ME. Adobe zapewne chciałby popularyzować swojego Flash’a i bazującego na nim AIR (więcej tutaj). Fani .NET i Mono szukają sposobu, aby także dołączyć do społeczności Androida, proponując różne pomysły na integrację. Biorąc jednak pod uwagę problemy z C i niekompatybilność Dalvika z JVM, integracja tych technologii na Androidzie może się okazać w najbliższym czasie niemożliwa.

A może JavaScript?

Tymczasem szybko rozwijający się projekt Google Gears, rozszerzający funkcjonalność aplikacji webowych uruchamianych po stronie klienta (tj. w przeglądarce) w połączeniu z GWT może przerodzić się w nową platformę zarówno dla aplikacji webowych, jak i mobilnych. Są już pierwsze porty GWT na Androida. Gears jest dostępne już w wersji dla Windows Mobile i zapewne już niedługo Google przeniesie je na swój system. Pozwoli to na budowanie aplikacji mobilnych przy użyciu techonologii AJAX, frameworków takich jak Dojo, JQuery, YUI i GWT. Jedna aplikacja będzie mogła działać zarówno na Windows Mobile, jak i Androidzie a nawet iPhone. Safari 3 jeszcze nie wspiera Gears, ale prace nad tym zostały już podjęte.

Google Gadgets są jednym z najważniejszych projektów Googla. Powszechne użycie Gears’ów pozwoliłoby na rozszerzenie ich funkcjonalności i przeminę w mikro-aplikacje o desktopowych możliwościach. Mogło by to poważnie zagrozić istnieniu MS Silverlight’a i Adobe Flex, a z pewnością Sun JavaFX, zarówno w świecie desktopów, jak i urządzeń mobilnych. Dlatego można się spodziewać dużego wkładu w Gears i Androida ze strony Google.

A co z J2ME?

Pozostaje jeszcze na koniec pytanie, co z instniejącymi aplikacjami napisanymi w technologii J2ME. Takiej aplikacji nie można od razu uruchomić na Androidzie. Są jednak projekty takie jak ME4SE, które uzupełniają J2SE o funkcjonalność ME. Stworzona przez Poliplus specjalna jego wersja ME4android pozwala przenieść aplikację J2ME tak, aby działała na Androidzie i Dalvik’u.

Wnioski

Wygląda na to, że jeszcze przez jakiś czas jedynym językiem programowania na Androida pozostanie Java. Google musi jeszcze zaimplementować kilka ważnych mechanizmów, których brak uniemożliwia użycie innych technologii. Ciekawe jednak, że ekipie zajmującej się językiem Scala udało się zrobić to, czego nie dokonali inni. Najbardziej obiecująca jest jednak perspektywa użycia Google Gears.

kwietnia232008

Android: czy to Java, czy nie Java?

Dalvik – miasto na północnym wybrzeżu Islandii w którym żyje ok. 1500 osób. Jest typowym miastem portowym, dobrze rozwinięte jest tu rybołówstwo oraz przeróbka ryb, a także znajduje się niewielki przemysł. Zaopatrywany jest w ciepłą wodę z gorących źródeł. Mieści się tu urząd gminy oraz muzeum. W 1943 roku trzęsienie ziemi zniszczyło większość domostw w Dalvik.

- Wikipedia

Z wierzchu Java, pod maską Dalvik

Docelowym językiem programowania na Androida jest Java. Zwykle pliki z kodem źródłowym napisanym w Javie kompilowane są do plików .class, zawierających instrukcje dla wirtualnej maszyny. Instrukcje te nazywa się bytecode ‘em Javy (Java Bytecode). Kiedy uruchamiamy skompilowany program napisany w Javie, wirtualna maszyna (JVM) ładuje owe pliki do pamięci i uruchamia zawarty w nich kod. Jednak Android nie posiada JVM! Zamiast JVM, Google zdecydował się wyposażyć Androida w technologię Dalvik.

Java Reloaded

Dalvik to coś w rodzaju ulepszonej wirtualnej maszyny Javy. Java ma już swoje lata, ale od tego czasu fundamenty tej technologii nie zmieniły się. Kilkanaście lat doświadczeń z Javą i urządzeniami mobilnymi wykazały nieliczne, lecz bardzo ważne słabe punkty JVM. Sun nadal nie zdecydował się na podjęcie drastycznych kroków, aby te problemy rozwiązać. Skoro Sun nie skłania się do ulepszenia Javy jako platformy w najbliższym czasie, inżynierzy Google’a zdecydowali wziąć sprawy w swoje ręce i stworzyli własne rozwiązanie. Tak właśnie powstał Dalvik – nowoczesna wirtualna maszyna, przystosowana specjalnie do urządzeń mobilnych, gdzie szczególną uwagę należy zwrócić na małe zasoby pamięci, energii i niewielką prędkość procesorów.

Wśród narzędzi zawartych w SDK znajduje się kompilator. Kompilator ów nie tworzy jednak plików .class z bytecode’m Javy, lecz pliki .dex z bytecode’m Dalvik’a. Następnie skompilowane pliki, wraz ze strukturą katalogów i znajdującymi się w nich multimediami, zostają spakowane – zamiast do pliku .jar - do pliku .apk (Android Package). Tak przygotowana aplikacja uruchamiana jest przez wirtualną maszynę Dalvik’a.

Ma to swoje implikacje – zarówno plusy, jak i minusy. Do plusów należy zaliczyć z pewnością lepszą obsługę pamięci, lepszy Garbage Collector, większą wydajność. Z drugiej strony bytecode Dalvik’a nie jest w 100% kompatybilny z bytecode’m Javy. Nie zadziałają więc na Adnroidzie bardziej wyrafinowane sztuczki programistyczne, korzystające z Class Loader’ów czy Java Reflection API.

Prawie jak Java

Bezpośrednio przekłada się to na problemy z uruchomieniem na Androidzie projektów korzystających np. z języków takich jak Groovy, JRuby czy Jython. Ponadto pojawiają się problemy, jeśli chcemy użyć framework’ów IoC takich jak Spring, OSGi czy chociażby PicoContainer. Także iJetty - wersja popularnego, minimalistycznego serwera webowego Jetty, przygotowana specjalnie dla Androida – nie może w tej chwili samodzielnie instalować aplikacji webowych dostarczanych w plikach .war.

A więc Dalvik jest prawie jak Java. Jak wiadomo, prawie robi wielką różnicę i jeśli Google pragnie sukcesu Androida, będzie musiał podjąć pewne kroki. Na razie pojawiają się plotki o obietnicach, że w SDK pojawią się w ClassLoader’y takie jak w Javie, a także z czasem dostępne będzie też pełne wsparcie dla Reflection API.