2011-10-09 4 views
11

headfirst를 Android 명령 행 도구 세트의 순열만큼 많은 문제로 실행 한 후에 마침내 스칼라 및 Java 소스 코드를 사용 가능한 apk로 혼합하여 컴파일했습니다.안드로이드, 스칼라 및 프로 가드

많은 사람들이 제안한 바대로 proguard을 사용하여 dex 도구를 통해 스칼라 라이브러리를 집어 넣었습니다. 문제는 다음과 같습니다.

BUILD SUCCESSFUL 
Total time: 1 minute 29 seconds 

1 분 반. 우리는 여기에 Hello-World 복잡성이있는 응용 프로그램을 말합니다. 나는 내가 그런 식으로 발전 할 수 있다고 생각하지 않는다. 명상 수업을 받아야 겠어.

-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 구성은?

편집 : 저는 64 비트 Linux를 기반으로 한 3 기가비트 램 머신 인 듀얼 코어에서 실행하고 있습니다. ant compile (scalac/javac)의 실행에는 3 초가 소요됩니다. 위에서 설명한대로 전체 ant install은 1:30 걸립니다. proguard 단계는 출력에 따라 스칼라/안드로이드 런타임 lib 크기로 인해 "멈추는"단계입니다.

+0

우리가 좀 더 필요 세부 사항, 예를 들어 기계 설정 .. CPU 번호, 숫양 등. –

+0

아마도 컴파일러는 컴파일러가 병목이 될 것입니까? –

+0

참고 : http://proguard.sourceforge.net/manual/examples.html # scala. 컴파일러에 병목 현상이있는 것은 아니지만 8.5Mb의 스칼라 런타임은 읽기와 압축에 꽤 오래 걸립니다. – Rogach

답변

7

안드로이드를 통한 작업 Ant 빌드는 아마도이 문제를 해결하는 올바른 방법이 아닙니다.

현재 "최고의 조언"는

플러그인과 함께 SBT를 사용하는 것입니다.

+1

동의 함. 그러나 위의 제 의견에서 언급 한 2.9.1의 문제점을 알고 있어야합니다. 장치에 Scala (2.8.x) 라이브러리를 설치하고 여기에 설명 된 Proguard 단계를 피할 수 있습니다. http://zegoggl.es/2011/07/how-to-preinstall-scala-on-your- android-phone.html 그러나 안드로이드 SDK의 가장 최신 버전으로 몇 가지 이슈 (내가 아는 한 아직까지 수정하지 않음)를 알고 있어야합니다. –

+1

아직 SBT를 시도하지는 않았지만 어떻게 도움이되는지 이해할 수 없습니다. 수동으로 예약 된 동일한 프로 가드를 자동으로 실행하지 않습니까? – slezica

+0

proguarding은 이제 sbt android 플러그인의 일부입니다 (표시되는 오도 된 잘못된 라이센스 메시지를 두려워하지 마십시오. httwww://github.com/jberkel/android-plugin/issues/129 참조) – ron

5

ProGuard는 Scala 2.9.1 라이브러리를 축소하는 데 Scala 2.8.1 라이브러리보다 훨씬 오래 걸립니다 (8.5 초 vs. 6.2 초에 비해 54 초 vs. 13 초). 라이브러리 클래스의 구조가 근본적으로 변경되었거나 새로운 클래스가 과도한 계산을 유발하고 있습니다. 이 경우 ProGuard 또는 그 구성을 향상시킬 수 있는지 알아봐야합니다. 지금은 Scala 2.8.1로 작업 할 수 있습니다.

ProGuard manual에서 설명한대로 ProGuard 구성에 Android 및 스칼라에 필요한 옵션이 포함되어 있다고 가정합니다. 일반 Android 빌드 프로세스를 사용하는 경우 입력 (classes, libs) 및 라이브러리 (android.jar)가 Ant 빌드 파일에 이미 지정되어 있으므로 ProGuard 구성 파일에서 다시 지정하지 않아도됩니다. 두 번 읽는 것은 시간이 걸리고 많은 경고를 생성합니다 (이 스위치는 완전히 꺼 졌으므로 선택적으로 스위치를 끄는 것이 안전합니다).

+0

복용에도 불구하고 더 이상 Proguard 및 Scala 2.9.1에서 이상한 문제가 발생합니다. obfuscation 후에 shrinkin은 Traversable이나 HashMap.foreach와 같은 기본 스칼라를 제거합니다. 따라서 ClassNotFoundError 클래스 Axy (등등) proguard_map 포인트를 사용하여 위에서 언급 한 스칼라 객체로 프로그램을 실패하게 만듭니다. – vertti

+0

@vertti 처리 된 HelloWorld 프로그램 (Scala 2.9.1과 결합)은 잘 실행되면 코드에 대한 자세한 내용을 알아야합니다. 여기 또는 ProGuard의 도움말 포럼에 별도의 질문을 게시하는 경우 살펴 보겠습니다. –

+0

고마워, 노력 하겠지만, 현재의 게임은 약 6000 줄의 스칼라이고, 여전히 프로 가드를 부수는 기능적인 부분을 추출하는 것은 어려울 수도있다. – vertti

3

당신은 뿌리 전화가 단지 당신이 더 이상 난독 화 단계 필요가 없습니다 귀하의 휴대 전화에서 직접 스칼라 libs와를 설치할 수 있습니다이를 테스트하려면 :

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