부팅 과정에서 SurfaceFlinger의 실행(hW 초기화)을 최대한 뒤로 미루기

1. 이슈
- Android 부팅 과정에서 SurfaceFlinger의 실행을 최대한 뒤로 미루기
- HW 초기화(egl 등) 과정 및 gralloc 등을 취대한 뒤로 미루기 

2. 이슈 관련 Android 부팅 과정
- 프로세스 실행 순서
- ... => surfaceflinger => zygote => system_server => ...
- 위는 단지 프로세스의 실행 순서이다
- 내부적으로 service(binder 통신) 통신에 의한 수행 순서는 별개이다

- surfaceflinger 프로세스 (framework/base/cmds/surfaceflinger/SurfaceFlinger.cpp)
- main => SurfaceFlinger::instantiate(); 
=> defaultServiceManager()→addService(String16(“SurfaceFlinger”), new SurfaceFlinger())
=> SurfaceFlinger::readyToRun (Initializing graphics H/W...)
...
- zygote 프로세스 (frameworks/base/core/java/com/android/internal/os/ZygoteInit.java)
- main => ...=> preloadClasses(); => preloadResources(); => ...

- system_server 프로세스 (frameworks/base/services/java/com/android/server/SystemServer.java)
- "Entropy Mixer" 서비스 실행
- "Power Manager" 서비스 실행
- "Actiity Manager" 서비스 실행
- "Telephony Registry" 서비스 실행
- "Scheduling Policy" 서비스 실행
- "Package Manager" 서비스 실행
- ...

3. surfaceflinger의 readyToRun 수행을 blocking 하면 어떤 일이 벌어지나?
- Android Jelly Bean Emulator에서 테스트 수행 결과
- 대부분의 초기화 데몬들은 뜨고 zygote는 class/resource를 preloding이 완료, system_server에 의한 서비스 실행에서 blocking 된다
- system_server의 Activity Manager 서비스 실행에서 blocking 된다
- 아래 로그를 계속 출력하면서 blocking
- ServiceManager(  143): Waiting for service SurfaceFlinger..
- 위 로그를 출력하는 소스 위치
- getService in frameworks/native/libs/binder/IServiceManager.cpp

4. 결론
 - surfaceflinger 프로세스는 readyToRun 에서 시그널을 대기
- system_server 프로세스가 주요 서비스를 실행하는데 Activity Manager 서비스를 수행하는 과정에서 SurfaceFlinger의 readyToRun 에 시그널 전달
- 정상 부팅 과정 수행 


댓글

이 블로그의 인기 게시물

SSH 연결 Delay 해결

[ELK] search guard를 이용한 보안 설정 (사용자 권한)

공공데이터(openapi) 사용법 (특정 정류소, 버스의 남은 좌석 확인 하기)