Dalvik Virtual Machine
[Intro]
처음에 Android의 소식을 들었을 때는 조금 의.아.해 했습니다.
구글같은데서 어찌하여 Java를 사용했는가... 하는 의구심이 들었죠.
"과연 이게 될까?"
구글은 저의 생각보다 훨씬 많은 준비를 해왔고, 또 실천해 왔습니다.
처음에 SDK를 발표했을때 보다 제법 많은 시간이 지났죠. 얼마전에 SDK버전도 1.1로 올라갔더군요.
처음 SDK를 발표 했을 때와 지금의 사정은 많이 다릅니다. 생각보다 Android의 필요성이 점점 높아지고, 찾는 사람들도 많아졌습니다.
물론 아직 유저들에게 성큼 다가가지는 않아서 유저들이 찾는것은 아니지만, 이미 많은 벤더들이 Android를 찾고 있습니다.
사정이 이렇다 보니 Android에 무언가 특별한 기능을 넣고자 저희 회사의 솔루션을 찾는곳이 늘어나고 있는 추세입니다.
그리하여 제가 어쩔 수 없이 제가 Android를 맏게 되었죠. 처음에 Android에 가졌던 의문도 의문이지만, 일단 일이 들어오니까 하긴 해야겠다 싶어서 수많은 의문들을 뒤로한채 열심히 Android에 매진 하게 되었습니다. 물론 제가 담당하는 부분은 단순한 어플리케이션 레벨이 아니라, 라이브러리와 프레임워크 부분까지 건드려야 하는 레벨인지라 Android의 소스를 분석해야 하는일을 피할 수 없더군요.
그렇게 한 달 동안 삽질을 해본 끝에 겨우 Android라는 녀석이 어떤 녀석인지 그 소스 뒤에 숨겨진 진가가 눈에 들어오기 시작했습니다.
결국 어플리케이션과 프레임워크 레벨만 Java로 쓰여져 있고 나머지는 모두 C/C++ Native 코드가 동작하는 구조로 나뉘어져 있다는 것을 알게 되었습니다. 그리고 Dalvik VM과 Android Runtime과의 관계, Android Runtime과 프레임워크와의 관계를 알아가고, 잘 나뉘어진 Layer 덕분에 Linux Kernel쪽은 전혀 손을 대지 않아도 된다는 사실을 알았을때는 구글에게 감탄을 할 수 밖에 없었습니다. 이제 하드웨어에 발목이 잡히는 모바일 디바이스 어플리케이션 프로그래밍은 사라질지도 모른다는 생각도 조심히 가지게 되었죠.
그래서 좀 더 Android에 대해 알고 싶어졌습니다. 그래서 무턱대고 구글에 dalvik을 치고 하나하나 보기 시작했죠.
두어시간 찾아본 결과 조금 의외의 사실을 발견 할 수 있었습니다.
[Dalvik VM is not Java VM]
가장 중요한 사실은 Dalvik VM과 Java VM은 엄밀하게 '다르다'라는 것입니다.
흔히들 Dalvik Java VM이라고 생각하시는 분들이 많지만 Dalvik은 Java VM이 아니라 그냥 Dalvik VM입니다.
그렇지만 다들 아시다 시피 Android는 Java를 이용 합니다.
Android SDK로는 Java 소스를 Dalvik bytecode로 직접 컴파일 할 수 없습니다.
처음에 정식 Java 컴파일러를 사용하여 정식 Java bytecode를 생성한 뒤에, Dalvik bytecode로 변환하도록 Android SDK에 dx라는 툴을 포함시켜 두었습니다. 여러개의 .class파일들을 dx툴을 사용하여 하나의 .dex파일로 변환하는 것이죠. 이때 중요한 것은 .dex파일로 변환할 때에 Java bytecode를 Dalvik VM에서 사용하는 bytecode로 변환하는데에 있습니다. 여기서 Java VM과의 상관은 끊어지게 되는 것이죠. 보통 같은 .class파일을 가지고 .jar파일로 변환할 때보다 .dex파일로 변환하면 크기가 조금 줄어든다고 합니다. 여튼 중요한건 'Android는 Java VM을 사용하지 않는다.' 라는 사실입니다.
[SUN의 라이센스를 피해서]
구글의 입장에서는 Java VM을 사용해서는 안되는 상황이 만들어 져버렸습니다. 바로 Java ME의 라이센스 정책 때문입니다.
Java는 GPLv2하에 배포가 되었던 오픈소스였습니다. 뭐, 거기까지는 좋습니다. 하지만 Java ME에서 그 '예외'가 발생 해버렸죠.
핸드셋에 Java VM을 탑재하기 위해서는 SUN에게 라이센스 비용을 지불해야 합니다.
역시 Java VM을 사용하지 않는것 밖에는 방법이 없던것 같군요...
[Using Java SE]
위에서 말씀드렸듯이 dx툴을 사용하여 Java 플랫폼 어플리케이션을 Dalvik Excutable(.dex)로 변환 할 수 있습니다.
이때 사용되는 Java는 Java ME가 아니라 Java SE입니다. 정식 Java SE를 사용하여 .class파일을 생성 하고 난 뒤에 .dex파일로 변환하는 과정을 통해 Java ME는 전혀 사용하지 않고, SUN의 라이센스 정책을 피해 갈 수 있었던 것이었습니다.
[Dalvik VM의 특징]
Dalvik VM은 Java VM과는 조금 다른 물건입니다.
일단 Dalvik VM은 Dan Bornstein이라는 분이 제작을 했는데, 그 분의 선조들이 살던곳이 Dalvik이라는 곳이라네요.
위키피디아에 보면 Java VM은 Stack-Based Architecture인데에 비해 Dalvik VM은 Register-Based Architecture라고 설명 되어 있습니다. 제가 Stack-Based와 Register-Based의 장단점 같은건 잘 모르겠지만, 왠지 Dalvik VM이 작은 디바이스 쪽에 좀더 최적화 되었다는 느낌을 줍니다. 실제로 DalvikVM.com에도 Low Memory에 최적화 되었다고 소개가 되고 있습니다.
Dalvik VM의 Constant pool은 32bit 인덱싱만 하도록 변경이 되었다느니,
Just-In-Time 컴파일러가 아니라느니 등등의 특징들도 있습니다만, 제가 봤을때 중요하게 생각하는 부분은
여러개의 VM Instance를 실행 시킬 수 있도록 디자인 되어 있으며,
Linux Kernel을 사용하기 때문에 프로세스 독립성을 가지고, Linux의 메모리 관리와 스레딩을 사용 할 수 있다는 점 입니다.
[Outro]
아직 국내에는 iPhone이나 gPhone에 대한 관심이 그렇게 큰 것 같지는 않습니다.
개발 관련 책도 손에 꼽을 정도고, 국내 커뮤니티도 그렇게 활발한 것 같지는 않아 보입니다.
언젠가 Dalvik VM으로 검색하실 분들을 위해 제가 느끼고 정리한 바를 조금 짧지는 않게 적어 봤습니다.
저의 글이 국내 Android 개발 환경에 조금이나마 도움이 되었으면 하는 마음으로 이 글을 씁니다.
[참고가 되었던 곳들]
제가 관심을 가지기 이전부터 쭈욱 관심을 가져 주셨던 분들의 글을 많이 참고 했습니다.
Wikipedia : Dalvik virtual machine
DalvikVM.com : Dalvik Virtual Machine Inside
구글의 Android 플랫폼, 그리고 Dalvik VM
Dalvik: how Google routed around Sun’s IP-based licensing restrictions on Java ME
'Android' 카테고리의 다른 글
내가 쓴 Android 커널 빌드하기. (1) | 2009.08.01 |
---|---|
(S3C6410 & Android) U-Boot, zImage, Cupcake 요약 (0) | 2009.07.27 |
android pkg 설치 (0) | 2009.07.18 |