Android 8.0 SurfaceFlinger
3336 단어 Graphic
코드 경로:frameworks/native/services/surfaceflinger
SurfaceFlinger 2진법은surfaceflinger(main 입구) 실행 가능한 파일과libsurfaceflinger로 나뉜다.so 라이브러리 파일surfaceflinger 파일에mainsurfaceflinger.cpp 파일을 컴파일하여 모듈 입구로 하여 so 파일에서 진정으로 실현합니다.
Android.mk 코드 모듈 컴파일링 구성은 다음과 같습니다.
surfaceflinger
LOCAL_SRC_FILES := \
main_surfaceflinger.cpp
....
LOCAL_MODULE := surfaceflinger
libsurfaceflinger.so
LOCAL_SRC_FILES := \
Client.cpp \
...
LayerRejecter.cpp \
...
RenderEngine/GLES20RenderEngine.cpp \
LOCAL_MODULE := libsurfaceflinger
...
ifeq ($(TARGET_USES_HWC2),true)
LOCAL_CFLAGS += -DUSE_HWC2
LOCAL_SRC_FILES += \
SurfaceFlinger.cpp \
DisplayHardware/HWComposer.cpp
else
LOCAL_SRC_FILES += \
SurfaceFlinger_hwc1.cpp \
DisplayHardware/HWComposer_hwc1.cpp
endif
ASFDSFADF2, SurfaceFlinger 실행 바이너리 파일surfaceflinger
surfaceflinger 실행 파일은mainsurfaceflinger.cpp 파일은 독립적으로 컴파일되어 있으며 주로 프로세스 시작 환경을 구축하는 것을 책임진다.직접 부호:
int main(int, char**) {
// 8.0 ,Android hidl , JNI->Native->HAL , hidl service/client 。 Android Framework HAL , , , , 。
startHidlServices();
signal(SIGPIPE, SIG_IGN);
// When SF is launched in its own process, limit the number of
// binder threads to 4.
ProcessState::self()->setThreadPoolMaxThreadCount(4);
// start the thread pool
sp ps(ProcessState::self());
ps->startThreadPool();
// SurfaceFlinger , 。SurfaceFlinger RefBase , new sp , SurfaceFlinger onFirstRef 。
// instantiate surfaceflinger
sp flinger = new SurfaceFlinger();
setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);
set_sched_policy(0, SP_FOREGROUND);
// Put most SurfaceFlinger threads in the system-background cpuset
// Keeps us from unnecessarily using big cores
// Do this after the binder thread pool init
if (cpusets_enabled()) set_cpuset_policy(0, SP_SYSTEM);
// SurfaceFlinger
// initialize before clients can connect
flinger->init();
// SurfaceFlinger ServiceManager Binder , , getService+SERVICE_NAME SurfaceFlinger , SurfaceFlinger Binder 。
// publish surface flinger
sp sm(defaultServiceManager());
sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);
// publish GpuService
sp gpuservice = new GpuService();
sm->addService(String16(GpuService::SERVICE_NAME), gpuservice, false);
struct sched_param param = {0};
param.sched_priority = 2;
if (sched_setscheduler(0, SCHED_FIFO, ¶m) != 0) {
ALOGE("Couldn't set SCHED_FIFO");
}
// SurfaceFlinger ( SurfaceFlinger Threads , Threads )
// run surface flinger in this thread
flinger->run();
return 0;
}
3. SurfaceFlinger 라이브러리 파일libsurfaceflinger.so