Bulldozer™
11.08.09
조회 수 3952
추천 수 5
댓글 11


안녕하세요~^^


Bulldozer 입니다 ^^




예전에 제가 개인적으로 Android 에 대해 글을 쓰고 있는 블로그의 글을 3번에 걸쳐서


제 글을 제가 퍼온적이 있었죠? ^^ (기억하시려나... ^^;;)




오랜만에 하나 또 가져왔습니다 ^^


Android Process 와 관련된 내용 중


JNI 와 Zygote process 에 대한 글입니다 ^^




JNI 는 생소하더라도 아마 갤스가 예전 어떤 펌에서 자주 핫리붓을 하던 때가 있었는데


그때 원인 중 하나로 지목됬던것이 Zygote process 라는 부분이었죠~^^




스마트폰에 대해 여러방면으로 맛클에서 발전이 이루어지고 있는데


이런쪽도 관심을 좀 많이 가졌으면 좋겠네요~^^




예전 글도 그렇지만 전 제 블로그 글에 존칭을 쓰지 않습니다 ^^;


이해해 주세요~


혼자 공부한 내용을 적은 것이고


단지 이런 부분에 대해 제가 퍼온 제 글을 읽으시고 이쪽으로도 관심을 가지시는 분들이


생기기를 바라는 마음으로 퍼온것이니까요~^^;




==============================================================================





지난 글에서 init process 에 대해서 정리를 하였다.
처음 시작이었던 booting process 에서 간략히 여러 부분에 대해 적었으며,
init process 에서 init process 가 하는 역할 그리고 중요한 init.rc 에 대해 적었다.

사실 처음 이 쪽 공부에 관심을 갖게 된 이유가 zygote process 때문이었다.
자주 가는 스마트폰 커뮤니티 인 맛클에서 zygote 라는 것이 있다는 것을 알았으며, zygote 가
무엇인지를 그 커뮤니티 안에서 찾아보려 했으나 그 쪽으로는 글이 전무하였다.
그래서 구글링을 통해서 간략히 어떠한 역할을 하는것인지를 알게되었고, 그 관심이 좀 더 커져서
지금처럼 블로그에 안드로이드에 대해서 글을 쓰게 된것이다.

처음에 kernel build 에 관심이 있어서 kenel 에 관한 강좌를 보고 따라하며 zImage 를 추출하는 것까지는
하였으나, 그 이후 좀 더 근본적인 부분에 대한 궁금증이 생겨서 그 쪽 관련한 실제적인 적용 및 결과물 도출은
하고있지 않은 상태이다. 그 쪽으로 계속 관심을 가지고 있었던 사람들은 지금 kernel 을 짜집기하여 본인이
원하는 performance 를 만들어 내고, 순정 kenel 에 init.rc 를 수정하고 원하는 file 을 설치하는 등
한 단계씩 앞으로 나가는것 같다. 빨리 결과물을 만들어 내고 나만의 custom kernel 을 만든다던지,
application 을 만들어 보고 싶은 욕구가 강하지만... 지금은 참고 있다.
하고 있는 이론이나 구조에 대한 공부를 더 완벽히 한 후 실습적인 부분에 착수를 할 생각이다.


