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判断 用不用启动动画播放),这个比较好理解,由于这里涉及到一些平台相关的流程就不描述了
网友评论