2008-10-23 3 views
54

에서 Dalvik의 VM에있는 거의 모든 Java를 실행할 수 있다는 것을 알고 있습니다. Java의 VM에 있지만 그 제한 사항은 분명하지 않습니다. 누구든지 큰 걸림돌을 밟았습니까? 주요 라이브러리에 문제가 있습니까? Java 바이트 코드 (스칼라, 자이 썬 등 ...)로 컴파일되는 언어는 예상대로 작동하지 않습니까?Sun VM에서 할 수있는 Dalvik VM (Android VM)에서 수행 할 수없는 작업은 무엇입니까?

답변

32

Dalvik은 표준 Java 바이트 코드와 거의 같은 방식으로 처리하지 않거나 처리하지 않을 많은 것들이 있지만 대부분은 상당히 고급입니다.

가장 심각한 예는 런타임 바이트 코드 생성과 사용자 정의 클래스 로딩입니다. 바이트 코드를 생성 한 다음 클래스 로더를 사용하여로드하려고합니다. 일반 머신에서이 트릭이 작동하면 바이트 코드 생성을 변경하지 않는 한 Dalvik에서 작동하지 않을 것입니다.

그렇기 때문에 특정 종속성 삽입 프레임 워크를 사용하지 못하게됩니다. 가장 유명한 예로 Google Guice가 있습니다. 반면에 AspectJ는 바이트 코드 도구를 컴파일 단계로 사용하기 때문에 작동해야한다.

다른 jvm 언어에 관해서는 결국 표준 바이트 코드로 컴파일되고 런타임시 바이트 코드 계측을 사용하지 않는 것은 Dalvik으로 변환 할 수 있으므로 작동해야합니다. 사람들이 안드로이드에서 자이 썬을 실행했고 괜찮 았던 것을 압니다.

다른주의해야 할 점은 시간 컴파일은입니다. 이것은 엄격하게 Dalviks 문제가 아닙니다 (원한다면 언제든지 바이트 코드를 컴파일 할 수 있지만) Android는이를 지원하지 않으므로 그렇게하지 않을 것입니다. 표준 Java에 대한 마이크로 벤치 마크가 효과적이지 않은 반면에 구성 요소는 테스트에서 대형 시스템의 부분과 다른 런타임 특성을 가졌으므로 안드로이드 전화 용 마이크로 벤치 마크는 완전히 의미가 있습니다.

+6

몇 가지 업데이트 : Android에서 작동 할 Guice의 특수 빌드가 있습니다. http://code.google.com/p/google-guice/downloads/detail?name=guice-2.0-no_aop.jar Google에는 Android 용 JIT 팀이 있습니다. http : // groups.google.com/group/android-platform/browse_thread/thread/331d5f5636f5f532 –

+10

Android Froyo에서 추적 단위 세부 JIT 컴파일러를 지원합니다. – Wonil

+2

Google Guice에서 정상적으로 작동합니다. android에서 guice를 사용하는 방법은 http://roboguice.org를 확인하십시오. – emmby

11

Google IO 세션이 "Dalvik Virtual Machine internals"인 경우 Dalvik은 generational GC을 지원하지 않습니다.

따라서 개체를 자주 만들고 삭제할 때 성능이 저하 될 수 있습니다. Java VM는 generational GC를 지원하므로 같은 상황에서 GC 성능이 향상됩니다.

또한 Dalvik은 방법 세분성 JIT 대신 trace-granuality JIT을 사용합니다.

2

여기에 추가 할 수있는 또 다른 사항은 리플렉션 API를 사용하여 클래스 필드를 나열 할 때 Dalvik이 필드 순서를 유지하지 않는다는 것입니다. 이제 리플렉션 API는 어쨌든 어떤 보증도하지 않습니다. 이상적으로는 어쨌든 의존해서는 안되며 다른 VM의 대부분은 입니다.은 순서를 유지합니다.

-1

대화에 추가하기 만하면 이전 스레드를 다시는 재생할 수 없습니다. 방금 검색을 통해이 항목을 실행했으며 자이 썬이 Dalvik과 함께 상자에서 작동하지 않는다고 덧붙이고 싶습니다. hello world 예제를 수행하면 다음과 같은 결과를 얻을 수 있습니다.

관련 문제