Scala für Android mit Eclipse leicht gemacht


Ich habe bisher keine Android-Ambitionen, aber sicher einige von euch, und so habe ich diesen sehr ausführlichen Beitrag mit Erlaubnis des Autors Yves für euch übersetzt. Da ich die Anleitung nicht selbst nachvollzogen habe, kann es eventuell zu Ungenauigkeiten gekommen sein, also korrigiert mich bitte, wenn euch etwas auffällt.

Scala für Android mit Eclipse leicht gemacht

Man kann mit Scala auf Android entwickeln, und es ist nicht besonders schwierig. Trotzdem habe ich ein paar Tage gebraucht um alle relevanten Informationen zu sammeln, und eine Konfiguration zum Laufen zu bringen. Ich denke, dass euch das interessieren könnte, insbesondere weil man nicht einmal 15 Minuten braucht, um eine Umgebung aufzusetzen.

Ich bin der Ansicht, dass man als Entwickler die Möglichkeit haben sollte, so oft compilieren und testen zu können wie nötig. Alles, was einen ausbremst, wie zusätzliche Schritte im Build-Prozess (Treeshaker, ProGuard mit einem Ant-Build), sollte vermieden werden. Ich gehe davon aus, dass während des Entwicklungsprozesses vorwiegend das Android Virtual Device anstatt das tatsächlichen Gerätes verwendet wird. Weiterhin setze ich voraus, dass du kein Ant verwenden willst, sondern wie ich den integrierten Eclipse-Buildprozess.

Wenn Android neu für dich ist (wie es für mich war), kann es nicht schaden, ein paar Grundlagen zu kennen (für Android SDK 12):

  • Eine Eclipse-Umgebung für Android aufzusetzen ist nicht schwer. Das ADT-Plugin ist einfach zu installieren und zu benutzen.
  • Wahrscheinlich möchtest du wenigstens ein Android Virtual Device (AVD) aufsetzen, um dein Programm testen zu können (wenn du auf einem echten Gerät testen willst, gilt dieser Tipp nicht für dich)
  • Eine Android-Anwendung ist eine einzelne .apk-Datei, und diese kann keine Bibliotheken außer denen von Android verwenden. Das heißt, dass die Anwendung alle Bibliotheken enthalten muss, die man verwenden will. Oder man kann das Gerät so manipulieren, dass es zusätzliche Bibliotheken lädt, aber das ist natürlich keine Lösung für Anwendungen, die verteilt werden sollen.
  • Man verwendet Java/Scala zur Entwicklung, aber Android benutzt eine eigene, spezielle VM (Dalvik), und der Code muss von .class-Dateien zu Plattform-Code compiliert werden. Das wird vom dx-Compiler erledigt (man kann ihn direkt in den SDK-Tools aufrufen, aber das ist normalerweise unnötig), der eine classes.dex-Datei erzeugt. Diese Datei enthält alle Klassen der Applikation, ähnlich wie ein Jar. Das dx-Tool und die Dalvik-Plattform akzeptieren nicht alles: Einige Klassen compilieren mit dx, werden aber nicht korrekt von Dalvik geladen, und das dx-Tool ist ziemlich beschränkt bezüglich der Menge an Code, mit der es zurechtkommt. Man verwendet Werkzeuge, um den Code und die Bibliotheken auf das absolute Minimum abzuspecken (Treeshaker, ProGuard.). Insbesondere kann dx nicht die vollständige Scala-Bibliothek verarbeiten (zu groß), und Dalvik kommt nicht mit Version 2.9.0 zurecht (es scheitert beim Laden).
  • Das SDK enthält einige nützliche Werkzeuge, besonders adb, womit man bestimmte Befehle an ein laufendes virtuelles Gerät senden kann (und wahrscheinlich auch an ein echtes, aber das habe ich nicht probiert). Insbesondere kann man mit dem „adb shell“-Kommando einige eingeschränkte Unix-Befehle senden. Die Details sind im SDK beschrieben. Aber vermutlich wirst du damit nicht allzuviell zu tun haben.

Demnach ist das Problem, was wir mit Scala haben, dass wir alles von uns benötigte aus der Scala-Bibliothek in die Android-Anwendung packen müssen, aber das funktioniert nicht, weil das Ergebnis zu groß für dx ist. Die normale Lösung ist, dem Build einen Schritt zum Zurechtstutzen des Codes hinzuzufügen, aber das erfordert die Verwendung einen eigenen Ant-Builds. Das beim ADT mitgelieferte ProGuard läuft nur, wenn man tatsächlich die Applikation auf ein Gerät exportiert, um sie dort auszuführen, aber nicht bei normalen Durchläufen, und selbst wenn das möglich wäre, würde natürlich der Schrumpf-Schritt jedesmal ausgeführt werden, wenn man speichert und neu compiliert. Das wollen wir nicht.

