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还是有收获的。
- Android开机动画被block的小问题
- 修改Android开机动画问题
- 关于开机动画的问题
- Android简单的开机动画
- android开机动画的制作
- android 开机动画的制作
- android 开机动画的制作
- Android开机动画的制作
- Android开机动画的制作
- android开机动画不循环播放问题
- android 开机logo 开机动画
- 替换Android手机的开机动画小结
- Android Animation开机动画的优化
- 替换Android手机的开机动画小结
- Android 开机图片/文字/动画的修改
- android开机LOGO与动画的制作
- Android 开机图片/文字/动画的修改
- android 第三个开机动画的修改
- iOS解耦与模块化之路 -制作自己的Spec私有库
- java excel 导出文件名乱码问题解决方法
- 使用泛型方法在Java中安全地进行强制类型转换
- msm8905刷屏过程分析
- script标签到底该放在哪里
- Android开机动画被block的小问题
- Qt生成应用程序图标
- Cheapest Palindrome(最便宜的回文)
- linux 安装jdk和安装Tomcat 和rsync和crontab搭配的备份。
- TortoiseSVN的bin目录下面没有svn.exe
- win10 npm安装node-sass文件出错
- Javascript本地存储数据方案
- Hadoop入门之Sqoop的安装和数据导入导出
- JAVA中Properties的使用