안드로이드에서 모든 자바 애플리케이션 프로세스는 zygote 프로세스에 의해 fork된다. 자이고트 프로세스는 미리 초기화된 Dalvik 인스턴스이며, ZygoteInit, ZygoteConnection 신공을 펼쳐 새로운 자바 프로세스를 띄운다.

애플리케이션 프로세스의 쓰레드들
프로세스가 포크되고 ZygoteInit.main() -> ActivityThread.main()을 거치면서 애플리케이션의 "main" 쓰레드가 완성(?)되는데, DDMS를 통해 main 쓰레드 외에 기본적으로 생성되는 쓰레드 목록을 엿볼 수 있다.

  • "main" 쓰레드는 말 그대로 main 메소드를 실행하여 생성된 쓰레드이다. main 쓰레드는 액티비티가 존재할 경우 UI 쓰레드 역할도 담당한다.
  • ID 앞에 별표시가 붙은 쓰레드는 데몬(daemon) 쓰레드다. 데몬 쓰레드는 백그라운드에서 돌아가는 쓰레드로, 자바 프로세스는 데몬 쓰레드를 제외한 모든 쓰레드가 종료한 시점에 종료된다.
    HeapWorker 쓰레드는 가비지콜렉션(GC)을 수행하는 쓰레드인 듯하며, Signal Catcher 쓰레드는 뭐하는 놈인지 잘 모르겠다. JDWP 쓰레드는 애플리케이션 디버깅을 위한 쓰레드로 VM과 디버거를 연결해준다.
  • Binder Thread가 2개 있는데 다른 프로세스와의 통신(IPC) 작업을 빠르게 처리하기 위해 마치 DB커넥션풀처럼 미리 만들어둔 것으로 보인다.(확실치 않음)


main 쓰레드 생성 직후부터 Activity가 만들어지기까지의 과정

  1. zygote에 의해 자바 프로세스가 포크되면서 ZygoteInit.main() -> ActivityThread.main() 호출
  2. ActivityThread.main()은 먼저 Looper.prepareMainLooper()를 호출하여 main 쓰레드를 위한 메인 메시지 루프를 초기화함
  3. ActivityThread 인스턴스가 생성되고, ActivityThread는 ApplicationThread 인스턴스를 생성하는데, ApplicationThread는 system_server 프로세스의 ActivityManagerService 서비스와 상호작용하기 위한 IBinder 객체로서 작동
  4. 이 시점에 프로세스는 system_server 프로세스로부터의 IPC 콜을 기다릴 뿐 다른 일은 하지 않음. Application과 ApplicationContext 객체도 아직 생성되지 않음. 이들 객체는 애플리케이션 프로세스가 실제로 어떤 일을 할 때 생성됨(즉, 액티비티를 시작하거나 인텐트를 수신하거나 서비스를 시작하는 등의 작업)
  5. 이제 애플리케이션에서 실행해야할 액티비티가 있다면, ActivityManagerService가 RPC 호출을 통해 애플리케이션 프로세스의 ApplicationThread.scheduleLaunchActivity()를 실행
  6. ApplicationThread는 ActivityThread에 메시지를 전달하여 액티비티를 시작하도록 요청
  7. ActivityThread는 Application과 ApplicationContext 객체를 생성
  8. 그리고 Instrumentation을 이용하여 마침내 액티비티 자바 객체를 생성하고 액티비티의 onCreate()를 호출


main 쓰레드 스택트레이스 샘플 : NotePad 예제 애플리케이션의 NotesList 액티비티


Posted by 에코지오
,