Android, Scala и 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?

Редактиране: Пускам това в доста прилична двуядрена, 3GB ram машина, върху 64-битов Linux. Изпълнението на ant compile (scalac/javac) отнема 3 секунди. Пълен ant install отнема 1:30, както е описано по-горе. Това е стъпката proguard, която „замръзва“, според изхода, най-вероятно поради размерите на библиотеката за изпълнение на scala/android.


person slezica    schedule 09.10.2011    source източник
comment
имаме нужда от още подробности, например вашата настройка на машината..т.е. брой процесори, RAM и т.н.   -  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 Mb време за изпълнение на 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 libs в 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
@Daniel - съжалявам, объркан съм. Емулаторът не може да изпълнява байт код директно AFAIK, само dex файлове. Можете да изпълнявате тестове извън емулатора с Robolectric, което е отличен избор за някои кодове, но не винаги е подходящо. Или пропускам нещо?   -  person Paul Butcher    schedule 10.10.2011
comment
@Paul Тестове. Единични тестове -- не е необходимо да тествате бизнес логиката с емулатора, защото това е просто обикновен Scala код.   -  person Daniel C. Sobral    schedule 10.10.2011
comment
@Daniel - Добре, разбрах те. Вашият коментар, стига емулаторът да може да се справи с големия размер, ме обърка :-)   -  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 MB срещу 6,2 MB). Или структурата на библиотечните класове се е променила фундаментално, или някои нови класове причиняват прекомерни изчисления. Ще трябва да разбера дали 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. След обфускацията shrinkin премахва основни неща на scala като Traversable или HashMap.foreach и т.н. Така че това ще доведе до неуспех на програмата с ClassNotFoundError клас axy (и т.н.) 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 bug tracker). Към други: Проблемите ми се оказаха свързани с файловата система на 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 libs директно на телефона си, така че вече да не се нуждаете от стъпката proguard:

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

person Fabian    schedule 11.10.2011