Android, Скала и Proguard

После того, как я столкнулся с таким количеством проблем, сколько существует перестановок набора инструментов командной строки Android, мне наконец удалось скомпилировать смесь исходного кода Scala и Java в пригодный для использования apk.

Как многие предполагают, я использовал proguard для сжатия библиотеки Scala через инструмент dex. Проблема в следующем:

BUILD SUCCESSFUL
Total time: 1 minute 29 seconds

Полторы минуты. Здесь мы говорим о приложении со сложностью Hello-World. Я не думаю, что смогу так развиваться. Мне нужно будет пройти курсы медитации.

Это конфигурация proguard:

-injars ${out.absolute.dir}/classes:${scala-library.jar}(!META-INF/MANIFEST.MF,!library.properties)
-outjars ${out.absolute.dir}/classes.min.jar
-libraryjars ${android.jar}
-dontwarn
-dontoptimize
-dontobfuscate
-keep public class * extends android.app.Activity

Есть ли способ ускорить шаг proguard?

Редактировать: я запускаю это на довольно приличном двухъядерном компьютере с 3 ГБ оперативной памяти поверх 64-битного Linux. Выполнение ant compile (scalac/javac) занимает 3 секунды. Полный ant install занимает 1:30, как описано выше. Это шаг proguard, который «зависает», согласно выходным данным, скорее всего, из-за размеров библиотеки среды выполнения scala/android.


