• Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41)


    Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41)

    1.开机动画的启动过程概述

    下面就是BootAnimation的重要部分。

    开机动画主要跟三个东西有关系

    bootanimation surfaceflinger init

    在这里插入图片描述

    查看下Android.bp编译文件,cc_binary就是我们编译出来的可执行文件

    在这里插入图片描述

    最终的输出路径是在

    在这里插入图片描述

    系统启动的第一个进程是init,init进程会根据init.rc配置启动surfaceflinger进程。就是下面这个.rc进程

    在这里插入图片描述

    但是此时的Bootanim.rc不会启动。是disabled。

    在这里插入图片描述

    一般一个进程启动了,都会有一个对应的main方法。

    路径frameworks/native/services/surfaceflinger

    在这里插入图片描述

    int main(int, char**) {
        signal(SIGPIPE, SIG_IGN);
    
        hardware::configureRpcThreadpool(1 /* maxThreads */,
                false /* callerWillJoin */);
    
        startGraphicsAllocatorService();
    
        // 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();
    
        // instantiate surfaceflinger
        //创建对象
        sp flinger = surfaceflinger::createSurfaceFlinger();
    
        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);
    
        // initialize before clients can connect
        //执行init方法
        flinger->init();
    
        // publish surface flinger
        sp sm(defaultServiceManager());
        sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false,
                       IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL | IServiceManager::DUMP_FLAG_PROTO);
    
        startDisplayService(); // dependency on SF getting registered above
    
        struct sched_param param = {0};
        param.sched_priority = 2;
        if (sched_setscheduler(0, SCHED_FIFO, ¶m) != 0) {
            ALOGE("Couldn't set SCHED_FIFO");
        }
    
        // run surface flinger in this thread
        //执行run方法
        flinger->run();
    
        return 0;
    }
    
    

    首先进入init方法
    在这里插入图片描述

    开启一个线程,Start()之后这个线程就运行起来了。

    在这里插入图片描述

    线程run起来

    在这里插入图片描述

    bootanim设置属性,控制bootanim的一个服务要启动起来,就是这里设置属性之后就会起来了,就开始播放开机动画。

    property_set("service.bootanim.exit", "0");
        // Start BootAnimation if not started
        property_set("ctl.start", "bootanim");
    

    2.为什么设置了属性之后就会播放?

    /system/core/init.cpp

    启动属性服务

    在这里插入图片描述

    在这里插入图片描述

    跨进程通信CreateSocket

    void StartPropertyService(Epoll* epoll) {
        selinux_callback cb;
        cb.func_audit = SelinuxAuditCallback;
        selinux_set_callback(SELINUX_CB_AUDIT, cb);
    
        property_set("ro.property_service.version", "2");
    	//获取fd
        property_set_fd = CreateSocket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
                                       false, 0666, 0, 0, nullptr);
        if (property_set_fd == -1) {
            PLOG(FATAL) << "start_property_service socket creation failed";
        }
    	//监听fd句柄
        listen(property_set_fd, 8);
    
        if (auto result = epoll->RegisterHandler(property_set_fd, handle_property_set_fd); !result) {
            PLOG(FATAL) << result.error();
        }
    }
    

    回调方法handle_property_set_fd,然后调用下面这个方法

    在这里插入图片描述

    然后进到HandleControlMessage,此时我们发现这个方法不知道是哪个头文件引入进来的,所以得搜索一下。

    递归搜索当前目录以及子目录。

    grep "HandleControlMessage"  ./ -rn
    

    在这里插入图片描述

    通过名字查找服务,也就是前面设置的属性值bootanim

    找到对应的map,根据msg获取服务的状态是什么样子的,然后根据name名字去找到对应设置的服务。

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    绘制图像需要依赖surfaceflinger来绘制,所以开机动画是在surfaceflinger之后启动的。

    init启动。surfaceflinger进程的init执行,然后StartPropetySetThread线程的启动,然后再通知init进程启动开机动画进程,然后是bootanimation的main方法执行,

  • 相关阅读:
    数据结构02:线性表 链表习题02[C++]
    宇宙采集器 淘宝商家电话采集爬虫分享
    【C++】:拷贝构造函数和赋值运算符重载
    【Xilinx】基于MPSoC的OpenAMP实现(二)
    【解决】linux磁盘扩容大全:新增磁盘、原磁盘扩容、home分区root分区扩容
    Vue中v-model的使用及案例
    Windows下编译Mediapipe,C++版本
    Java笔记(12)------JDBC
    【OFDM】多径信道下OFDM通信系统误码率仿真附matlab代码
    Fast Fourier transform快速傅里叶变换
  • 原文地址:https://blog.csdn.net/weixin_46039528/article/details/139337339