Ориентация на Android с помощью сборок магистрали Scala 2.8 - PullRequest
14 голосов
/ 04 мая 2010

Окончательная ссылка для использования Scala на Android, кажется, здесь: http://www.scala -lang.org / node / 160

К сожалению, все ссылки на использование scala с android основаны на Scala 2.7 и ссылаются на пользовательскую сборку android-library.jar, с парой загадочных ссылок, предполагающих, что эта пользовательская сборка не нужна для более поздних версий android (Я использую 2.1 / API v7)

Итак ... Какие шаги необходимы для использования Scala 2.8 в проекте Android? Предпочтительно использовать eclipse и инструменты Android, которые Google предоставляет для этой IDE.

Ответы [ 5 ]

11 голосов
/ 04 мая 2010

Edit:

Мой новый способ сделать это - использовать мой плагин Eclipse: https://github.com/banshee/AndroidProguardScala (файл readme содержит инструкции по установке и указатель на обычный сайт обновлений Eclipse).

Старый ответ все еще работает, но новый способ просто лучше.

[Старый путь] Мой подход:

  • Используйте обычные инструменты Android / eclipse для создания проекта Java.
  • Добавить второй проект, содержащий код Scala. Таким образом, я могу сохранить сгенерированный код для дальнейшего использования (я новичок в Android и Scala). Этот проект может ссылаться на android.jar.
  • Проект scala создает файл jar, который используется в проекте java
  • Используйте proguard, чтобы раздеть библиотеку. Я считаю, что это избавляет от необходимости scala-android.jar, который использовался в 2.7

Хотя я не использовал это для чего-то более амбициозного, чем привет, мир, так что воспринимай это как набор подсказок.

В проекте scala я добавляю строитель (Builder> New), который представляет собой просто сценарий оболочки с именем pguard в корневой директории проекта, содержащий:

#!/bin/sh
cd $1
PROGUARD=$HOME/dev/proguard/lib/proguard.jar
LIBS=
OUTPUT=lib/proguard.jar
rm -f $OUTPUT
AJAR=/Users/jamesmoore/dev/android-sdk-mac_86/platforms/android-7/android.jar
# java -jar $PROGUARD -injars 'bin:lib/scala-library.jar(!META-INF/MANIFEST.MF,!library.properties)' -outjar $OUTPUT -libraryjars  @proguard.txt
java -Xmx1g -jar $PROGUARD -injars 'bin:lib/scala-library.jar(!META-INF/MANIFEST.MF,!library.properties)' -outjar $OUTPUT -libraryjars $AJAR @proguard.txt

Местоположение строителя установлено на:

${build_project}/pguard

И рабочий каталог, и аргументы установлены на

${build_project}

Также в корне проекта scala есть файл аргументов proguard @ proguard.txt:

-dontwarn
-dontoptimize
-dontobfuscate
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keep public class com.banshee.** {
    public protected *;
}

Вы, конечно, захотите изменить аргументы -keep, чтобы сохранить свой собственный код.

В проекте java я добавляю файл jar, созданный проектом scala (я использую lib / proguard.jar в приведенном выше сценарии).

Не добавляйте проект scala как необходимый проект в путь сборки проекта java. Это добавит файлы классов scala в дополнение к файлу jar и запутает dex (поскольку он получит как файлы .class, так и те же вещи в jar). Насколько я могу судить, Eclipse построит все в рабочей области, поэтому, когда вы нажмете кнопку «Перейти», оба проекта будут собраны.

3 голосов
/ 05 мая 2010

После долгих исследований действительно похоже, что Proguard необходим для поддержания размера и скорости развертывания приложения на разумных уровнях.

К сожалению, нет подходящего способа встроить Proguard в качестве шага сборки. Возможно использование сценариев, но мне также нужно поддерживать среды Windows, Linux и OSX.

Я также не был уверен насчет решения с двумя проектами, поскольку оно препятствовало использованию Scala-кода сгенерированного файла ресурсов R.java, что я хотел сделать.

В конце концов, я смог заставить и SBT, и Ant создать приложение для Android 2.1, используя Scala 2.8. Ant был любимым окончательным решением, поскольку он работает с той же файловой организацией, что и плагин eclipse для Android. Я написал решение здесь: http://scala -ide.assembla.com / wiki / show / ae55a-oWSr36hpeJe5avMc / Developing_for_Android

Затем Eclipse запускает Ant в качестве внешнего инструмента для упаковки и установки приложения.

2 голосов
/ 08 мая 2010

Я сейчас использую модификацию моего предыдущего ответа для запуска в Windows: просто переместите все в @ proguard_windows.txt, чтобы вам не пришлось беспокоиться о запуске в качестве скрипта.

Мой новый @ proguard_windows.txt выглядит так:

-injars bin;lib/scala-library.jar(!META-INF/MANIFEST.MF,!library.properties)

-outjar gen/scandroid.jar

-libraryjars lib/android.jar

-dontwarn
-dontoptimize
-dontobfuscate
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keep public class com.banshee.** { public protected *; }
-keep public class org.xml.sax.EntityResolver { public protected *; }

И обратите внимание, что в Windows вам нужно использовать точку с запятой для -injars. Противный.

Строитель выглядит так:

(running cygwin here, so the cat option path takes a slash)
James@Greine:/cygdrive/c/Users/james/workspace/Scala2$ cat .externalToolBuilders/proguard.launch
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType">
<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="C:\Windows\System32\java.exe"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,incremental,auto,"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-Xmx1g -jar lib/proguard.jar @proguard_windows.txt"/>
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${build_project}"/>
</launchConfiguration>

Вы захотите поместить это в .externalToolBuilders / proguard.launch.

Интересно то, что это просто команда java, а не какой-либо сценарий оболочки, поэтому довольно легко портировать между Windows / Mac (и я предполагаю, что Linux, но еще не сделал этого), так как вы просто меняете расположение фактического двоичного файла Java.

(Представив это как новый ответ, потому что он немного отличается от того, который был помечен как правильный (ish) ответ)

0 голосов
/ 27 апреля 2011

Я использую Proguard, чтобы трясти библиотеку Scala в сборках Eclipse / ADT, но это оставляет желать лучшего. Он медленный и портит другие файлы .class, поэтому вам приходится перестраивать проект чаще, чем нет.

Вдохновленный этими вопросами и некоторыми проблемами в трекере проблем Android, я создал еще один инструмент (на основе Jar Jar Links), который теперь я использую для создания древовидной библиотеки scala. На этом этапе сборки я на самом деле довольно доволен ситуацией с Eclipse + ADT Scala на Android. Может быть, это будет работать для вас тоже, дать ему вращение, это доступно от http://code.google.com/p/treeshaker/

0 голосов
/ 12 мая 2010

Если вам удобно использовать инструмент сборки Gradle, то плагин Android для Gradle делает весь этот процесс чрезвычайно простым. Смотри: http://wiki.github.com/jvoegele/gradle-android-plugin/

...