BootAnimation源码流程分析

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值