Stattdessen muss die Umgebung, die wir haben wollen, die Scala-Bibliotheken innerhalb des virtuellen Gerätes bereitstellen (so dass dem Build-Prozess entgehen). Dazu bedienen wir uns Tipps von folgenden Seiten:

Die erste Seite verlinkt eine Liste vorcompilierter Ramdisks für Android. Ich nehme api_10, aber du kannst auch andere verwenden. Die zweite Seite verweist auf einige vorcompilierte Jars für Android. Dazu später mehr.

Selbstverständlich wollen wir die aktuellsten verfügbaren Werkzeuge:

  • Eclipse 3.7 (Indigo)
  • Android SDK release 12
  • ADT Plugin
  • Scala 2.9.0; allerdings sind wir hier aufgeschmissen, weil diese Version von Scala nach dem Compilieren für Android nicht richtig lädt (es gibt ein Problem in den Collections-Packages), deshalb verwenden wir Scala 2.8.1, das funktioniert. Und da wir ein Plugin benötigen, das unter Eclipse 3.7 arbeitet, werden wir das experimentelle 2.8.2 Release verwenden (Update-Seite)

Nun zum Kern der Sache:

  • Lade Eclipse Indigo (3.7) herunter und installiere es
  • Lade das Android SDK 12 herunter und installiere es
  • Installiere das Android ADT Plugin
  • Setze den SDK-Pfad in Einstellungen => Android
  • Lade das Android Ramdisk Image von (A) für die von dir gewünschte(n) Version(en) herunter
  • Suche darin die für dich passende ramdisk.img-Datei und kopiere sie ins Verzeichnis {android-sdk}/platforms/android-XX/images (du solltest vorher eine Kopie der ursprünglichen ramdisk.img-Datei sichern)
  • Erstelle ein virtuelles Gerät entsprechen der gerade von dir geänderten Verion. Du kannst dazu den AVD-Manager verwenden, der in Eclipse integriert ist, nacdem das ADT-Plugin installiert wurde.
  • Starte das virtuelle Gerät. Das wird etwas dauern. Nutze die Zeit für die folgenden drei Schritte.
  • Installiere das Scala-Plugin für Version 2.8.2
  • Lade von (B) die vorbereiteten Scala-Bibliotheken mit Version 2.8.1 herunter (nciht vergessen, 2.9.0 lädt nicht korrekt in Android!)
  • Entpacke sie und öffne eine Shell (cmd unter Windows), und gehe dann in das Verzeichnis, in das du die 5 Scala Jars entpackt hast.
  • Nachdem das virtuelle Gerät bereit ist, sende die folgenden Befehle in der Shell:
    • {android-sdk}/platform-tools/adb shell mkdir -p /data/framework (wenn das nicht klappt, hast du etwas in einem der vorherigen Schritte vergessen)
    • {android-sdk}/platform-tools/adb push scala-library.jar /data/framework
    • {android-sdk}/platform-tools/adb push scala-collection.jar /data/framework
    • {android-sdk}/platform-tools/adb push scala-immutable.jar /data/framework
    • {android-sdk}/platform-tools/adb push scala-mutable.jar /data/framework
    • {android-sdk}/platform-tools/adb push scala-actors.jar /data/framework
    • {android-sdk}/platform-tools/adb shell sync
  • Schließe das virtuelle Geräte und starte es neu (ich bin nicht sicher, ob das erforderlich ist)
  • Erstelle ein neues Android-Projekt in Eclipse
  • Füge irgendwo eine Scala-Datei hinzu, und rechts-klicke dann auf das Projekt: Konfiguration => Scala Natur hinzufügen

Fertig! Du kannst nun sowohl in Java wie auch in Scala entwickeln. Ich würde dringend davon abraten die Android Activity-Klasse zu „scalafizieren“, die für dich erstellt wurde. Speichern und Kompilieren ist so schnell wie man es sich wünscht. Der Programmablauf ist nur durch die Art des Emulators beschränkt, nicht durch die Verwendung von Scala.

Ich überlasse euch selbst den letzten, ultimativen Schritt der Verteilung der Anwendung auf ein Gerät. Wenn ihr das Projekt korrekt konfiguert habt, denke ich aber, dass das ProGuard (der dann und nur dann verwendet wird, wenn die Anwendung wirklich exportiert wird) problemlos erledigen wird.

Yves

Advertisements

4 Gedanken zu “Scala für Android mit Eclipse leicht gemacht

  1. Hi, vielen Dank für das gute Tutorial, genau das was ich gesucht habe. Einen kleinen Fehler habe ich entdeckt:

    {android-sdk}/platform-tools/adb mkdir -p /data/framework (wenn das nicht klappt, hast du etwas in einem der vorherigen Schritte vergessen)

    muss heißen:

    {android-sdk}/platform-tools/adb shell mkdir -p /data/framework (wenn das nicht klappt, hast du etwas in einem der vorherigen Schritte vergessen)

    Grüße
    BitSchupser

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s