文章目录
- 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 发出了未解锁状态的开机广播
总结
安卓高版本的代码可能有点差异, 大体上就是这样,变化不大