BootAnimation流程
bootanimation源码位于frameworks/base/cmds/bootanimation,正如其名,主要功能是加载播放开机动画,是一个C程序,编译生成的可执行文件位于/system/bin
主要逻辑:解析系统路径下的bootanimation.zip(如/system/media/bootanimation.zip),然后通过openGl方式绘制显示出来
代码目录结构如下:
- Android.bp编译脚本,编译成可执行文件
- bootanimation_main.cpp:程序入口,启动BootAnimation线程
- BootAnimation.cpp:具体的业务逻辑,
- bootanim.rc:rc脚本,配置bootanimation为系统服务
bootanimation/
├── Android.bp
├── audioplay.cpp
├── AudioPlayer.cpp
├── AudioPlayer.h
├── audioplay.h
├── BootAnimation.cpp
├── BootAnimation.h
├── bootanimation_main.cpp
├── BootAnimationUtil.cpp
├── BootAnimationUtil.h
├── bootanim.rc
├── FORMAT.md
└── OWNERS
启动BootAnimation线程
入口main函数中创建了BootAnimation对象,实际上BootAnimation是一个线程,通过run方法启动了这个线程。
Android Native Thread启动后会回调readyToRun()–>threadLoop(),IPCThreadState这个是Android模板写法,可以网上了解下。
// frameworks\base\cmds\bootanimation\BootAnimation.cpp
int main()
{
setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);
bool noBootAnimation = bootAnimationDisabled();
ALOGI_IF(noBootAnimation, "boot animation disabled");
if (!noBootAnimation) {
sp<ProcessState> proc(ProcessState::self());
ProcessState::self()->startThreadPool();
// create the boot animation object (may take up to 200ms for 2MB zip)
sp<BootAnimation> boot = new BootAnimation();
waitForSurfaceFlinger();
boot->run("BootAnimation", PRIORITY_DISPLAY);
ALOGV("Boot animation set up. Joining pool.");
IPCThreadState::self()->joinThreadPool();
}
return 0;
}
接下来,我们看BootAnimation构造方法中做了什么。构造方法中就创建了一个SurfaceComposerClient,先跳过
// frameworks\base\cmds\bootanimation\BootAnimation.cpp
BootAnimation::BootAnimation(sp<Callbacks> callbacks)
: Thread(false), mLooper(new Looper(false)), mClockEnabled(true), mTimeIsAccurate

最低0.47元/天 解锁文章
826

被折叠的 条评论
为什么被折叠?



