Ориентация на Android с помощью Scala 2.8.

Определяющая ссылка на использование Scala на андроиде выглядит здесь: 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.

Ответы

Ответ 1

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), который только оболочка script называется 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

У конструктора Location установлено значение:

${build_project}/pguard

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

${build_project}

Также в корневом проекте Scala есть аргумент proguard file @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 в script выше).

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Мой новый @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 *; }

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

Конструктор выглядит следующим образом:

(running cygwin here, so the cat option path takes a slash)
[email protected]:/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, а не оболочка script, поэтому довольно легко переносить между Windows/Mac (и я предполагаю Linux, но еще не сделал этого), так как вы просто меняете местоположение фактического java-бинарного файла.

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

Ответ 4

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

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

Ответ 5

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