一、SurfaceFlinger编译模块组成

码路径:frameworks/native/services/surfaceflinger

SurfaceFlinger二进制分成surfaceflinger(main入口)可执行文件和libsurfaceflinger.so库文件。surfaceflinger文件有main_surfaceflinger.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  
ASFDSFADF
二、SurfaceFlinger可执行二进制文件surfaceflinger
surfaceflinger可执行文件由main_surfaceflinger.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 poolsp<ProcessState> ps(ProcessState::self());ps->startThreadPool();
    // 初始化SurfaceFlinger对象,由强指针指向。SurfaceFlinger继承RefBase类,所以此处一旦new出对象赋给sp指针后,将立刻出发SurfaceFlinger类的onFirstRef方法的调用。// instantiate surfaceflingersp<SurfaceFlinger> 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 initif (cpusets_enabled()) set_cpuset_policy(0, SP_SYSTEM);
    // SurfaceFlinger类正式初始化// initialize before clients can connectflinger->init();
    // SurfaceFlinger向ServiceManager注册Binder服务,这样在其他进程中,可以通过getService+SERVICE_NAME来获取SurfaceFlinger服务,继而可以和SurfaceFlinger类进行Binder通信。// publish surface flingersp<IServiceManager> sm(defaultServiceManager());sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);// publish GpuServicesp<GpuService> 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 threadflinger->run();return 0;
}
三、SurfaceFlinger库文件libsurfaceflinger.so

Android 8.0 SurfaceFlinger相关推荐

  1. Android 7.0 init.rc的一点改变

    点击打开链接 在Android 7之前的版本中,系统Native服务,不管它们的可执行文件位于系统什么位置都定义在根分区的init.*.rc文件中.这造成init*.rc文件臃肿庞大,给维护带来了一些 ...

  2. Android 5.0 SEAndroid下如何获得对一个内核节点的访问权限

    Android 5.0下,因为采取了SEAndroid/SElinux的安全机制,即使拥有root权限,或者对某内核节点设置为777的权限,仍然无法在JNI层访问. 本文将以用户自定义的内核节点/de ...

  3. 解读Android 4.0 Camera原生应用程序的设计思路

    解读Android 4.0 Camera原生应用程序的设计思路 一篇很不错的文章: http://my.oschina.net/jerikc/blog/90791 1. 设置摄像头方向 2. 打开线程 ...

  4. Android 8.0 学习(12)---init.rc语法及解析过程总结

    Android 8.0 init.rc语法及解析过程总结       Android O高通默认使用QMMI取代了fastmmi,但是由于QMMI是一个APK,属于Android应用层面,所以必须等到 ...

  5. Android 6.0动态权限(转)

    转自:http://blog.csdn.net/uana_777/article/details/54136255 Part One 权限区分  Android 6.0 为了保护用户隐私,将一些权限的 ...

  6. Android 8.0学习(32)---Android 8.0源码目录结构详解

    Android 8.0源码目录结构详解 android的移植按如下流程:     (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     (2)正确挂载文件系统 ...

  7. Android 8.0系统源码分析--Camera processCaptureResult结果回传源码分析

    相机,从上到下概览一下,真是太大了,上面的APP->Framework->CameraServer->CameraHAL,HAL进程中Pipeline.接各种算法的Node.再往下的 ...

  8. android 开机动画竖屏,Android 5.0 开机横屏修改方法

    如果理解了Android的设计的原理, 其实这个修改原理十分简单, 比一些网上流出来的粗暴的修改方式既美观又实用. 修改分为三部分: 1: 上层(Java)修改 既然设计到屏幕的修改, 肯定想到了直接 ...

  9. android ble 设备扫描程序,Android应用开发Android 7.0 BLE scan 问题:程序无错但扫描不到BLE设备...

    本文将带你了解Android应用开发Android 7.0  BLE scan 问题:程序无错但扫描不到BLE设备,希望本文对大家学Android有所帮助. < 最近在做毕设,需要几周内从头学起 ...

最新文章

  1. 小学英语运用计算机教学自评,信息技术在小学英语课堂中如何更有效地利用教学评价...
  2. JavaWeb课程复习资料——中文乱码上下文处理
  3. C#中发送消息给指定的窗口到消息循环
  4. 数据结构为什么那么难?
  5. 远控免杀5---Veil免杀
  6. Shell中计算模块 bc的使用
  7. 学地球物理的如何搞好软件开发
  8. LVS_DR实现过程...
  9. C++学生信息管理系统7.0
  10. 用美图秀秀批量修改图像尺寸分辨率大小、批量修改名字
  11. 2021-10-11 全国大学生软件测试大赛赛前学习参考资料
  12. elementUI Tree组件实现双击事件
  13. 2017年看的tracking论文
  14. css做三角形横线加小三角,CSS创建三角形(小三角)的几种方法
  15. 量子纠缠在量子计算机中的作用,量子计算机的强大,为什么需要量子纠缠
  16. 仲裁器设计(二)-- Round Robin Arbiter 轮询调度算法
  17. 传音控股以科技立品牌,2021一季度净利大增125.93%
  18. Swift对接C++库
  19. 计算机无法查看共享的打印机,共享电脑找到了,但看不到打印机,这是为什么?如何解决?...
  20. vivado报错place 30-69和place 30-574

热门文章

  1. 在SQL中修改数据库名称
  2. va_list 使用总结
  3. 索尼相机摄像机断电MP4视频无XML文件数据恢复修复方法
  4. java中Date的getTime()函数
  5. 电气火灾监控系统在某市新能源有轨电车示范线工程的应用
  6. Pytorch学习日志之函数用法记录
  7. 手写springboot自动装配 autoConfiguration
  8. Javalin:一个轻量的 Web Framework
  9. 【贺图】子兮祝您2015年新春快乐!
  10. Flink DataStream API(基础版)