기본적으로 안드로이드 구조는 위와 같은 방식으로 되어있습니다. 프레임워크쪽에서 앱 개발자들이 개발을 하고, 안드로이드 시스템 서비스 및 HAL (Hardware Abstraction Layer) 는 안드로이드 하드웨어 제조사들이 개발하는 영역입니다.
안드로이드 프레임워크에서는 어떤 일이 일어나고 있을까?
안드로이드 앱을 작성하다 보면 다른 system service를 사용하려면 이렇게 호출을 하는 경우가 많은데 실질적으로 어떻게 동작하는지, 또한 프로세스간 어떤식으로 데이터를 교환 및 실행을 시키는지 궁금증이 커졌습니다. 또한 액티비티는 왜 시스템서비스에서 관리하는지 알고 싶었습니다.
안드로이드 어플리케이션의 통신 방법
안드로이드의 모든 어플리케이션들은 위와 같이 시스템 서버와 통신하기 위해서는 proxy → binder IPC → Stub 라는 통로를 거치게 됩니다. 이를 조금 더 쉽게 이해하기 위해서는 안드로이드 RPC 및 IPC 를 이해하고 넘어가야 합니다.
IPC란?
프로세스간에 통신을 IPC라고 부르며, 이는 프로세스들간에 데이터를 주고 받는 것을 말합니다. 위 그림처럼 프로세스들은 공유 메모리를 사용하는 방법이나, 메시지 전달 방법을 통해서 통신을 합니다. 그리고 이를 활용하는 여러가지 방법중에 안드로이드 RPC가 존재합니다.
안드로이드 RPC란?
위 그림에서 알 수 있듯이 클라이언트 라고 불리우는 프로세스가 서비스 프로세스의 foo() 라는 함수를 호출할때 RPC 코드와 데이터를 생성해서 바인더를 통해 넘어가는 것을 알 수 있습니다. 이는 매우 단순화된 부분이지만, 이정도만 안다면 왜, 안드로이드 내부에서 액티비티간에 혹은 서비스와 통신할때 무엇을 하는지 조금 더 잘 이해할 수 있습니다.
데이터 marshalling
안드로이드에서 RPC를 통해 데이터를 보내려면 데이터 Marshalling이 필요합니다, Parcel을 이용하거나 Bundle을 이용할 수도 있습니다.
액티비티가 시스템 서비스에 의해 관리되는 이유
액티비티는 그럼 왜 시스템 서비스에 의해 관리가 될까요? 서비스랑 액티비티 간에 통신은 알겠는데 이건 왜그럴지 이해가 잘 가지 않았습니다.
- 프로그래머가 만든 하나의 apk 패키지는 1개의 프로세스를 기본적으로 할당받게 됩니다. 그리고 여러 앱을 실행시키기 위해서는 실행되고 있는 프로세서들을 알고있는 안드로이드 OS가 직접 실행시키게 되는것이며, Task를 가지고 서로다른 프로세스에 있는 activity들을 실행시키기 위해서는 OS가 직접 액티비티 매니저를 통해 관리하는 것이 효율적일것입니다.
- 즉, 액티비티간에 전환은 프로세스간의 전환이 될 확률이 높으며 이를 통해서 데이터를 주고 받으려면 안드로이드 OS의 도움을 받아야 합니다.
그래서 위처럼 액티비티간에 데이터를 주고 받으려면 인텐트를 사용하게 됩니다.
최근댓글