Android开机动画被block的小问题

来源:互联网 发布:三国群英传ol 知乎 编辑:程序博客网 时间:2024/05/19 10:14

只有登上山顶,才能看到那边的风光

问题描述

新版本相比上一个版本power by android 界面较长时间才进入开机动画。

问题分析

先看整个开机各个主要节点的耗时情况,log如下:

12-31 21:28:52.777   358   358 I boot_progress_start: 1605512-31 21:28:55.479   358   358 I boot_progress_preload_start: 1875512-31 21:28:59.427   358   358 I boot_progress_preload_end: 2270612-31 21:28:59.807  2193  2193 I boot_progress_system_run: 2308512-31 21:29:00.656  2193  2193 I boot_progress_pms_start: 2393512-31 21:29:01.491  2193  2193 I boot_progress_pms_system_scan_start: 2476912-31 21:29:12.915  2193  2193 I boot_progress_pms_data_scan_start: 3619412-31 21:29:12.982  2193  2193 I boot_progress_pms_scan_end: 3626112-31 21:29:14.375  2193  2193 I boot_progress_pms_ready: 3765412-31 21:29:17.699  2193  2193 I boot_progress_ams_ready: 4097812-31 21:29:20.368  2193  2207 I boot_progress_enable_screen: 4364712-31 21:29:22.946  2193  2245 I wm_boot_animation_done: 46225

对比发现主要节点的耗时跟之前的版本都一样,整个开机耗时并没有被拉长,只是power by android界面在整个开机耗时占比升高了。

初步定位block点

播放开机动画的入口在BootAnimation.cpp文件中。开机动画入口在movie函数,查看项目中的该函数其主要做了三件事情:
a. 加载动画文件
b. 播放开机铃声
c. 播放开机动画

bool BootAnimation::movie(){    Animation* animation = loadAnimation(mZipFileName);    //...    playBackgroundMusic();    //...    playAnimation(*animation);    //...}

追踪上述过程,添加上log输出如下:

12-31 21:28:51.784   482   564 E BootAnimation: azhengye playBackgroundMusic start------>12-31 21:29:14.767   482   564 E BootAnimation: azhengye playAnimation start------------>

可以看到playBackgroundMusic消耗了较长时间。初步定位出开机动画是被开机铃声给block住了。

开机铃声

原生代码是不支持开机铃声的,playBackgroundMusic方法由同事添加,目的是为了支持开机铃声。其方法内部新起了一个线程,用来播放铃声。

void BootAnimation::playBackgroundMusic(void) {        //...        pthread_t tid;        pthread_create(&tid, NULL, playMusic, (void *)fileName);        pthread_join(tid, NULL);        //...}

这里用到了pthread_join,而pthread_join会block调用线程,也就是说只有当playMusic返回后,才会继续向下走playAnimation。

那么这里这里能不能换成非block的pthread_detach来替代pthread_join呢?
答案是不能,因为这样会导致开机铃声跟动画不同步,正常来讲我们的开机铃声跟开机动画应该同时起来,如果不这样做,那么就有可能出现开机动画已经开始播放了,但开机铃声稍后才会出现。

不是问题的问题

定位到block点在播放开机铃声,在跟上一个版本对比,原来上一个版本铃声文件配置错误,压根就没播放铃声。新版本修复了该问题。恰好测试不了解这个背景,拿上一个版本跟现在的版本做了对比,最后爆出了问题。

总体来讲该问题不算问题,开机过程中要播放铃声免不了要花些时间。虽然该问题原因比较明显,但在分析的过程中注意到了pthread_join跟pthread_detach还是有收获的。

原创粉丝点击