본문 바로가기
Android

인사이드 안드로이드 11. 자바 시스템 서비스 동작 분석

by OKOK 2021. 6. 16.

자바 시스템 코드인 액티비티 매니저 서비스를 통해 자바 시스템 서비스가 안드로이드 프레임워크 내에서 어떻게 동작하는지에 대해 좀더 구체적으로 알아봄.

 

11. 액티비티 매니저 서비스

자바 시스템 서비스의 일종인 코어 플랫폼 서비스. 안드로이드 앱 컴포넌트인 액티비티, 서비스, 보로드캐스트 리시버를 생성, 생명주기를 관리함. 

RemoteService는 앱가 독립된 프로세스에서 동작하는 리모트 앱 서비스이기 때문에 서비스를 실행하기 위해서는 우선 새로운 프로세스를 생성해야 함. 안드로이드의 모든 자바 기반 프로세스는 Zygote에 의해 성생됨. 액티비티 매니저 서비스는 Zygote를 이용해 서비스를 실행할 프로세스를 생성함. 

 

11.2 액티비티 매니저 서비스를 통한 서비스 생성 코드 분석

앱 컴포넌트는 인텐트라는 메시지를 통해 활성화됨. 안드로이드에서는 인텐트를 이용해 실행하고자 하는 서비스의 클래스명을 명시적으로 지정해서 원하는 컴포넌트를 실행할 수 있음. 안드로이드 앱 컴포넌트는 인텐트라는 메시지를 통해 활성화됨. 안드로이드에서는 인텐트를 이용해 실행하고자 하는 서비스의 클래스명을 명시적으로 지정해서 원하는 컴포넌트를 실행할 수 있음. Controller 액티비티에서 호출한 startService() 프록시 메서드가 바인더 RPC를 통해 어떻게 액티비티 매니저 서비스에서 제공하는 startService() 스텁 메서드를 RPC 방식으로 호출하는지 보여줌. 

 

액티비티에서 startService() API를 호출하면 Acitivity 클래스가 상속하는 ContextWrapper 클래스의 startService()가 호출됨. 멤버 변수 mBase에 저장된 Context 객체를 래핑하는 역할을 함. Controller 액티비티의 ContextImpl 객체를 래핑하고 있음. 따라서 ContextWrapper의 startService() 메서드는 ContextImpl 객체의 startService를 호출하게 됨.

 

ActivityMnagerNative가 ActivityManagerProxy로부터 수신한 START_SERVICE_TRANSACTION RPC코드와 바인더 RPC 데이터를 처리하는 onTransact()메서드의 주요 부분임. 액티비티는 IActivityManager 서비스 인터페이스 기반의 바인더 RPC를 통해 액티비티 매니저 서비스에게 서비스 실행이나 인텐트 송수신 등의 기능 수행을 요청할 수 있음. pid, uid를 넘기는 이유는 서비스를 요청한 프로세스가 인텐트에 해당하는 서비스를 실행할 권한이 있는지 검사하기 위함임.

 

안드로이드의 메시지 큐는 동일 프로세스 안에서 여러 스레드 간에 메시지를 전달하는 데 쓰임. 프로세스 간에 메시지를 전달하기 위해서 인텐트를 사용함. 루퍼는 각 스레드의 메시지 루프를 실행하는 클래스로서 일반적으로 Looper.prepare() 메서드로 메시지 큐를 생성한 다음 Looper.loop() 메서드를 통해 메시지 큐를 실행하는 방식으로 사용됨. main() 메서드는 메시지 큐를 생성한 다음 ActivityThread 객체를 생성함. 

 

ActivityThread는 attach() 메서드를 처리하기 위해 바인더 RPC를 이용해서 액티비티 매니저 서비스가 제공하는 attachApplication() 스텁 메서드를 호출해야 함. 

 

Controller 액티비티는 RemoteService 서비스를 실행하기 위해 startService() API를 통해 익티비티 매니저 서비스에 RemoteService 서비스 실행을 요청함. 요청받은 서비스가 리모트 서비스인 경우 액티비티 매니저 서비스는 Zygote에게 서비스를 별도의 독립 프로세스로 실행시키기 위해 ActivityThread 생성을 요청함. Zygote에 의해 생성된 ActivityThread는 attachApplication() 프록시 메서드를 통해 액티비티 매너지 서비스에게 자신을 등록함. 이를 통해 액티비티 매니저 서비스는 생성된 AcitivityThread를 제어할 수 있게 됨. 액티비티 매니저 시브스는 요청받은 RemoteService 생성을 ActivityThread에 요청함. ActivityThread는 요청했던 RemoteService 서비스의 인스턴스를 생성한 다음 이 서비스의 onCreate() 콜백 함수를 호출함. 

 

 

댓글