当前位置:   article > 正文

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

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<ProcessState> ps(ProcessState::self());
    ps->startThreadPool();

    // instantiate surfaceflinger
    //创建对象
    sp<SurfaceFlinger> 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<IServiceManager> 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, &param) != 0) {
        ALOGE("Couldn't set SCHED_FIFO");
    }

    // run surface flinger in this thread
    //执行run方法
    flinger->run();

    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

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

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

在这里插入图片描述

线程run起来

在这里插入图片描述

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

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

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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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

在这里插入图片描述

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

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

grep "HandleControlMessage"  ./ -rn
  • 1

在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/653364
推荐阅读
相关标签
  

闽ICP备14008679号