2010-08-06 2 views
27

Scala (또는 Java 이외의 다른 JVM 언어)를 Android 플랫폼에 통합하는 데 관심이 있습니다. 스칼라와 함께 안드로이드 애플리케이션을 작성하는 것에 대해서는 언급하지 않고있다. 초기에 일을 했었지만 안드로이드 플랫폼 소스 트리를 만드는 빌드 프로세스에 실제로 참여했다. 나는 이것이 메이크 파일 등에 매달리는 문제가 될 것이라고 상상한다. 누구도 이것에 대한 통찰력을 가지고 있습니까?Scala를 핵심 Android 플랫폼에 통합하는 방법은 무엇입니까?

내가 지금까지 가지고 : 플랫폼 소스 treefrom의 자식 : [다운로드 "에 의해 인도의 처녀 형태로 구축하고 구축 //android.git.kernel.org/platform/manifest.git 구글 안드로이드 [1] "

  • 빌드/코어/콤보/scalac.mk 번호 빌드/코어/definitions.mk에
  • 추가 정의 올 하위 디렉터리위한 config.mk으로 포함 스칼라 컴파일러 관련 변수를 구성 -scala-files 및 all-scala-files-under
  • 정의를 빌드하기 위해 definitions.mk에 추가 정의 파일 등 그들은 남아 어떤 패키지

에 포함되어 있는지 :

  • 스칼라 - library.jar
  • 가 -bootclasspath에 대한 변경 사항을 확인 깨진하지 않은 밖으로 아무것도
  • 그림 포함 스칼라 클래스가 자바 클래스와 비자에 의존하는 경우를 처리하는 방법
  • 코드의 주요 정리
  • 테스트! 변경으로 (여기를 게시 이외의)가 무엇을해야 하는지를
  • 그림 밖으로 나가
  • 을했습니다 나는 거의 을 것 같은

가 보이는!

일부 과거

에서 노트 최신 : 자바 소스 파일을 컴파일 어디 발견했다! definitions.mk에서 'define transform-java-to-classes.jar'를 참조하십시오. 가장 최근의 아이디어는 transform-scala-to-classes 정의를 작성한 다음 해당 클래스를 직접 패키징 된 클래스에 저장하도록하는 것입니다. transform-java-to-classes.jar에서이 단계 전에 transform-scala-to-class를 호출 할 것이다. 이클립스와 cygwin에 대한 지원은 해결 방법으로 코드를 복잡하게 만들므로 오류 가능성을 높입니다.

빌드 프로세스는 build/core/main.mk를 실행하는 루트 Makefile로 시작합니다. build/core/main.mk에는 build/core/combo/javac.mk가 포함 된 build/core/config.mk가 포함되어 있습니다. HOST_JAVAC, TARGET_JAVAC 및 COMMON_JAVAC. COMMON_JAVAC는 특수한 환경 (openjdk 또는 eclipse)이 아닌 한, 다른 두 변수가 기본적으로이 값을 갖는 것처럼 보이는 "공통 인수를 갖는 Java 컴파일러 명령"입니다. COMMON_JAVAC는이 파일 외부에서 사용되지 않습니다. 다른 두 개는 build/core/definitions.mk에서만 사용됩니다.

build/core/java_library.mk (config.mk에 포함됨)는 jar를 빌드하는 것과 관련이있는 것 같습니다. 이것은 우리를 보살 피는 범위를 벗어났습니다. jar와의 모든 상호 작용은 클래스 파일을 전제로합니다. 이는 우리가 이미 스칼라 파일을 성공적으로 작성했다는 것을 전제로합니다.

java 버전과 관련하여 main.mk에 점검 사항이 있습니다. 이것을 무시하고 스칼라 버전이 호환 가능하다고 가정합니다. 바로 지금 (콤보/scalac.mk에서) javac.mk에서 사용 된 것과 동일한 --target arg를 사용하고 있습니다. 이것은 아마도 변수에 저장되어야합니다.

main.mk에는 build/core/definitions.mk도 포함되어 있습니다.이 빌드는 몇 가지 유용한 기능을 정의합니다. 여기서 우리가 신경 쓰는 것은 all-java-files-under와 all-subdir-java-files입니다. 후자는 Android.mk 파일에서 Java 파일을 찾는 데 사용됩니다. 전자는 후자의 구현에 사용됩니다. 나는 그것들과 동등한 스칼라를 작성할 것이다.

빌드 프로세스가 어떻게 작동 하는지를 파악하기 위해 make를 -n 및 기타와 함께 실행하고 있습니다. 나는 stackoverflow 기사 "[makefiles 디버깅 도구] [2]"에서이 아이디어를 얻었습니다. 나는 또한 리메이크로 디버깅을 조사하고있다.

build/core/{config.mk, definitions.mk}는 make 파일/명령이 어떤 작업을 수행하는 데 사용되는지 알려줍니다.

프로젝트 기반별로 지원을 해킹 할 수있는 방법으로 프로젝트의 Android.mk 파일에 추가 코드가 추가 될 가능성이 높습니다. platform/build/core/build-system.html에서 "Android.mk는 주어진 모듈의 빌드를 제어하는 ​​메이크 파일 조각의 표준 이름입니다. 최상위 디렉토리에만"Makefile "이라는 파일이 있어야합니다." 마지막 make 전에 "scala-build"와 같은 새로운 타겟을 생성하고이를 실행 (PackageName scala-build를 만든다) 할 수있다. 하나는 변수 할당에 몰래 숨길 수 있으므로 명시 적으로 대상을 호출 할 필요가 없습니다.

또 다른 방법 (훨씬 더 hackish)은 javac에 사용되는 명령을 납치하는 것입니다. 이것은 build/core/combo/javac.mk에서 설정됩니다. 프로젝트의 Android.mk는 * .java 파일과 함께 LOCAL_SRC_FILES에 * .scala 파일을 포함해야합니다.

+0

나는 이것에 관해서 안드로이드 건물 메일 링리스트에서 물어볼 것이다. https://groups.google.com/group/android-building –

답변

7

붉은 색 바탕에있는 사람들은 개미 here과 함께 Android로 스칼라를 통합하는 방법에 대한 자습서가 있습니다.

+0

시도해 보겠습니다. 감사! – Octoberdan

+0

@Octoberdan이 진행 상황을이 스레드에 알릴 수 있다면 정말 멋지 겠죠. – folone

+0

나는 주말 동안 떨어져 있었지만 방금 돌아왔다. 내일까지 갈 시간이 없다. 나는 너를 확실히 알릴 것이다! – Octoberdan