问题:开关机动画加载黑屏时间过长解决方法
[SOLUTION]
在开机过程,由于加入开机铃声,在播放动画前需要等待 MediaServer 初始化完成, MediaServer 的初始化
可能由于 audio 或者 camera 初始化过慢导致黑屏问题,目前遇到大多都是配置 camera
多,导致 camera 初始化阶段 search
backup sensor 太
camera sensor 耗时太长。
1. 首先对于开机 kernel logo 到动画黑屏的问题,可以通过加入开机铃声和去掉开机铃声对比测试,确定黑屏
是否和加入开机铃声相关。
2. 如果是因为加入开机铃声黑屏,从开机 log 来 check 黑屏的原因,从开机的 main_log.boot 搜索关键字“
bootanimation ”, check 如下两句 log 的间隔时间:
BootAnimation: enter threadLoop()
BootAnimation: [BootAnimation threadLoop 674]bexist=0,nMp3Exist=-
1,pSoundFileName=/system/media/bootaudio.mp3,pBackupSoundFileName=/data/lo
cal/bootaudio.mp3 (这一句 log 的每个变量的值可能具体 Log 有些不一样)
如果这对应的两行 log 的时间间隔比较长,基本可以确定是和 MediaServer 初始化时间过长有关。
3. 进一步确定 MediaServer Init 比较慢是否和 Camera 有关, check 如下的 log :
在main_log.boot这份log中,搜索CameraService started 这个关键词去看camera service 启动的时间点
CameraService( 105): CameraService started (pid=105)
接下来在 main_log.boot 搜索关键字 “ ImgSensorDrv ”, check camera search sensor 的时间
:
ImgSensorDrv: [getInstance][ImgSensorDrv] getInstance
ImgSensorDrv: [impSearchSensor]Warning( 168):SENSOR search [0]0x5645 /
[1]0x5ea1 start
ImgSensorDrv: [impSearchSensor]SENSOR search end:
如果 ImgSensorDrv start 到 end 的时间和步骤 2 bootanimation 等待 MediaServer 初始化的时间差
不多,且开始结束时间也对应,可以确定黑屏是和 Camera Search Sensor 太多有关
4. 接下来,可以进一步 check Project 配置的 Backup Camera Sensor 是不是太多,如果 Backup
Sensor 过多,可以通过去掉多余的 Camera Sensor 进一步验证。
另外还可以通过将 camera service init 时 search sensor 这个耗时的操作放到一个子线程去做,这样
MediaServer 便可以快一些地初始化完毕,动画可以快一些被播放,由于 Camera 相应文件改动比较大,需要
采用此种改进方法需要重提 eService 。
相关 FAQ :如果开机过程问题,从 Log 来看,还是和 camera search sensor 太长有关,但是配置的 sensor
不多,可以先参考如下 FAQ :
[FAQ07666] [Camera Drv]search sensor 影响开机时间过长的参考
....
kernel logo到开机动画之间闪现黑屏(android 5.X)
在BootAnimation开始绘图之前,会先做一次clear screen的动作,避免出现前面的图干扰到BootAnimation的显示。
通过check main_log先确认播放开机动画是哪个function,在对应function删除clear screen的动作的对应代码。
/frameworks/base/cmds/bootanimation/BootAnimation.cpp
450bool BootAnimation::android()
451{
452 initTexture(&mAndroid[0], mAssets, "images/android-logo-mask.png");
453 initTexture(&mAndroid[1], mAssets, "images/android-logo-shine.png");
454
/*-删除clear screen对应code-*/
455 // clear screen
456 glShadeModel(GL_FLAT);
457 glDisable(GL_DITHER);
458 glDisable(GL_SCISSOR_TEST);
459 glClearColor(0,0,0,1);
460 glClear(GL_COLOR_BUFFER_BIT);
461 eglSwapBuffers(mDisplay, mSurface);
/*-删除clear screen对应code-*/
462
463 glEnable(GL_TEXTURE_2D);
464 glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
465
......
594bool BootAnimation::movie()
......
/*-删除clear screen对应code-*/
700 // clear screen
701 glShadeModel(GL_FLAT);
702 glDisable(GL_DITHER);
703 glDisable(GL_SCISSOR_TEST);
704 glDisable(GL_BLEND);
705 glClearColor(0,0,0,1);
706 glClear(GL_COLOR_BUFFER_BIT);
707
708 eglSwapBuffers(mDisplay, mSurface);
/*-删除clear screen对应code-*/
709
......
1128bool BootAnimation::MTKmovie()
......
/*-删除clear screen对应code-*/
1222 // clear screen
1223 glDisable(GL_DITHER);
1224 glDisable(GL_SCISSOR_TEST);
1225 glDisable(GL_BLEND);[DESCRIPTION]
性能不好的手机上,当在横竖屏画面之间进行切换时会觉得屏幕有些卡。如果在“设置” -> “开
发人员选项”中关掉窗口过渡动画,就不会有卡的问题,但这样一来,所有窗口画面的动画切换效
果都没有了。如果只想在横竖屏切换时关掉切换动画,应该如何实现呢?
[SOLUTION]
可以修改 WindowManagerService.java 中的 boolean 值: static final boolean
CUSTOM_SCREEN_ROTATION = true; 把默认的 true 修改成 false ,然后重新 mm
frameworks/base/services/java ,并把新生成的 services.jar 档案 push 到手机, reboot
手机。
1226 glClear(GL_COLOR_BUFFER_BIT);
1227
1228 eglSwapBuffers(mDisplay, mSurface);
/*-删除clear screen对应code-*/
[SOLUTION]
请如下修改:
PhoneWindowManager.java
(alps/frameworks/base/policy/src/com/android/internal/policy/impl)
public int rotationForOrientationLw(int orientation, int lastRotation) {
. . . . . .
else if (mHdmiPlugged && mHdmiRotationLock && false) { //
// Ignore sensor when plugged into HDMI.
// Note that the dock orientation overrides the HDMI orientation.
preferredRotation = mHdmiRotation;
}
. . . . . .