文章初始给大家推荐一篇文章https://blog.youkuaiyun.com/xlnaan/article/details/80904309#commentBox
上篇文章已经分析到开机动画的两种播放形式了https://blog.youkuaiyun.com/we1less/article/details/116464874
首先以android()方式播放
android() AOSP/frameworks/base/cmds/bootanimation/BootAnimation.cpp
bool BootAnimation::android()
{
{
...
checkExit();
} while (!exitPending());
...
return false;
}
这里可以看到在开机动画播放的循环当中以checkExit()判断终止循环播放
void BootAnimation::checkExit() {
// Allow surface flinger to gracefully request shutdown
char value[PROPERTY_VALUE_MAX];
property_get(EXIT_PROP_NAME, value, "0");
int exitnow = atoi(value);
if (exitnow) {
requestExit();
mCallbacks->shutdown();
}
}
关于这个requestExit() 和exitPending()可以参考https://blog.youkuaiyun.com/llping2011/article/details/9706599 大致意思就是调用requestExit() ExitexitPending()就会返回true
可以在这看出 退出循环的标志就是 EXIT_PROP_NAME 的值 默认是0
static const char EXIT_PROP_NAME[] = "service.bootanim.exit";
可以查询一下这个属性到底在哪做过设置
godv@godv-OptiPlex-7070:~/godv/AOSP/android-8.1.0_r1/frameworks$ grep "service.bootanim.exit" ./ -rn
./native/services/surfaceflinger/SurfaceFlinger_hwc1.cpp:341: property_set("service.bootanim.exit", "1");
./native/services/surfaceflinger/StartPropertySetThread.cpp:33: property_set("service.bootanim.exit", "0");
./native/services/surfaceflinger/SurfaceFlinger.cpp:388: property_set("service.bootanim.exit", "1");
./base/cmds/bootanimation/BootAnimation.cpp:93:static const char EXIT_PROP_NAME[] = "service.bootanim.exit";
./base/cmds/bootanimation/FORMAT.md:77:the system property `service.bootanim.exit` to a nonzero string.)
./base/services/core/java/com/android/server/wm/WindowManagerService.java:3509: SystemProperties.set("service.bootanim.exit", "1");
可以看出 service.bootanim.exit 这个属性在 Sur

本文详细分析了Android系统中开机动画的关闭流程,从WindowManagerService的performEnableScreen()方法开始,通过设置'service.bootanim.exit'属性为1来请求结束开机动画。这一过程涉及到SurfaceFlinger服务的交互,最终由SurfaceFlinger设置该属性来完成动画的停止。整个过程涉及跨进程通信和Binder调用。
最低0.47元/天 解锁文章
912





