안드로이드 PhoneProxy.java 소스 분석 및 기능 (What is PhoneProxy?)

2014. 4. 16. 14:17Programing/Android / Java

우리가 사용하고 있는 통신방식은 크게 3GPP에서 제정한 방식과 3GPP2에서 재정한 방식으로 구분 할 수가 있다.

3GPP에서 제정한 방식은 우리가 흔히 알고 있는, GSM / WCDMA / LTE 를 이야기하고,

3GPP에서 제정한 방식은 IMT-2000 / CDMA 등을 이야기 한다.

이를 Android에서는 GSMPhone과 CDMAPhone으로 구분지어 사용하고 있다.


왜 이이야기를 먼저 논했나? 

PhoneProxy를 만든 이유가 요놈들 때문이기 때문이다.

PhoneProxy의 주요 역할은 Phone 제어를 위한 API를 이러한 RAT (Radio Access Technology)에 상관없이 제어하기 위한 방법은 제공하는 것 이다.

다시 말하면, RAT에 따라서 Phone 제어 동작이 상이하기 때문에, 모두 지원을 하기 위해서 중간에서 조율을 해줘야 하는 놈이 필요해서 Proxy라는 놈을 도입한 것이다.


만일, PhoneProxy라는 놈이 없다면?

위 쪽에서는 3GPP 통신인 경우와 3GPP2 통신인 경우 다른 구조를 각각 가지고 있어야 하니, 덩치도 커지고 복잡성만 갖게 되기 때문이다.

또한, 사용하다가 잘 못 접근을 하게되면, 정상적으로 전화가 되고, 문자가가 가고, 인터넷이 되지 않을 것은 분명하다.


소스 측면서에서 이야기를 하면,

3GPP인 경우에는 GSMPhone을 생성하고, CDMAPhone을 죽임으로써 Phone에서 GSMPhone을 통해 3GPP 통신 방식으로 Telephony Framework을 Control 하기 위함이며, 3GPP2인 경우에는 반대의 동작을 하게 되는 것이다.

아래는 2.3 버전의 소스 코드 일부분을 발췌한 것이다.

현재 버전과는 동떨어지나 이해하는데는 더 좋다고 판단되어 아래 코드를 사용하였다.


난 해외 나갈일도 없어서, 로밍 할 일도 없으니까 굳이 이런거 필요 없다고 하는 사람들도 간혹 있을 수도 있다.

근데, 그건 본인 사정이고, 전 세계 모든 사람들이 사용하는 폰에 적용되어야 하는 기술이기 때문에, 이는 필수 불가결한 것 인 것이다.


RAT에 의존하지 않고, 위에서는 아무것도 모른다는 것 처럼 분신을 만들어 내 할일만 하면,,,,,, 끝!!!


그럼 왜 하필 PhoneProxy라고 이름을 지었을까?

Proxy란 실제 객체를 위한 일종의 대리자이며 일반적으로 자신이 대리하는 객체에 대한 참조를 가지고 있는 놈이며,

Client의 요청을 모두 받아 실제 객체로 전달하는 역을을 한다.

Proxy의 장점은 실제 객체와 동일한 인터페이스를 구현한 프록시를 통해 접근하여 Client로 부터 최적화와 세부적인 구현 내용을 감추어 코드를 단순화하게 한다는 것에 있다.

반면에 단점은, 바로 접근을 하지 않고, 하나의 객체를 더 거쳐야 하기 때문에 약간의 오보헤드가 발생한다는 것이다.

하지만 단점에 비해, 장점이 더 많기에 나라도 Proxy를 도입했을 것 같다.


부팅 시점에 RILJ 로부터 PhoneApp까지 전달되는 EVENT 흐름은 아래와 같다.