*. JNI (java native interface)
여러번 앞서 적었던 글에 적었듯이 안드로이드의 platform 은 java 로만 구성되어 있는것이 아니다.
java 와 C/C++ 기반 module 이 계층별로 구성되어 있다. 하나의 application 을 구동하기 위해서는 java 와 C/C++ 간의
정보 교환
이 필요하다. 간단히 GPS 를 예로 들면, GPS 정보를 요구하는 application 의 경우 이 application 은 java 로
짜여져 있다. 하지만 직접적으로 GPS 정보를 구할 수 있는것이 아니다. 이 application 은 application framework 의
location manager 가 제공하는 java API 를 호출해서 GPS 정보를 얻을 수 있게 되는 것이다. API 의 호출은 framework
내부의 GPS library 를 통해 GPS device driver 에 연결된다. 그렇기 때문에 java 와 C/C++ layer 간에 서로 통신을
가능하게 만들어 주는 무엇인가가 필요하게 된다. 이 때 나오는 개념이 JNI 이다.
즉, java layer 와 C/C++ layer 를 상호 연결하여 정보 교환이 가능하도록 만들어 주는 매개체가 JNI 라는 것이다.
일반적으로 우리가 마켓에서 다운을 받아 사용하는 application 은 android SDK 를 토대로 만들어져 있으며, 이러한
application 은 모두 Dalvik Virtual Machine 위에서 동작하는 java 기반의 program 이다. 일반적으로 java 기반의 program 은
C/C++ 과 같은 native language 로 짜여진 program 보다 처리 속도 등이 느린 단점을 내포하고 있다고 한다. 그래서
일반적이고 공통적으로 사용할 수 있는 driver 등은 모두 nitive language 인 C/C++ 로 짜여져 있으며, API 호출을 통하여
java 기반의 application 에서 사용할 수 있도록 만들어 놓은 것이다.
관련 서적에서는 JNI, NDK 에 대해 아주 상세히 적어 놓았다. source code 를 모두 분석해 놓았으며, java 에서 C library 함수를
호출하여 사용하는 방법까지 기술해 놓았다. 하지만 아직 이쪽으로 지식이 충분하지 못해 완벽히 이해하긴 힘들다.
그래서 이번 글에서는 JNI 의 개념에 대해서만 적는다. 나중에 source code 분석에 익숙해 지고, SDK 로 java 기반의
application 을 간단히나마 짤 수 있을 정도가 되면 그때 글을 업데이트 하던 새로운 글을 적을 생각이다.

*. zygote process
가장 스마트 폰에 대한 기술적인 부분을 다루는 커뮤니티 에서도 기재되어 있는 상세한 내용의 zygote 의 개념을 찾을 수가
없었다. 물론 구글링을 한다면 쉽게 그 개념을 알 수 있다. android system 에서 application 을 실행하면 zygote process 와
결합하여 구동이 된다는 것이 결론이다. zygote 자체에 대해 간단히 짚고 넘어가면 그 개념은 다음과 같다.
zygote 란 application 을 빠르게 구동하기 위하여 미리 fork 되어 있는 process 이다. system 에서 exec() 호출을
통해 특정 application 을 실행하고자 하기 전까지는 중립적인 상태를 유지하며 대기하고 있는 process 이다. 뭐 미리 공통적으로
필요한 libraries 를 탑재한 상태로 반쯤 생성이 되어 application 의 실행에 대비하고 있다는 것이다. 반쯤 생성된 process 에
실제 핵심이 되는 application 의 logic 을 태워 구동시키기 때문에 application 의 구동 속도가 빨라지는 것이다.
이제 zygote process 에 대해 좀 더 자세히 적어보겠다.
zygote process 는 init process 에 의해 구동되어 진다. init process 가 system 구동에 필요한 각 daemon 을 실행하고 나서
실행시키는 process 이다. 그리고 init process 에서 zygote process 가 실행되어지고 난 이후에는 android service 및
application 은 zygote process 를 통해 실행되어 진다. 그리고 여기에서 booting process 에 대한 글에서 적었던
PID 와 PPID 의 개념이 필요하다. adb 로 shell 접속하여 ps 명령을 하면 PID 와 PPID number 를 눈으로 확인할 수 있다.
그 number 의 관계를 통하여 init process 가 생성시킨 process 들과 zygote process 가 생성시킨 process 를 확인할 수 있다.
zygote process 를 통함으로 인해 application 의 구동속도가 빨라지는 내용은 위에 간략하게 적었다. 미리 fork 되어 있으면서
공통의 libraries 등을 탑재하고 있기 때문이라 했는데, 이 부분에 대해 조금 더 자세히 적으면 아래와 같다.
zygote process 가 실행이 되면, Dalvik VM 을 실행시키게 된다. 그런 이후 classes 와 resources 를 preloading 한 상태로 application 의 logic 을 기다리고 있는 것이다. 만약 zygote 의 개념이 없다면 application 은 구동 시에 필요한 모든 classes 와
resources 를 찾아야 하는 delay 가 발생하게 될것이다. 이 부분에서 zygote process 의 필요성이 나타난다.
그리고 zygote 는 java 로 작성된 process 이다. android system 에서 java process 를 실행하기 위해서는 Dalvik VM 이
필요하다. init process 에서 zygote process 를 실행하기 위해서 zygote process 가 생성시키는 Dalvik VM 이외에 별도의
zygote process 용 Dalvik VM 이 필요하다는 것이다. 간단히 서적에 보면 init process 중에 app_process 라는 service 가
존재하며 이 app_process 를 통해 Dalvik VM 을 실행시킨 후 zygote 를 만들어 낸다.

