Android 12(S) 图像显示系统 - SurfaceFlinger的启动和消息队列处理机制(四)
必读:
Android 12(S) 图像显示系统 - 开篇
1 前言
SurfaceFlinger作为Android图形显示系统处理逻辑的核心单元,我们有必要去了解其是如何启动,初始化及进行消息处理的。这篇文章我们就来简单分析SurfaceFlinger这个Binder系统服务的一些基本处理逻辑。接下来分两部分讲解:
>> SurfaceFlinger启动与初始化
>> SurfaceFlinger消息队列处理机制
Tips:
本篇涉及的代码位置:
/frameworks/native/services/surfaceflinger/
2 SurfaceFlinger的启动与初始化
SurfaceFlinger是一个Binder系统服务,Android设备开机启动时就会带起SurfaceFlinger服务进程并完成一些初始化动作。
从Android S开始,SurfaceFlinger被编译为一个可执行二进制档案:surfaceflinger(放置于设备/system/bin/下)。
可执行档surfaceflinger的makefile
如下这段代码中,可以看到这个可执行档与surfaceflinger.rc这个init rc档相关联,这样开机启动时,init进程就可以解析这个rc档,带起SurfaceFlinger服务进程
cc_binary {
name: "surfaceflinger",
defaults: ["libsurfaceflinger_binary"],
init_rc: ["surfaceflinger.rc"],
srcs: [
":surfaceflinger_binary_sources",
// Note: SurfaceFlingerFactory is not in the filegroup so that it
// can be easily replaced.
"SurfaceFlingerFactory.cpp",
],
shared_libs: [
"libSurfaceFlingerProp",
],
logtags: ["EventLog/EventLogTags.logtags"],
}
再来瞅瞅surfaceflinger.rc这个档案的内容,主要时设置一些SurfaceFlinger服务进程启动属性
service surfaceflinger /system/bin/surfaceflinger
class core animation
user system
group graphics drmrpc readproc
capabilities SYS_NICE
onrestart restart zygote
task_profiles HighPerformance
socket pdx/system/vr/display/client stream 0666 system graphics u:object_r:pdx_display_client_endpoint_socket:s0
socket pdx/system/vr/display/manager stream 0666 system graphics u:object_r:pdx_display_manager_endpoint_socket:s0
socket pdx/system/vr/display/vsync stream 0666 system graphics u:object_r:pdx_display_vsync_endpoint_socket:s0
这里我们就简简单单理解为:设备开机启动时,init进程解析surfaceflinger.rc,然后去执行/system/bin/surfaceflinger,从而启动了SurfaceFlinger服务进程。
如果在设备console下执行ps,你就可以看到这个进程PID了
console:/ $ ps -A | grep surfaceflinger
system 210 1 133412 38160 0 0 S surfaceflinger
可执行档surfaceflinger的main函数入口
在此我们仅摘录主要的代码并注释如下:
* /frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp
int main(int, char**) {
...
// 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<ProcessState> ps(ProcessState::self());
ps->startThreadPool();
...
// 创建SurfaceFlinger对象,由强指针指向。
// SurfaceFlinger继承RefBase类,所以此处一旦new出对象赋给sp指针后,将立刻触发SurfaceFlinger类的onFirstRef方法的调用。
// instantiate surfaceflinger
sp<SurfaceFlinger> flinger = surfaceflinger::createSurfaceFlinger();
...
// SurfaceFlinger类正式初始化
// initialize before clients can connect
flinger->init();
// SurfaceFlinger向ServiceManager注册Binder服务,
// 这样在其他进程中可以通过getService+SERVICE_NAME来获取SurfaceFlinger服务,继而可以和SurfaceFlinger类进行Binder通信。
// publish surface flinger
sp<IServiceManager> sm(defaultServiceManager());
sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false,
IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL | IServiceManager::DUMP_FLAG_PROTO);
...
// SurfaceFlinger类进入主循环(此处注意SurfaceFlinger类未继承Threads类,不遵循Threads类的接口执行顺序)
// run surface flinger in this thread
flinger->run();
return 0;
}
对于main函数,简简单单把握一下几点就可以了:
- 创建SurfaceFlinger对象,触发执行 SurfaceFlinger::onFirstRef()
- 调用SurfaceFlinger::init()进行初始化
- 注册服务到ServiceManager(名字是"SurfaceFlinger")
- 调用SurfaceFlinger::run()
Tips:
在设备console上执行service list命令就可以看到注册的服务:注册的名称是SurfaceFlinger, 这个服务实现的接口是android.ui.ISurfaceComposer
console:/ $ service list | grep Surface
1 SurfaceFlinger: [android.ui.ISurfaceComposer]
SurfaceFlinger类定义
* /frameworks/native/services/surfaceflinger/SurfaceFlinger.h
class SurfaceFlinger : public BnSurfaceComposer,
public PriorityDumper,
private IBinder::DeathRecipient,
private HWC2::ComposerCallback,
private ISchedulerCallback {
请关注公众号:Android元宇宙 继续阅读最新文章!