SurfaceFlinger启动流程分析

init进程启动SurfaceFlinger,代码分析也就从Init.cpp开始

1.init.cpp main()

int main(int argc, char** argv) {
    ...
    am.QueueEventTrigger("early-init");

    // Trigger all the boot actions to get us started.
    am.QueueEventTrigger("init");

    // Don't mount filesystems or start core system services in charger mode.
    std::string bootmode = GetProperty("ro.bootmode", "");
    if (bootmode == "charger") {
        am.QueueEventTrigger("charger");
    } else {
        am.QueueEventTrigger("late-init");//最后trigger late-init
    }

}

2.init.rc trigger late-init

开机init流程,在mtk平台上可以查看bootprop文件,也可以查看kernel log搜索init:

@system/core/rootdir/init.rc
# Mount filesystems and start core system services.
on late-init
    trigger early-fs

    # Mount fstab in init.{$device}.rc by mount_all command. Optional parameter
    # '--early' can be specified to skip entries with 'latemount'.
    # /system and /vendor must be mounted by the end of the fs stage,
    # while /data is optional.
    trigger fs
    trigger post-fs

    # Mount fstab in init.{$device}.rc by mount_all with '--late' parameter
    # to only mount entries with 'latemount'. This is needed if '--early' is
    # specified in the previous mount_all command on the fs stage.
    # With /system mounted and properties form /system + /factory available,
    # some services can be started.
    trigger late-fs

    # Now we can mount /data. File encryption requires keymaster to decrypt
    # /data, which in turn can only be loaded when system properties are present.
    trigger post-fs-data

    # Now we can start zygote for devices with file based encryption
    trigger zygote-start

    # Load persist properties and override properties (if enabled) from /data.
    trigger load_persist_props_action

    # Remove a file to wake up anything waiting for firmware.
    trigger firmware_mounts_complete

    trigger early-boot
    trigger boot  //trigger boot

3.trigger boot

on boot
    # Start standard binderized HAL daemons
    class_start hal

    class_start core   //启动class core的service

4.class_start分析