JNI 와 zygote process 의 경우는 좀 더 자세히 적고 싶지만 아직은 지식이 부족한 듯 하다.
source code 를 좀 더 쉽게분석할 수 있게 되었을 때 다시 적어야겠다. 지금은 단지 그 개념에 대해서만 정리를 하였다.
booting process 를 기반으로 이해를 한 후 새부적인 process 로 접근을 하니 개념에 대한 이해는 쉽게 되는 듯 하다.
하지만 역시 자세한 내용을 분석하고 구동 원리를 파악하는 데는 한계가 존재한다...



==================================================================================================

예전에 관련된 android booting process 등의 먼저 올린 글들 링크 입니다 ^^



첫 번째 글 init process-1


http://matcl.com/index.php?mid=freeboard&category=9003&document_srl=2580601





두 번째 글 init process-2


http://matcl.com/index.php?mid=freeboard&category=9003&document_srl=2643307




세 번째 글 Android file system


댓글 11
  • ?
    으아니
    11.08.09
    이 글을 보니 몇년전에 한창 리눅스 공부할 때가 생각이 나는군요^^
    독학하시는건가요? 대단하십니다 ^^;;
  • ?
    시간 나는데로 책보고, 구글링하고, 자양님이나 이카루스님 블로그 글
    읽으면서 공부한 내용을 제 블로그에 정리하고 있어요 ^^

    벌써 시작한지는 6개월 정도 되었네요 ^^
    뭐 사실 이쪽이랑은 전혀 관련없는 사람인지라... 전기쟁이랍니다 저는 ^^;
    힘든 부분도 있지만 재미있네요 ^^

    댓글 감사합니다 으아니님^^
    좋은 밤 되시길 바래요 ^^
  • ?
    잘 읽었어요! 이해는 잘...은 못했지만요 ^^;;
    제가 고3이라 지금은 못하지만, 후에 책도 읽으면서 연구해봐야 겠어요.
  • ?
    쉐리8888
    11.08.10
    전기쟁이시군요.. 저는 땜쟁이 인데 .. ^^;

    저도 최근에 스마트폰을 활용한 Project 를 하고 있는데 ..
    최근에, 커널 관련하여 관심이 있긴한데.. 이게 쉽지가 않네요..

    그냥 천천히 눈요기 하고 있긴한데.. 여간 시간 만드는게 쉽지가 않은..
  • ?
    도봉구청님 댓글 감사합니다 ^^

    시간이 생기면 이런 부분도 관심을 가져보는것도 좋을것 같아요 ^^

    테마적용이나 트러블슈팅같은 부분은
    이미 사실상 맛클 분들은 충분히 부족함이 없는데...
    뭔가 Android 에 대한 근본적인 부분까지 관심을 갖는 분들은 적은듯 하여
    제 개인적으로는 많이 안타까워서 자꾸 이런 글을 올리네요 ^^;

    좋은 하루 보내세요 ^^
  • ?
    쉐리8888 님 댓글 감사합니다 ^^

    땜쟁이라고 하시니... 전 빨래줄~~~ ^^;;

    관심이 좋은 결과를 가져오시길 바랍니다 ^^
    좋은 하루보내세요^^
  • ?
    현재 하는일의 관계상 깊이 들어가지못하는... 어차피 핑계입니다만..^^;;

    불도저님을 통해서.. 많은정보를 알게 되네요~! 너무나도.. 감사드립니다!!
  • ?
    카무이님 댓글 감사합니다~^^
    카무이님 이시라면 다 아는 내용일텐데요~^^;
    암튼 좋은 하루 보내세요~^^
  • ?
    감사합니다!~
  • ?
    감사합니다!~
  • ?
    감사합니다!~
