액티비티가 어떻게 구동되는지 알아보기 위해서 안드로이드 내부구조가 어떻게 생겼는지부터 공부했다.

Power on and boot ROM code execution

전원이 들어오면 부트롬이 낸드에서 부트로더를 찾아서 코드를 실행한다.

The boot loader

부트로더는 메모리 초기화와 커널을 불러오기위해 사용하는 프로그램

The Linux kernel

커널은 시스템이 준비되기위해 필요한 모든걸 한다.

  • 시작코드는 하드웨어 종속적인 코드가 돌아간다.
  • 시스템 환경을 초기화한다.
  • 하드웨어 독립적인 커널 시작코드를 실행한다.
  • 루트 파일시스템을 초기화한다.
  • init 프로세스를 실행시킨다.

The init process

init 프로세스는 모든 시스템 프로세스의 조상이다.

  • 시스템 서비스과 기타 필요한 내용을 정의해둔 init.rc 파일을 열고 파싱후 처리한다.
  • 파일시스템을 마운트하고 퍼미션을 설정한다.
  • OOM값을 설정한다.
  • 데몬을 시작한다.

Zygote and Dalvik

Zygote는 VM을 실행시키는 프로세스다. /dev/socket/zygote 소켓으로 앱 실행을 요청받으면 fork()한다. 그리고 새 VM을 만들고 설정하고 앱을 올린다.

The system server

시스템서버는 시스템에서 처음으로 실행되는 자바코드로 안드로이드에 필요한 서비스들을 시작시킨다.

Boot completed

시스템서버가 올라오고 모든 시스템 부팅이 완료가되면 ACTION_BOOT_COMPLETED를 브로드캐스트한다.

Activity Manager

어플리케이션의 생명주기를 제어하는 관리자다.

  • 액티비티와 서비스 실행
  • 컨텐츠 제공자 처리
  • 인텐트 처리
  • OOM adj. 값 관리
  • 시스템 권한
  • 작업 관리
  • 생명주기 관리

예) 런처에서 새 프로그램 시작:

  • onClick(Launcher)
  • startActivity(Activity.java)
  • (Binder)
  • ActivityManagerService
  • startViaZygote(Process.java)
  • (Socket)
  • Zygote

예) 코드에서 새 프로그램 시작:

Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.example.abc");
startActivity(launchIntent);

Binder

  • CORBA/COM 형태의 IPC
  • Parcel로 데이터를 전송
  • /dev/binder
  • /proc/binder/*
  • android.* API와 시스템서버가 Binder로 연결됨