Programowanie Scala dla Androida

258

Postępowałem zgodnie z samouczkiem na Scali i Androidzie ze Scala 2.7.3 wersja ostateczna. Powstała aplikacja na Androida działa, ale nawet najbardziej podstawowa aplikacja potrzebuje kilku minut (!) Na skompresowanie i wymaga skompresowania 900 kb , co jest ogranicznikiem dla aplikacji mobilnych. Ponadto w środowisku IDE co jakiś czas brakuje pamięci. Zakładam, że dexnie jest stworzony dla dużych bibliotek takich jak scala-library.

  • Więc moje pytanie brzmi: czy ktoś rzeczywiście to zrobił i czy jest na to jakieś lekarstwo?
Lemmy
źródło

Odpowiedzi:

128

Napisałem kilka podstawowych aplikacji na Androida w Scali, nic nadzwyczajnego. Nie będąc programistą Java zaproponowano mi użycie „drzewka”, przyjaciel wyjaśnił mi, że usuwa wszystkie niepotrzebne biblioteki z plików jar .

Nie udokumentowałem tego, ale odkryłem, że ktoś już ma:

http://chneukirchen.org/blog/archive/2009/04/programming-for-android-with-scala.html

Proguard nie jest jedynym rozwiązaniem, możesz znaleźć coś, co będzie pasować do twojego przepływu pracy lub bardziej pasuje do twojego środowiska.

Dodatkowo Google właśnie wdrożył JACK, który zajmuje się dość dużą redukcją czasu kompilacji i pamięci, patrz https://source.android.com/source/jack.html


źródło
3
Dziękuję Ci! Będę musiał to wypróbować. Zastanawiam się, czy można go używać z Eclipse (przy użyciu wtyczek Scala i Android)
Lemmy
36
Lemmy - czy jest jakiś powód, dla którego nie zaakceptowałeś tej odpowiedzi? Być może znalazłeś lepsze rozwiązanie?
Bostone
3
Z mojego doświadczenia wynika, że ​​trzęsienie drzew nie jest wystarczające dla większości nietrywialnego kodu Scala. Po prostu nie jest wystarczająco agresywny.
James Moore,
45

Możesz teraz używać wtyczki Android dla Gradle do tworzenia aplikacji na Androida w Scali. Zawiera narzędzie ProGuard do przycinania tłuszczu z wynikowego pliku APK, więc wydaje się, że spełnia twoje potrzeby.

https://github.com/jvoegele/gradle-android-plugin/wiki

Jason Voegele
źródło
Działa świetnie! Żadne z rozwiązań, które wypróbowałem, nie działało od razu po wyjęciu z pudełka, ale wtyczka Gradle dostarczyła mi przydatnych informacji zwrotnych, dzięki czemu mogłem łatwo naprawić to, co poszło nie tak.
Mendelt,
Jason, nadal nad tym pracujesz? Ostatnie zatwierdzenie miało miejsce 9 miesięcy temu i od tego czasu wersje zostały zderzone
Peter Ajtai,
Peter, rozwój został zatrzymany z powodu faktu, że Gradle jest teraz natywnym systemem kompilacji dla Androida.
Jason Voegele,
22

Istnieje również wtyczka do konstruktora opartego na Scali sbt : sbt-android-plugin .

Jan Berkel
źródło
1
Ta wtyczka nie jest kompatybilna z najnowszymi wersjami SBT. Nadal utrzymujesz tę wtyczkę? Plugin SBT, że jest kompatybilny z najnowszymi wersjami tego android-sdk-plugin .
DCKing
15

Zweryfikowałem to szczegółowe rozwiązanie za pomocą Eclipse 3.7, Scala 2.10 i wtyczki AndroidProguardScala v50:

https://stackoverflow.com/a/11084146/1287856

Wszystko dziala. Prosta aplikacja testowa ze skalowaną główną klasą aktywności zajmuje tylko 38 KB. Obsługiwane są projekty bibliotek. Program Proguard jest aktywowany podczas eksportowania projektu.

Mikaël Mayer
źródło
3
Brzmi niesamowicie. Jak wyglądają czasy kompilacji z tym rozwiązaniem podczas wdrażania na urządzeniu (w porównaniu do wdrażania porównywalnego projektu Java na Androida)?
evilcandybag
1
Czas kompilacji wynosi około 10 sekund podczas wdrażania na urządzeniu. Mam nadzieję, że kiedyś będzie szybciej.
Mikaël Mayer
6
Teraz trwa około 1 sekundy z najnowszym Androidem SDK i wtyczką ze względu na nową dobrą implementację pamięci podręcznej.
Mikaël Mayer
7

Tworzenie aplikacji na Androida dla Scali stale się rozwija. Obecny najlepszy sposób na to wydaje się SBT w połączeniu z wtyczką Android-SDK , która jest utrzymywana * i działa dobrze dla mnie w moim projekcie Scala / Android. Nieco Ostatnim przykładem, który demonstruje użycie tej wtyczki z wspomnianego już Scaloid można znaleźć również .

Pamiętaj, że to pytanie jest typowym przykładem pytania z nieaktualnymi odpowiedziami na temat przepełnienia stosu. Ta odpowiedź prawdopodobnie również stanie się nieaktualna.

* Wydaje się, że w innych projektach opartych na SBT wymienionych w tym wątku odpowiedzi nie napisano dla nich kodu w ciągu ostatnich sześciu miesięcy w momencie pisania. Mogą mieć problemy ze zgodnością z nowszymi wersjami Scali i SBT.

DCKing
źródło
6

Jeśli używasz maven, użyj android-scala-test jako szablonu startowego. Działa świetnie dla mnie od razu po wyjęciu z pudełka.

Scaloid to opakowanie API systemu Android napisane w Scali, które pomaga pisać program na Androida w stylu Scala.

pocorall
źródło
4

Możesz używać Scali na Androidzie bez SBT, zbudowanego zewnętrznie przez Gradle do tworzenia aplikacji na Androida. https://github.com/yareally/android-scala-intellij-no-sbt-plugin

Gradle to bardziej natywne narzędzie do budowania dla Androida niż SBT.

Istnieje dobry przykład koncepcji rozwiązania Scala po stronie klienta i serwera, a także narzędzie do budowania stopni jako postęp w środowisku roboczym IntelliJ IDEA.

Ogromny postęp, że podstawowe klasy są wspólne dla klienta i serwera.

https://github.com/ghik/akkdroid

Dobry samouczek dla IDEA i wtyczki do Androida: http://fxthomas.github.io/android-plugin/

mikowiec
źródło
3

Największym problemem związanym ze Scalą na Androida są czasy kompilacji.

Prawdopodobnie z powodu kompilacji stripingu klasy Proguard z wtyczką IDEA13 / Scala na podwójnym czterordzeniowym procesorze E5450 Xeon z 8 GB może zająć dwie minuty lub dłużej.

Po prostu wróciłem do Javy po ukończeniu dużego projektu Scala Android, ponieważ czasy kompilacji były zbyt frustrujące.


źródło