Android开机动画的基本流程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


android开机动画


一、开机动画的启动

以MTK平台 android10为例
一般开机动画的启动是在init.rc中,start bootanim,
bootanimation源码原生实在frameworks\base\cmds\bootanimation下面,但是MTK的自己做了一个开机的动画的源码在vendor下面, 其他平台的基本都类似,一般是由surfaceflinger.rc触发的在frameworks/native/services/surfaceflinger/StartPropertySetThread.cpp中property_set(“service.bootanim.exit”, “0”);
然后bootanimation.rc启动,开始播放开机动画

二、开机动画的实现

main方法实在bootanimation_main.cpp中, 最后调用BootAnimation.cpp中实现的,这部分每个平台可能有不一样,特别是自己修改的开机动画,但是基本上就是调用mediaserver和surfaceflinger来播放声音和画面,其中具体的实现播放需要自己看代码,一般最后会循环检测service.bootanim.exit的值, 为1的时候,结束开机动画


三、开机动画的结束

init启动zygote进程之后,由zygote孵化出了system_server,然后system_server启动了各种各种的系统所需的服务,其中就有AMS,AMS启动并ready后,就调用AMS的systemReady方法,到这里新老安卓版本就有一点区别
老版本:startHomeActivityLocked 调用,之后打开锁屏,launcher之类的
新版本:mAtmInternal.startHomeOnAllDisplays(currentUserId, “systemReady”);
新老版本的差别在于directboot模式,这里home的隐式启动,同时也会打开settings的一个界面
START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.android.settings/.FallbackHome} from uid 0
等待userUnlock完成, 其实就是解锁用户空间,luancher同时也会启动,只是会被锁屏覆盖,等锁屏解锁之后,userUnlock完成,luancher才能正常点击使用

launcher在这里开始加载启动之后,在launcher的主线程处于空闲时,ActivityThread.java 中的MessageQueue.IdleHandler中的实现类Idler
会调用ActivityClientController 的方法 ac.activityIdle(a.token, a.createdConfig, stopProfiling);
或者ActivityTaskManager 的am.activityIdle(a.token, a.createdConfig, stopProfiling);
这两个根据版本有点差异,不过不大

然后调用ActivityClientControll的mTaskSupervisor.activityIdleInternal(r, false /* fromTimeout /,
false /
processPausingActivities */, config);
或者 ActivityStackSupervisor.java 的activityIdleInternalLocked

在activityIdleInternal中调用了checkFinishBootingLocked();既然调用了
mService.postFinishBooting(booting, enableScreen);
即ActivityTaskManagerService.enableScreenAfterBoot 调用了 mInternal.enableScreenAfterBoot(isBooted());
其中mInternal 有个实现类 final class LocalService extends ActivityTaskManagerInternal 实现了
enableScreenAfterBoot方法
然后调用了mWindowManager.enableScreenAfterBoot(); 在方法中调用了performEnableScreen
先设置了属性值,SystemProperties.set(“service.bootanim.exit”, “1”); 开机动画服务检测到值变化就关掉
继而调用了mActivityManager.bootAnimationComplete();

设置了Tell anyone interested that we are done booting!
SystemProperties.set(“sys.boot_completed”, “1”); 这里要在研究一下,后续系统做了什么操作
然后调用 mUserController.sendBootCompleted 发出了未解锁状态的开机广播

总结

安卓高版本的代码可能有点差异, 大体上就是这样,变化不大

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android 开机动画的加载流程如下: 1. 开机自检:开机后,首先进行硬件自检。如果自检通过,将会启动 bootloader。 2. Bootloader:Bootloader 负责初始化硬件设备,加载 kernel,并且将 kernel 加载到内存中。 3. Kernel:Kernel 是 Android 操作系统的核心,负责初始化硬件设备,启动驱动程序,加载文件系统等。 4. Init 进程:Init 进程是 Android 系统中的第一个用户进程,它负责启动系统中所有的服务,并且加载所有的配置文件和属性。 5. SurfaceFlinger:SurfaceFlinger 是 Android 系统中用于显示图形的核心服务,它在启动后会创建一个显示屏幕,显示屏幕上的内容就是从应用程序中传递过来的。 6. Zygote 进程:Zygote 进程是 Android 系统中的一个特殊进程,它负责预加载常用的类和资源,以提高应用程序的启动速度。当应用程序需要启动时,Zygote 进程会 fork 出一个新的进程,该进程会继承 Zygote 进程的状态,从而加速应用程序的启动。 7. 开机动画:在上述进程启动后,系统会加载开机动画开机动画通常是一个视频或者一组图片,这些图片或视频会被 SurfaceFlinger 显示在屏幕上。 8. 启动屏幕:当开机动画结束后,系统会显示一个启动屏幕,表示 Android 系统已经启动完毕。此时,用户就可以开始使用 Android 设备了。 总的来说,Android 开机动画加载流程比较复杂,其中涉及到多个进程和服务,需要相互配合才能完成整个过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuyewen288

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值