Android8.0.0-r4 – Service Manager의 프록시 객체

Service 구성 요소는 시작할 때 Service Manager에 등록해야 합니다.또한 Client 구성 요소는 서비스 구성 요소가 제공하는 서비스를 사용하기 전에 서비스 관리자를 통해 서비스 구성 요소의 프록시 대상을 얻어야 한다.Service Manager 자체도 하나의 서비스 구성 요소이기 때문에 다른 서비스 구성 요소와 클라이언트 구성 요소도 서비스가 제공하는 서비스를 사용하기 전에 프록시 대상을 받아야 한다.특수한 서비스 구성 요소로서 Service Manager 프록시 객체는 다른 서비스 프록시 객체와는 달리 BpService Manager 프록시 객체 유형이 다릅니다.
IService Manager 인터페이스는 네 개의 구성원 함수인 get Service, check Service,add Service,list Service를 정의합니다. 그 중에서 get Service와 check Service는 서비스 구성 요소를 가져오는 프록시 대상, add Service는 서비스 구성 요소를 등록하고,list Service Manager에 등록된 서비스 구성 요소의 이름 목록을 가져옵니다.
일반적인 서비스 구성 요소에 대해 말하자면, 클라이언트 프로세스는 먼저 Binder 드라이버를 통해 핸들 값을 얻어야만 이 핸들에 따라 Binder 프록시 대상을 만들 수 있으며, 마지막으로 이 Binder 프록시 대상을 특정한 인터페이스를 실현한 프록시 대상으로 봉인할 수 있다.Service Manager의 핸들 값은 항상 0이기 때문에 프록시 대상을 가져오는 과정은 Binder 드라이버와 상호작용하는 과정을 줄일 수 있습니다.Android 시스템은 응용 프로그램 프레임워크의 Binder 라이브러리에 함수default Service Manager를 제공하여 서비스를 제공합니다.
일반적인 서비스 구성 요소에 대해 말하자면, 클라이언트 프로세스는 먼저 Binder 드라이버를 통해 핸들 값을 얻어야만 이 핸들에 따라 Binder 프록시 대상을 만들 수 있으며, 마지막으로 이 Binder 프록시 대상을 특정한 인터페이스를 실현한 프록시 대상으로 봉인할 수 있다.Service Manager의 핸들 값은 항상 0이기 때문에 프록시 대상을 가져오는 과정은 Binder 드라이버와 상호작용하는 과정을 줄일 수 있습니다.
Android 시스템은 응용 프로그램 프레임워크의 Binder 라이브러리에 함수default Service Manager를 제공하여 Service Manager의 프록시 대상을 가져옵니다.
IServiceManager.defaultServiceManager
코드 경로:/frameworks/native/cmds/서비스 관리자/servicemanager.rc
(http://androidxref.com/8.0.0_r4/xref/frameworks/native/cmds/servicemanager/servicemanager.rc)
34sp defaultServiceManager()
35{
36    if (gDefaultServiceManager != NULL) return gDefaultServiceManager;// gDefaultServiceManager NULL
37                                   // ,  Binder Service Manager , 
38    {
39        AutoMutex _l(gDefaultServiceManagerLock);
40        while (gDefaultServiceManager == NULL) {
41            gDefaultServiceManager = interface_cast(
42                ProcessState::self()->getContextObject(NULL));
43            if (gDefaultServiceManager == NULL)
44                sleep(1);
45        }
46    }
47
48    return gDefaultServiceManager;
49}

전역 변수 gDefault Service Manager는 IService Manager의 강력한 포인터로 프로세스 내의 Bp Service Manager 대상, 즉 서비스 Manager 프록시 대상을 가리킨다.글로벌 변수 gDefault Service Manager Lock은 상호 배타적인 잠금으로 한 프로세스에 한 개의 서비스 매니저 프록시 객체만 있음을 보장합니다.
41줄에서 세 번 함수 호출입니다.
첫 번째는ProcessState 클래스의 정적 구성원 함수self를 호출하여 프로세스 내의ProcessState 대상을 얻는 것이다.
두 번째는 앞에서 얻은 ProcessState 대상의 구성원 함수 getContextObject를 호출하여 Binder 프록시 대상을 만듭니다.
세 번째는 템플릿 함수interface 호출cast는 앞에서 얻은 Binder 프록시 대상을 서비스 관리자 프록시 대상으로 봉인합니다.

좋은 웹페이지 즐겨찾기