文章目录
- 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 waitALOGD("%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 surfacesp<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中