Android2011.03.01 01:12
크리에이티브 커먼즈 라이선스
Creative Commons License

요즘 부쩍 안드로이드의 process 에 대한 공부를 하는데 재미가 붙고 있다.
사실 패치의 적용 및 해제 그리고 발생되는 문제점에 대한 Trouble shooting 은 어느정도 혼자서 문제없이
처리를 할 수 있게 되니 좀 더 깊은 내용에 대한 궁금증이 생겨서 시작하게 되었다.

루팅과 패치에 대하여 어느정도 정리를 하였으며, 자양펌과 샤인패치를 적용해 보고 간단한 적용법과
원리에 대해 아는한 적을 예정이다. 그리고 주로 사용하는 루팅권한을 필요로 하는 어플의 활용법과 간단한 adb 사용법에
대하여도 적을 생각이며, 각 패치 별 그리고 상황 별 Trouble shooting 에 대한 팁과 원리도 가능한 적을 생각이다.
글로 남겨야 지금 알고있는것이 기록이 되는것이지 시간이 흐르면 다 잊어먹고 없어질 수도 있을것 같아서
최대한 적으려 한다. 앞선 글에서도 몇번 언급했지만 누구를 위해서 쓰는글이 결코 아니기 때문에
글의 순서나 뭐 그 어떤한 것도 맘에 내키는데로 써나가려고 한다.

