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.
