文章目录
- Android 开机动画的结束过程BootAnimation(基于Android10.0.0-r41)
Android 开机动画的结束过程BootAnimation(基于Android10.0.0-r41)
路径frameworks/base/cmds/bootanimation/bootanimation_main.cpp
init进程把我们的BootAnimation的二进制文件拉起来了,
从进程的main方法入手
bootAnimationDisabled判断开机动画有没有被禁止。
bootAnimationDisabled为false就是能看到开机动画。进入if条件,
ProcessState::self()->startThreadPool();启动一个线程池,用来初始化一些binder跨进程通信的一些属性,绘制图形都需要依赖waitForSurfaceFlinger();,要等SurfaceFlinger进程启动了开机动画才有用,
看下构造方法做了什么
mSession = new SurfaceComposerClient();binder调用的一个代理对象,主要是跨进程通信和 SurfaceFinger,
判断开关机的一个属性
std::string powerCtl = android::base::GetProperty("sys.powerctl", "");
if (powerCtl.empty()) {
mShuttingDown = false;
} else {
mShuttingDown = true;
}
sp是一个智能指针,如果有sp这个东西就会有对应的下面的这个类,,就会执行这个类。
void BootAnimation::onFirstRef() {
status_t err = mSession->linkToComposerDeath(this);
SLOGE_IF(err, "linkToComposerDeath failed (%s) ", strerror(-err));
if (err == NO_ERROR) {
// Load the animation content -- this can be slow (eg 200ms)
// called before waitForSurfaceFlinger() in main() to avoid wait
ALOGD("%sAnimationPreloadTiming start time: %" PRId64 "ms",
mShuttingDown ? "Shutdown" : "Boot", elapsedRealtime());
preloadAnimation();
ALOGD("%sAnimationPreloadStopTiming start time: %" PRId64 "ms",
mShuttingDown ? "Shutdown" : "Boot", elapsedRealtime());
}
}
Bootanimation继承自Thread类
先会执行readyToRun,然后执行threadLoop
mDisplayToken = SurfaceComposerClient::getInternalDisplayToken();
if (mDisplayToken == nullptr)
return -1;
DisplayInfo dinfo;
status_t status = SurfaceComposerClient::getDisplayInfo(mDisplayToken, &dinfo);
if (status)
return -1;
获取屏幕信息之后,直接跟SufaceFinger通信的一个control
// create the native surface
sp<SurfaceControl> control = session()->createSurface(String8("BootAnimation"),
dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565);
control构建一个画布。主要是和SufaceFinger通信。
初始化opengl
开机动画路径
static const char OEM_BOOTANIMATION_FILE[] = "/oem/media/bootanimation.zip";
static const char PRODUCT_BOOTANIMATION_DARK_FILE[] = "/product/media/bootanimation-dark.zip";
我们的开机动画主要走这个方法
检查退出
设置一个开机动画退出的属性,值为1就是退出。
用命令可以搜索一下它这个属性在什么地方会被设置为1
在WMS中