지금 공부를 하며 참고하고 있는 책은 안드로이드 관련, Java 관련 하여 보고 있으며 리눅스 관련하여 몇권을 더
구매할까 생각 중이다. 리눅스 쉘 스크립트와 기본 명령어와 관련된 서적쪽으로 생각을 하고 있다.
관련 서적이외에 추가적으로 기술적인 부분에 대한 보충 참고로 맛클 자양님(갤럭시 튜너의 개발자)의 블로그인
자양이네(http://blog.naver.com/dowkim10/)에서 궁금증이 있는 부분 중 읽었던 기억이 있는 부분을 찾아서 읽고 있다.
(자양이네의 안드로이드 카테고리의 글은 모두 2번 이상씩 읽었지만 전문적인 지식이 부족하다보니 계속 다시 보게된다...)

공부하고 있는 내용에 대해 하나하나 적는것이 나 자신에게 도움이 되고 좀 더 채찍질이 될 수도 있을것 같아 블로깅을 하려고
마음먹었다. 전문적인 내용을 충분히 적고 싶지만 분명 한계가 있을것이다. 하지만 최대한 노력해서 적어야겠다.
나중에 시간이 흘러 이 글을 다시 읽었을 때 도움이 될 수 있을 정도의 수준은 되도록 만들어야 하니... +_+

안드로이드 플랫폼의 구조는
Linux kernel (display driver, camera driver, usb driver, wifi driver, power management, etc,.)
Libraries (surface manager, media framework, SQLite, etc,.)
Android runtime (dalvik virtual machine, core libraries)
Application framework (activity manager, window manager, view system, package manager, etc,.)
Applications (home, dialer, browser, camera, alarm, calculator, email, albums, clock, etc,.)
위 5 가지로 구분된다고 보면된다.

안드로이드의 소스 코드는
kernel, bionic, bootloader, build, cts, dalvik, external, frameworks, hardware, packages, system 으로 구성되어 있다.
(소스 코드 부분은 아직 명확히 공부하지 못한 부분이라 추후에 이 부분까지 완벽히 이해가 되었을 때 별도로 적을 생각이다.)

기본 공부의 틀을 인사이드 안드로이드 라는 서적을 바탕으로 하다보니 우선 공부하게 된것이 안드로이드의 부팅 프로세스 이다.
관련 서적에서는 부팅 프로세스를 기준으로 소스코드를 분석하는 방식을 이용하여 안드로이드에 대해 정리를 하였다.

간단히 안드로이드의 부팅 프로세스를 적어보면

1. linux kernel
-> 부팅 시 bootloader 를 통해 linux kernel 이 시작된다. 이 과정에서는 커널 초기화가 이루어 지고 마지막 과정에서
init process 가 호출되어 진다.

2. init
-> init process 는 각 device 를 초기화 하며, framework 동작에 필요한 각 daemon, context manager, media server,
zygote 등을 실행한다.

2-1. daemon
-> init process 에서 실행하는 daemon process 는 다음과 같다.
* adbd = Android Debug Bridge 연결관리
* usbd = USB 연결관리
* debuggerd = debug system 의 시작관리
* rild = 무선 통신 연결관리

2-2. context manager
-> 안드로이드의 system service 를 관리하는 process 이다. 여기에서 system service 는 framework 를 구성하는
component 이며, 각종 application 제작에 필요한 API 를 제공하는 등의 역할을 한다.

2-3. media server
-> audio flinger 나 camera service 와 같이 C/C++ 기반으로 작성된 native system service 를 실행하는 역할을 한다.

2-4. zygote
-> android application 의 loading time 을 단축하기 위한 process 이다. Java 기반의 android application 은 모두
zygote 를 통해 fork 된 process 상에서 동작되어 진다.

2-4-1. system server
-> zygote 에서 최초로 fork 되어 실행되는 android application process 이다. 주로 activity manager, location manager service 와 같은 Java system service 를 실행하는 역할을 한다.

여기까지의 과정이 부팅의 시작부터 framework 가 초기화 되는 부분까지이다.
더 자세한 사항은 아직 좀더 공부를 해야지 상세내용을 적을 수 있을것 같다. 어느 정도는 머릿속에 정리가 되어가고 있지만
아직 끝까지 공부를 한것이 아니기 때문에 상호관계가 완벽히 잡히지 않는다. 그래서인지 당장은 좀더 기술적이고 세부적인
내용을 적기에는 많이 부족하다.
일단은 이번 글에서는 간략히 process 의 진행 과정이 나타날 수 있도록만 정리를 한것이며,
이후에 적게될 세부 타이틀을 가진 글들에서는 작은 범위 에서 깊이를 더할 수 있는 글이 될 수 있도록 할 것이다.

위 2-4-1 까지의 과정이 지나가고 나면(Java system service 까지 loading) activity manager service 가 Home application 을
실행하면서 연속적인 부팅 process 를 진행한다.
하지만 책을 보면 Java system serivce loading 까지가 android 부팅 process 의 주요 내용으로 생각된다.

그리고 위에서 글을 쓰다보니 의문점이 생겼다.
usbd 와 adbd 가 실행되어지는 시점에 대해서는 알 수 있으나 안드로이드 운영체재를 사용하는 갤럭시 S 의 경우
리커버리 모드와 다운로드 모드가 존재하는데 두 모드와 부팅 프로세스의 시점에 대한 의문이다.

리커버리 모드의 경우는 adb shell 접속이 가능하여 여러가지 작업이 가능하지만
다운로드 모드의 경우는 adb shell 접속이 안된다.
그렇다면 두 모드 간에 시점의 차이가 발생한다는 것인데...

다운로드 모드의 경우는 init process 에서 adbd 를 실행시키기 전에 진입되는 모드이고
리커버리 모드의 경우는 init process 에서 adbd 를 실행시키고 난 후에 진입되는 모드인듯 하다.
하지만 다운로드 모드나 리커버리 모드 모두 USB 연결에 대한 인식을 한다.
그렇다면 init process 에서 daemon 실행 과정 중에 usbd 의 실행과정 이후에 adbd 가 실행이 되는 것이며,
그 전, 후에 다운로드 모드와 리커버리 모드의 시점이 구분되는듯 하다.

그리고 위 init process 의 진행과정을 보면 각 process 간에 부모/자식 관계와 같은 생성 관계가 존재한다.
이런 process 간의 관계를 알아보는 것은 adb 를 이용하면 아주 간단하게 확인할 수 있다.
adb shell
$ps
를 이용하여 PID 와 PPID 를 확인하면 간단히 알 수 있다.
PPID 번호가 1 인 process 는 PID 번호가 1인 process 가 생성한 process 이다.
이 관계를 보면 init process 가 zygote 를 생성하였고 zygote process 가 수많은 seveice 와 process 를 실행한 것을
눈으로 확인할 수 있다. 단순히 terminal emulator 에서 ps 옵션으로도 확인이 가능하다.

init process 에 대한 좀더 상세히 공부한 내용은 다음 글에 적을 생각이다.
지금 시간이 11시가 되어가는데 눈이 침침하다. @_@

이번 글에서는 대충 부팅 process 에 대해 간략하게만 정리를 하였다. 안으로 파고들어 갈 수록 엄청나게
복잡해지고 있어서 처음 적는 글에서 간략히 흐름을 적고 넘어가는것이 좋을것 같아서 이다.
이번 글은 단순히 이러한 것들이 있다는 수준의 글이며 앞으로 적게될 글에는 각 process 에 대해 최대한 상세한 내용을 담을
생각이다.
그러기 위해서는 열심히 공부를 해야하는데...
삼일절이 지난 다음부터 본격적으로 회사 업무가 늘어난다. OTL...
일단 안드로이드에 대한 공부보다는 생계가 중요하기 때문에 다음 글을 늦게 적을지도 모르겠다.
왜 회사는 이제 막 뭘 해보려고 하니 딱 스케쥴이 바쁘게 돌아가는건지... 머피의 법칙인듯 하다 ㅡㅡ^

어찌되었든...

사진 투척~~!!!


이 사진은 일본에 작년 4월에 2주간 출장을 갔을 때
거리에서 찍은 사진이다.

지명은 기억이 나지 않지만 복을 불러온다고 했던것은 기억한다.
복이 많이 왔으면 좋겠다 +_+
복~~~ 복~~~ +_+
저작자 표시 비영리 변경 금지
신고
Posted by Bulldozer121

티스토리 툴바