当前位置:   article > 正文

Android开机动画的基本流程

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 发出了未解锁状态的开机广播

总结

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

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

闽ICP备14008679号