person slezica    schedule 09.10.2011    source источник
comment
нам нужны некоторые дополнительные сведения, например, настройка вашей машины, т. е. количество процессоров, оперативной памяти и т. д.   -  person Fred Grott    schedule 09.10.2011
comment
предположительно компилятор будет узким местом, какой компилятор вы используете?   -  person Fred Grott    schedule 09.10.2011
comment
См. также: proguard.sourceforge.net/manual/examples.html#scala . Я думаю, что это не компилятор является узким местом, а просто 8,5 МБ среды выполнения scala требуют довольно много времени для чтения и упаковки.   -  person Rogach    schedule 09.10.2011
comment
Вам не нужен шаг proguard при тестовых прогонах. Вы также можете не использовать proguard для тестов, если эмулятор может работать с большим размером.   -  person Daniel C. Sobral    schedule 09.10.2011
comment
@Daniel - к сожалению, proguard всегда необходим - библиотеки слишком велики, чтобы поместиться в формат файла dex Dalvik :-( Это так же верно как для эмулятора, так и для реального устройства. И вы должны знать, что нет разумного решения на все для 2.9.1 :-( См. groups.google.com/group /scala-debate/browse_thread/thread/ для описания причин.   -  person Paul Butcher    schedule 09.10.2011
comment
Скорость компиляции значительно улучшится, если вы переместите библиотеки scala на AVD и пропустите шаг proguard. проверьте это и это   -  person Jamil    schedule 09.10.2011
comment
@ Джамиль, это звучит довольно разумно, я посмотрю и вернусь!   -  person slezica    schedule 09.10.2011
comment
@Paul Вам не нужно запускать тесты в dex. Тесты можно запускать в простом байт-коде JVM — зависимости имитируются, а пользовательского интерфейса нет.   -  person Daniel C. Sobral    schedule 09.10.2011
comment
@ Даниэль, извини, я запутался. Эмулятор не может запускать байт-код напрямую, AFAIK, только файлы dex. Вы можете запускать тесты вне эмулятора с помощью Robolectric, что является отличным выбором для некоторого кода, но не всегда уместно. Или я что-то упускаю?   -  person Paul Butcher    schedule 10.10.2011
comment
@ Пол Тесты. Модульные тесты — вам не нужно тестировать бизнес-логику с помощью эмулятора, потому что это просто код Scala.   -  person Daniel C. Sobral    schedule 10.10.2011
comment
@ Даниэль - хорошо, понял. Ваш комментарий, пока эмулятор может обрабатывать большой размер, меня смутил :-)   -  person Paul Butcher    schedule 10.10.2011
comment
@Paul Извините, речь шла о том, чтобы не запускать proguard, но все же генерировать dex, о чем вы меня поправили.   -  person Daniel C. Sobral    schedule 10.10.2011
comment
Попробуйте AndroidProguardScala, если вы используете Eclipse. github.com/banshee/AndroidProguardScala Ускоряет цикл за счет кэширования предыдущих запусков proguard и использования кэшированных версий. если возможно.   -  person James Moore    schedule 16.07.2012


Ответы (3)


Работа через сборки Android Ant, вероятно, неправильный способ сделать это.

Текущий «лучший совет» — использовать SBT с

плагины.

person Kevin Wright    schedule 09.10.2011
comment
Согласованный. Но помните о проблемах с 2.9.1, о которых я упоминал в своем комментарии выше. Можно установить библиотеки Scala (2.8.x) на устройство и избежать шага proguard, как описано здесь: zegoggl.es/2011/07/, но имейте в виду, что есть некоторые проблемы (насколько я знаю, еще не исправленные) с самая последняя версия Android SDK. - person Paul Butcher; 09.10.2011
comment
Я еще не пробовал SBT, но я не понимаю, как это может помочь. Разве он не выполняет автоматически тот же запуск proguard, который я запланировал вручную? - person slezica; 09.10.2011
comment
Обратите внимание, что proguarding теперь является частью подключаемого модуля sbt для Android (не пугайтесь вводящего в заблуждение и неверного сообщения о лицензии, которое он отображает, см. github.com/jberkel/android-plugin/issues/129) - person ron; 24.05.2012

ProGuard сжимает библиотеку Scala 2.9.1 намного дольше, чем библиотеку Scala 2.8.1 (54 секунды против 13 секунд, для 8,5 МБ против 6,2 МБ). Либо структура библиотечных классов принципиально изменилась, либо некоторые новые классы вызывают чрезмерные вычисления. Мне нужно выяснить, можно ли улучшить ProGuard или его конфигурацию для этого случая. На данный момент вы можете работать со Scala 2.8.1.

Я предполагаю, что ваша конфигурация ProGuard также содержит необходимые параметры для Android и Scala, как описано в руководстве по ProGuard. . Если вы используете обычный процесс сборки Android, входные данные (classes, libs) и библиотеки (android.jar) уже указаны для вас в файле сборки Ant, и вам не нужно указывать их снова в файле конфигурации ProGuard. Чтение их дважды просто займет время и выдаст много предупреждений (которые вы полностью отключили — безопаснее отключать их выборочно).

person Eric Lafortune    schedule 09.10.2011
comment
Несмотря на то, что это заняло больше времени, я столкнулся со странными проблемами с Proguard и Scala 2.9.1. После обфускации усадка удаляет базовые вещи Scala, такие как Traversable или HashMap.foreach и т. д. Таким образом, это приведет к сбою программы с axy класса ClassNotFoundError (и т. д.) proguard_map указывает axy на вышеупомянутые и используемые объекты Scala. - person vertti; 14.10.2011
comment
@vertti Обработанная программа HelloWorld (в сочетании со Scala 2.9.1) работает нормально, когда я пробую ее, поэтому мне понадобятся дополнительные сведения о вашем коде. Если вы разместите отдельный вопрос здесь или на справочном форуме ProGuard, я рассмотрю его. - person Eric Lafortune; 15.10.2011
comment
Спасибо, я попробую, но моя текущая игра состоит примерно из 6000 строк scala, и вырвать функциональную часть, которая все еще ломает proguard, может оказаться трудным. - person vertti; 15.10.2011
comment
Спасибо за вашу помощь (в системе отслеживания ошибок proguard). Для других: Мои проблемы оказались связаны с файловой системой Windows, а не со Scala (см. последнюю запись по адресу: proguard.sourceforge.net/manual/limitations.html) - person vertti; 18.10.2011
comment
См. это: scalandroid.blogspot.com/2012/03. / - Scala 2.10 снова будет работать с proguard - person ron; 05.05.2012
comment
@Eric Если вы беспокоитесь о том, чтобы столкнуться с зарезервированными именами устройств в Windows, вы можете использовать префикс \\?\ в именах файлов, чтобы обойти это. Или просто исключите их из генератора имён файлов; их не очень много. - person Antimony; 01.07.2013

Если у вас есть рутированный телефон и вы хотите только протестировать его, вы можете установить библиотеки scala прямо на свой телефон, поэтому вам больше не нужен шаг proguard:

https://github.com/jrudolph/scala-android-libs

person Fabian    schedule 11.10.2011