Android 8.0 SurfaceFlinger

3336 단어 Graphic
1. SurfaceFlinger 컴파일러 모듈 구성
코드 경로: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

좋은 웹페이지 즐겨찾기