댓글 쓰기 권한이 없습니다.
분류 정렬 목록 검색 쓰기
List of Articles
제목 글쓴이 추천 조회 날짜
떡님 뮤플 실행시 미니멀텍스트가 실행되는점 극복하기 4 God 3 3216 2011.08.16
SKT 스팸결제 방지 TIP 3 KeRoro 3395 2011.08.15
웹 바이러스체이서 9 미라클_S 12 3286 2011.08.12
난 순정 어플서랍을 폴더로쓴다??? 7 file HID™ 1 4504 2011.08.12
카카오톡도~다이렉트콜 처럼~ 상대방 바로가기 10 file LINUX™ 3 5329 2011.08.11
스맛폰 관심도 넓히기~ Android booting process 10 Bulldozer™ 5 3950 2011.08.10
[갤K] 팁하나~! 8 맛싸이어 2281 2011.08.10
스맛폰 관심도 넓히기~ JNI & Zygote process in Android 11 Bulldozer™ 5 3952 2011.08.09
모바일로 작성시 팁 9 꿈이있는 1 2157 2011.08.08
와이파이신호를 강하게 하는법 5 미쳐버린 7728 2011.08.08
프로그램 설치 용량 확보 Tip 14 벼리 7 6101 2011.08.08
연락처에서 슬라이딩으로 전화 문자보내기 5 까망기타 3014 2011.08.06
원낸드 + 벼리님 핵펀치 사용자용 백업/복구 Script (8/6 수정) 22 file Bulldozer™ 10 4255 2011.08.05
배터리 절약법이에영 ㅎㅎ (눈팅미워할 꼬얏 ㅎㅎ) 42 맛싸이어 23 15785 2011.08.05
컴퓨터 키보드로 안드로이드폰에 직접 문자를 입력하는 방법 12 file 야미 9 5537 2011.08.04
혹시라도 아직 순정 상태로 캡춰하는 방법을 모르실까봐.. 5 알씨포스 1 3382 2011.08.03
마켓에 댓글 안달리신다던 분들!! 3 Flash-★ 2675 2011.08.01
setcpu 설정과 테그얼티밋 전압설정에 관하여 6 남순이 8 8342 2011.07.31
인터넷 종료시키기 4 라퓨타25 1 3982 2011.07.27
강좌 커스텀 락 - 이중락 뜨는 현상 없애는 방법 7 iou 5 5181 2011.07.26
Start G+ : 구글플러스, 트위터, 페이스북 연동 13 file 볼튼원더 7 4119 2011.07.25
OTG가 지원 되시는 모든 기종을 가지고 계신분들은 꼭한번 읽어 주시길.. 10 순딩이폰 4 4714 2011.07.25
상태바 꼼수^^;; 6 짬타이거 1 4068 2011.07.24
(요청)심플한 허니컴락 만들기 7 file KaRAME 3 3210 2011.07.23
만들어진 DVR 위젯 수정하는 방법 24 짱구삼촌 10 3296 2011.07.22
티타늄 백업 사용법 총정리... 20 꼼하슈 11 7531 2011.07.21
구글플러스에 작성하는 글을 동시에 페이스북에 올리는 방법 6 짱구삼촌 2 2627 2011.07.21
미니멀리스틱 텍스트 입니다^^ 23 file Leche™ 12 9792 2011.07.21
네이트온톡 쪽지 관련 팁 7 까망기타 3052 2011.07.21
핵펀치 for 테그라크 리스토어 실수 복구 3 옥상윤 2900 2011.07.21
1 - 106 - 135