Предназначаясь для Android с Магистральными сборками Scala 2.8

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

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

Так... Что шаги необходимы для использования Scala 2.8 в проекте андроида? Предпочтительно с помощью затмения и инструментов Android, которые Google предоставляет для того IDE.

14
задан Kevin Wright 3 May 2010 в 21:46
поделиться

4 ответа

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

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

В проекте scala я добавляю билдер (Builder > New), который является просто shell-скриптом под названием 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 @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 будет собирать все в рабочей области, поэтому, когда вы нажмете кнопку go, оба проекта будут собраны.

11
ответ дан 1 December 2019 в 14:10
поделиться

После долгих исследований выяснилось, что 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
ответ дан 1 December 2019 в 14:10
поделиться

Теперь я использую модификацию своего предыдущего ответа для запуска в 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.

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

2
ответ дан 1 December 2019 в 14:10
поделиться

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

-1
ответ дан 1 December 2019 в 14:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: