Android 一种开机视频和开机动画动态选择的实现

2020-12-02  本文已影响0人  Nothing_655f

Android 一种开机视频和开机动画动态选择的实现

先看下流程图

image.png

通过property 指定文件路径

可以在device.mk 或者system.prop 中添加指定的路径

+#add for bootvideo path
+service.bootvideo.path=/system/etc/bootvideo
+#add for bootanimation path, if this path config, use bootanimation firstly
+service.anim.path=/system/media/bootanimation.zip

在bootanimation中判断文件是否存在

获取上述 property: service.anim.path 设定的路径值后判断文件是否存在

修改路径为 frameworks/base/cmds/bootanimation

diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index c7ef92f..d2f28de 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -332,10 +332,17 @@ status_t BootAnimation::readyToRun() {
     property_get("vold.decrypt", decrypt, "");

     bool encryptedAnimation = atoi(decrypt) != 0 || !strcmp("trigger_restart_min_framework", decrypt);
+    char anim_path[PROPERTY_VALUE_MAX] = {0};
+
+    property_get("service.anim.path", anim_path, "0");

     if (encryptedAnimation && (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0)) {
         mZipFileName = SYSTEM_ENCRYPTED_BOOTANIMATION_FILE;
     }
+    else if (access(anim_path, R_OK) == 0) {
+        mZipFileName = anim_path;
+        ALOGD("%s %s", __FUNCTION__, mZipFileName.string());
+    }
     else if (access(OEM_BOOTANIMATION_FILE, R_OK) == 0) {
         mZipFileName = OEM_BOOTANIMATION_FILE;
     }

在bootplayer 中判断执行路径是否存在

获取上述 property: service.bootvideo.path 设定的路径值后判断文件是否存在

diff --git a/bootplayer/bootplayer.c b/bootplayer/bootplayer.c
index 9a5c6b2..69dd8bd 100644
--- a/bootplayer/bootplayer.c
+++ b/bootplayer/bootplayer.c
@@ -396,7 +396,17 @@ int main(int argc, char *argv[])
     player_register_update_callback(&pCtrl->callback_fn, &update_player_info, 1000);
     ALOGD("player callback register....\n");

-    pCtrl->file_name = strdup(argv[1]);
+
+    char video_path[PROPERTY_VALUE_MAX] = {0};
+
+    property_get("service.bootvideo.path", video_path, "0");
+    if (!strcmp(video_path, "0")) {
+           pCtrl->file_name = video_path;
+           ALOGD("video_path %s\n", pCtrl->file_name);
+    } else {
+           pCtrl->file_name = strdup(argv[1]);
+    }
+

根据优先级启动哪一个进程

参考上述流程图,如果指定路径下有动画则优先启动bootanimation,如果没有则判断bootvideo路径,如果该路径下文件存在则启动bootvideo 进程,否则还是启动bootanimation,只是bootanimation 进程如上修改会读默认的bootanimation.zip 文件路径。

       bool state;
       char video_path[PROPERTY_VALUE_MAX] = {0};
       char anim_path[PROPERTY_VALUE_MAX] = {0};

       property_get("service.bootvideo.path", video_path, "0");
       property_get("service.anim.path", anim_path, "0");

       bool video_exist = !access(video_path, 0);
       bool anim_exist = !access(anim_path, 0);

       state = !anim_exist && video_exist;
       ALOGD("%s anim_exist:%d, video_exist:%d\n", __FUNCTION__, anim_exist, video_exist);
       ALOGD("%s :%d\n", __FUNCTION__, state);

       if (0 == state) {
            // start boot animation
       } else {
            // start boot video
       }

那么在哪里地方去添加这个判断呢?

Android的原生动画启动是在SurfaceFlinger 中

void SurfaceFlinger::startBootAnim() {
    // ......
    // start boot animation
    property_set("service.bootanim.exit", "0");
    property_set("ctl.start", "bootanim");
}

如果bootvideo 的一些相关初始化流程(如display or codec等)是在surfaceflinger初始化之后, 那么就可以在 SurfaceFlinger::startBootAnim 中判断去启动哪个流程

如果bootvideo 的一些相关初始化流程 surfaceflinger 初始化之前,那么这个优先级判断就要移动到bootvideo 之前(假设是init 进程,那么就需要在init 进程中先判断用bootvideo还是bootanimation,然后后续的流程中 surfacefling 或者bootanimation判断 用不用启动动画播放),这个比较好理解,由于这里涉及到一些平台相关的流程就不描述了

上一篇下一篇

猜你喜欢

热点阅读