Android8 开机动画结束分析

1.因为学习所以用的Android_8 的代码,很老。新的Android变了很多,所以不一定一样。

2.在bootanimation_main.cpp,这个文件里开始了开机动画,继续跟踪进取看看那里结束。

为什么在这个bootanimation_main.cpp里呢?而不是在BootAnimation里呢。查了一下发现算是一个Android的设计吧,在这个xxx_main.cpp里是入口,然后在main方法里,new一个BootAnimation来进行调用,入口和逻辑相互分离。

3.在bootanimation_main.cpp的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();

        waitForSurfaceFlinger();

        // create the boot animation object
        sp<BootAnimation> boot = new BootAnimdation(new AudioAnimationCallbacks());
        ALOGV("Boot animation set up. Joining pool.");

        IPCThreadState::self()->joinThreadPool();
    }
    ALOGV("Boot animation exit");
    return 0;

第一个setpriority就是设置开机动画的进程优先级,设置为ANDROID_PRIORITY_DISPLAY也就是-4,是android显示级的UI。

第二个是个看看是不是需要跳过开机动画的判断

复制代码
bool bootAnimationDisabled() {
    char value[PROPERTY_VALUE_MAX];
    property_get("debug.sf.nobootanimation", value, "0");
    if (atoi(value) > 0) {
        return true;
    }

    property_get("ro.boot.quiescent", value, "0");
    return atoi(value) > 0;
}

这第一个属性是一个debug的属性,设置为1就可以设置为不显示开机动画。

复制代码
debug.sf.nobootanimation

第二个属性是ro.boot.quiescent,是一个静默启动的属性也是不显示开机动画。

接下来是一个

startThreadPool() 开启了Binder线程池,虽然对于binder还不是很了解。

然后等待surfaceflinger开启

开启后是是new 了一个BootAnimation,然后在这里作了很多操作。

  1. 探究BootAnimation的逻辑

这个BootAnimation继承了Thread,Thread又继承了Refbase,所以可以用智能指针sp那些东西。

然后这个地方,就重写了首次调用的逻辑,执行了线程的run方法。

复制代码
void BootAnimation::onFirstRef() {
    status_t err = mSession->linkToComposerDeath(this);
    ALOGE_IF(err, "linkToComposerDeath failed (%s) ", strerror(-err));
    if (err == NO_ERROR) {
        run("BootAnimation", PRIORITY_DISPLAY);
    }
}

再往下会执行ReadyToRun方法,其实注释上也有写创建了一个native surface相当于画布,然后初始化opengl,然后是加密动画相关的代码跳过了,然后判断这两个地方有没有文件

复制代码
static const char OEM_BOOTANIMATION_FILE[] = "/oem/media/bootanimation.zip";
static const char SYSTEM_BOOTANIMATION_FILE[] = "/system/media/bootanimation.zip";

如果有就把路径赋给mZipFIleName。

5.进入BootAniamtion threadloop, 如果mZipFIleName没有值就进入android自己的逻辑。

复制代码
if (mZipFileName.isEmpty()) {
    r = android();
} else {
    r = movie();
}

靠近下方有一个do while循环开始绘制,然后在最后checkexit()判断一个属性

复制代码
service.bootanim.exit

是否可以退出。

6.在那里设置了这个属性呢?

./base/services/core/java/com/android/server/wm/WindowManagerService.java:3509: SystemProperties.set("service.bootanim.exit", "1");

然后通过打堆栈的方法,发现是在FallbackHome的地方,这个FallbackHome呢就是显示系统正在启动中的那个界面。

还有另一个地方

./native/services/surfaceflinger/SurfaceFlinger.cpp:388: property_set("service.bootanim.exit", "1");

这个是在bootFInished调用了开机动画结束,然后grep一下发现这个bootFinished是在

./native/libs/gui/ISurfaceComposer.cpp:537: bootFinished();

其他地方也不怎么像。

这是一个switch case,在这里面调用了。

复制代码
case BOOT_FINISHED: {
    CHECK_INTERFACE(ISurfaceComposer, data, reply);
    bootFinished();
    return NO_ERROR;
}

然后这个值是

./native/libs/gui/include/gui/ISurfaceComposer.h:207: BOOT_FINISHED = IBinder::FIRST_CALL_TRANSACTION,

然后再查那个 FIRST_CALL_TRANSACTION值。

wangliteng@wangliteng:~/Android_8/frameworks$ grep "FIRST_CALL_TRANSACTION" ./ -rn | grep surface

./base/services/core/java/com/android/server/wm/WindowManagerService.java:3524: surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, // BOOT_FINISHED

发现在WindowManagerService.java:3524,其实就是从第一个fallbackhome里上一个关闭开机动画的下面。

复制代码
surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, // BOOT_FINISHED
        data, null, 0);

好的,那就开机动画结束啦。

相关推荐
jack186896 小时前
安卓手机忘记锁屏密码怎么办? 无需密码也可解锁
android·智能手机
应用市场9 小时前
不用一张图片的像素小游戏:小人是字符串,房间是矩形,平衡靠两千个假玩家
android·kotlin·游戏开发
stevenzqzq10 小时前
android 对渠道的理解
android
QEasycloud10 小时前
BOM接口抛转失败钉钉通知策略实战教程:MySQL异常日志到钉钉消息的端到端配置
android·mysql·钉钉
AIsoft_868910 小时前
医患交流内容如何做好记录?
android·iphone
蒸鱼Yuzheng10 小时前
Android Native 崩溃证据链:Tombstone、Build ID 与 Trace 如何联合归因
android·ndk·tombstone·调试符号·崩溃分析
事圆则缓11 小时前
Kotlin 变量与函数:把页面状态和行为写成清楚的契约
android·开发语言·kotlin
hunterandroid11 小时前
MVVM 迁移到 MVI:复杂页面状态如何收敛
android
妖星11 小时前
Android 开机动画定制:从 bootanimation.zip 到源码编译
android
临期冰淇淋12 小时前
MTK平台 安卓16 GMS报错修改
android·java·前端