@system/core/init/builtins.cpp
BuiltinFunctionMap::Map& BuiltinFunctionMap::map() const {
    constexpr std::size_t kMax = std::numeric_limits<std::size_t>::max();
    // clang-format off
    static const Map builtin_functions = {
        {"bootchart",               {1,     1,    do_bootchart}},
        {"chmod",                   {2,     2,    do_chmod}},
        {"chown",                   {2,     3,    do_chown}},
        {"class_reset",             {1,     1,    do_class_reset}},
        {"class_restart",           {1,     1,    do_class_restart}},
        {"class_start",             {1,     1,    do_class_start}},   //do_class_start

static int do_class_start(const std::vector<std::string>& args) {
        /* Starting a class does not start services
         * which are explicitly disabled.  They must
         * be started individually.
         */
    ServiceManager::GetInstance().
        ForEachServiceInClass(args[1], [] (Service* s) { s->StartIfNotDisabled(); });
    return 0;
}
    
@services.cpp
bool Service::StartIfNotDisabled() {   //定义为disabled不会被启动
    if (!(flags_ & SVC_DISABLED)) {
        return Start();
    } else {
        flags_ |= SVC_DISABLED_START;
    }
    return true;
}

5.启动core surfaceFlinger

xref: /frameworks/native/services/surfaceflinger/surfaceflinger.rc
service surfaceflinger /system/bin/surfaceflinger
    class core animation //core
    user system
    group graphics drmrpc readproc
    onrestart restart zygote
    writepid /dev/stune/foreground/tasks
    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
    
xref: /frameworks/native/cmds/servicemanager/servicemanager.rc

service servicemanager /system/bin/servicemanager
    class core animation
    user system
    group system readproc
    critical
    onrestart restart healthd
    onrestart restart zygote
    onrestart restart audioserver
    onrestart restart media
    onrestart restart surfaceflinger
    onrestart restart inputflinger
    onrestart restart drm
    onrestart restart cameraserver
    writepid /dev/cpuset/system-background/tasks
    shutdown critical
    
xref: /frameworks/base/cmds/bootanimation/bootanim.rc
service bootanim /system/bin/bootanimation
    class core animation
    user graphics
    group graphics audio
    disabled    //disabled无法再init启动
    oneshot
    writepid /dev/stune/top-app/tasks

native service就启动了,但是如bootani之类的定义为disabled就无法启动

6.Log

通过在kernel log搜索init关键字查看

 

7.总结

开机流程为preloader--lk(little kernel)--kernel init --init--zygote--systemserver--keyguard,wallpaper,launcher

logo显示的时间段位lk(little kernel)--kernel init --init--surfaceflinger--bootanimation --zygote

log显示各时间大概为(logo时间为lk 到bootanimation start  开进动画时间 bootanimation start --bootanimation end)

-------

preloader 2s

lk  4s

-------

kernel start

kernel-init-done  2s

init mount start

init mount end  时间小于2s

init boot 

init start surfaceflinger

bootanimation start    --logo 显示结束

zygote start

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SurfaceFlinger是Android系统中的一个重要组件,负责管理和显示所有的图形界面。它的显示流程如下: 1. 应用程序创建一个Surface对象,将图形数据发送给SurfaceFlinger。 2. SurfaceFlinger将图形数据存储在一个称为SurfaceTexture的缓冲区中。 3. SurfaceFlinger使用OpenGL ES对图形数据进行处理和渲染。 4. SurfaceFlinger将渲染后的图像发送到显示器。 5. 如果有多个应用程序同时发送图形数据,SurfaceFlinger会根据优先级和Z轴深度对它们进行排序和合成。 6. 最终,SurfaceFlinger将所有图形数据合成为一个图像,并将其显示在屏幕上。 总之,SurfaceFlinger是Android系统中的一个非常重要的组件,它负责管理和显示所有的图形界面,保证了Android系统的流畅性和稳定性。 ### 回答2: SurfaceFlinger是Android的图形渲染引擎,负责掌控所有图形对象的显示。下面是SurfaceFlinger的显示流程。 1. 确定显示设备:SurfaceFlinger首先要确定使用哪个硬件设备来显示图像。 2. 提取图形对象:SurfaceFlinger会提取界面中包含的所有图形对象,这些对象可以是应用程序创建的窗口,也可以是系统悬浮窗、状态栏、壁纸等。 3. 图形对象组装:SurfaceFlinger会将所有被提取的图形对象组装成层(layer),按照层级关系维护图形对象的顺序。 4. 图形对象合成:SurfaceFlinger会使用OpenGL ES对所有层进行合成,生成一张完整的帧缓存。 5. 帧缓存提交:SurfaceFlinger将生成的帧缓存提交给硬件设备进行显示。 整个显示过程中,SurfaceFlinger还负责处理窗口跨越的动画效果,以及处理图形对象的动态增加或删除等情况。 需要注意的是,在上述流程中,层级关系对于图形对象的显示非常重要。较上层的对象会覆盖掉较下层的对象,这个特性在界面中用于实现窗口的遮挡和浮动效果。而不同的层级可以有不同的属性,例如透明度等,这些属性也会影响它们在合成帧缓存时的表现。此外,每个图形对象在SurfaceFlinger内部都会有一个对应的Surface对象,Surface对象内部保存了该图形对象的像素数据,SurfaceFlinger会使用这些数据进行图形对象的合成和显示。 ### 回答3: SurfaceFlinger是Android操作系统用于显示图形的一个重要组件,它负责管理系统中所有显示的界面,包括应用程序UI、系统UI、动画效果及其它与显示相关的任务。下面我们简单介绍一下SurfaceFlinger的工作流程。 SurfaceFlinger在系统启动时便会启动,它通过系统调用EGL创建一个屏幕缓冲区(framebuffer),这个缓冲区是硬件加速的显存空间,它用于显示内容。应用程序或系统UI产生的每一个图形子集必须是基于帧缓冲区中的Surface对象,这些Surface对象可以是不同应用或UI组件的输出。这些输出通常是在本地内存中被创建或花费大量的CPU时间计算,但是它们最终都会被发送到SurfaceFlinger进行显示处理。 在处理单个图形子集之前,SurfaceFlinger使用双缓冲技术来管理整个帧缓冲区的更新。当一帧完全渲染后,SurfaceFlinger直接交换当前帧缓冲区与另一个缓冲区的指针,实现页面刷新的无缝过渡。这种技术可以避免一些出现残影和撕裂的问题。 处理一个图形子集通常分为三个阶段:更新、合并和显示。在更新阶段,渲染线程会对传入的图形数据进行处理,并将其写入屏幕缓冲区的一个Surface中。在合并阶段,SurfaceFlinger会将所有正在显示的Surface的像素数据合并到屏幕缓冲区的输出Surface中,并应用混合和过滤效果。最后,在显示阶段,渲染引擎会将输出Surface中的像素数据转发到帧缓冲区中,然后输出到屏幕上显示给用户。 除了处理图形子集外,SurfaceFlinger还负责处理用户输入,并将其传递给正在显示的应用程序或UI组件。用户输入通常包括触摸事件、按键事件、语音输入和手写输入等。 总之,SurfaceFlinger是Android系统中一个重要且复杂的组件,担负着管理和协调所有显示图像的任务,对于保证用户体验和操作流畅度起到了至关重要的作用。每个应用程序与SurfaceFlinger交互时,必须要遵循先进先出的原则,并且应用程序中应该尽可能地减少对SurfaceFlinger的请求,以保证更高的流畅度和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值