Android图形系统(六)-app与SurfaceFlinger服务连接过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android图形系统(六)-app与SurfaceFlinger服务连接过程相关的知识,希望对你有一定的参考价值。

参考技术A 经过上一篇的概览,我们对android图形系统渲染流程有了一个大致的了解,这篇开始做细节分析。那么先来总结下app与SurfaceFlinger服务连接过程。

经过前面的activity 、window 、view 的分析我们大致了解了Activity的显示过程。其实Surface的创建过程与Activity的显示过程密不可分。

那么就从Activity.makeVisible 开始捋下流程:

1 Activity.makeVisible getWindowManager() 并执行addView。

2 经过WindowManagerImpl 和 WindowManagerGlobal addView , 最终创建了ViewRootImpl

3 ViewRootImpl 内部会new Surface() ,它是一个Parcelable对象,可在进程间传递,但目前仅是一个空壳,还未被赋值。
同时,通过WindowManagerGlobal.getWindowSession()获取了Session实例,准备好了与WMS通信,并且Session内有个成员变量SurfaceSession值得关注,它的初始化是在Session的windowAddedLocked方法,先埋个伏笔。

4 根据流程我们知道,最终ViewRootImpl会在走setView, 在这个方法中开始了两个流程:

requestLayout执行会走消息,因此它虽然在addToDisplay前面,但是执行是在之后的,因此我们先来看看mWindowSession.addToDisplay,这个过程最终是在WMS执行addWindow方法:

我们之前埋过伏笔的,windowAddedLocked创建了SurfaceSession 对象,并将当前 Session 添加到 WMS.mSessions 成员变量。SurfaceSession 的创建会调用 JNI,在 JNI 调用 nativeCreate()。

从这里开始要细说下了,这是应用程序与SurfaceFlinger建立连接的关键点:

跟踪到android_view_SurfaceSession.cpp 的nativeCreate()方法,创建了SurfaceComposerClient 对象,并且将这个对象赋值给类型为sp<SurfaceComposerClient>的智能指针mSession时,就会导致SurfaceComposerClient类的成员函数onFirstRef被调用:

SurfaceComposerClient类的成员函数getComposerService用来获得SurfaceFlinger服务的一个代理接口.

ComposerService类是单例模式,当我们第一次调用它的静态函数getInstance的时候,它就会在构造函数中获得SurfaceFlinger服务的一个代理接口,并且保存在它的成员变量mComposerService中,同时会通过这个代理接口的成员函数getCblk来获得一块匿名共享内存mServerCblkMemory。这块匿名共享内存是由SurfaceFlinger服务创建的,用来描述系统显示屏的信息,例如,显示屏的个数、大小、方向、密度等等信息。

这时候sm有值了,在接着onFirstRef()往下执行:

是不是感觉特别绕,下面来简单总结下:

首先ComPoserService作为client 与 SurfaceFlinger server进行binder IPC , 获取到SurfaceFlinger创建的Client对象,它相当于是SurfaceFlinger内部对应用程序客户端的封装对象,而Client与SurfaceComposerClient又互为binder ipc的两端,SurfaceComposerClient为client端,Client为server端。

这样,应用进程成功通过SurfaceComposerClient与SurfaceFlinger建立了连接。

下篇分析app请求SurfaceFlinger创建Surface过程。

参考:
https://blog.csdn.net/Luoshengyang/article/details/7857163
https://blog.csdn.net/armwind/article/details/73436532

Android入门

.Android系统特性与平台架构

系统特性:

  • 应用程序框架支持组件的重用与替换(app发布时遵守了框架的约定,其他app也可以使用该模块)
  • Dalvik虚拟机:专门为移动设备优化 -集成的浏览器:开源的WebKit引擎
  • SQLite结构化的数据存储
  • 优化的图形库,多媒体支持,GSM电话技术,蓝牙等
  • 采用软件叠层方式构建

平台架构图:

技术分享

相关术语的解析

  1. Dalvik: Android特有的虚拟机,和JVM不同,Dalvik虚拟机非常适合在移动终端上使用!
  2. AVD: (android virtual machine):安卓虚拟设备,就是安卓的模拟器
  3. ADT: (android development tools)安卓开发工具
  4. SDK:(software development kit)软件开发工具包,就是安卓系统,平台架构等的工具集合,如adb.exe
  5. DDMS:(dalvik debug monitor service)安卓调试工具
  6. adb:安卓调试桥,在sdk的platform-tools目录下,功能很多,命令行必备
  7. DX工具:将.class转换成.dex文件
  8. AAPT:(android asset packing tool),安卓资源打包工具
  9. R.java文件:由aapt工具根据App中的资源文件自动生成,可以理解为资源字典
  10. AndroidManifest.xml:app包名 + 组件声明 + 程序兼容的最低版本 + 所需权限等程序的配置文件

以上是关于Android图形系统(六)-app与SurfaceFlinger服务连接过程的主要内容,如果未能解决你的问题,请参考以下文章

从整体上看Android图像显示系统

Android图形系统(八)-app与SurfaceFlinger共享UI元数据过程

Flutter(六)Android与Flutter混合开发(Hybird)

Android 图形系统详解

Android入门

文献列表