Android8.0.0-r4 – Service Manager의 프록시 객체
2755 단어 안드로이드 코드 경험
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 프록시 대상을 서비스 관리자 프록시 대상으로 봉인합니다.