在调试Android4.2.2 10.1寸LCD驱动时无意发现4.2.2有闪屏的bug(其实也不能称它为bug,个人认为应该是系统两种不同的图像混叠策略导致在不同硬件平台优化不匹配)。
现象:在开启应用程序或者在应用程序退出时,快速闪过HOME图像。 后来看到很多Android用户在升级到4.2.2是都出现了闪屏。而解决办法网上也搜得到。
勾选Setting ---->developer options------->Disable HW overlays (选项勾选后所有的图像混叠都由GPU实现) 。对于一般用户这样做就可以了。 但是这种闪屏现象很容易让人感觉系统不稳定,或是lcd驱动有什么问题。这就要求在Android源码编译时就完成Disable HW overlays选项的配置。
而开发者选项位于Setting中,很容易让人想到,去修改Setting的默认配置,方法如下:
如果想修改系统启动后加载的默认值,修改SettingsProvider默认值,Settings能够配置Android系统的各种设置,这些设置的默认值都是由frameworks中的SettingsProvider从数据库中读取的,那么第一次开机的时候这些数据都是从哪儿来的呢?
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
这个文件就是用来存储Android系统的默认设置
例如:
<integername="def_screen_off_timeout">600000</integer>设置关屏超时时间的默认值
<integername="def_screen_brightness">102</integer>设置亮度的默认值
<boolname="def_install_non_market_apps">false</bool>设置是否允许安装非Market应用程序的默认值
如果想定义defaults.xml中没有的,在这里添加后,需修改
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java,加入自己的存储代码。
但是在Setting中找不到Disable HW overlays有关的选项。 还好有aSysBang的指导:
HWC这个东西不是用settingsprovider存储的。
那你往database里面怎么写也不会被调用到的。
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp中有跟显示相关的配置,只需修改下面红字部分即可。
SurfaceFlinger::SurfaceFlinger()
: BnSurfaceComposer(), Thread(false),
mTransactionFlags(0),
mTransactionPending(false),
mAnimTransactionPending(false),
mLayersRemoved(false),
mRepaintEverything(0),
mBootTime(systemTime()),
mVisibleRegionsDirty(false),
mHwWorkListDirty(false),
mDebugRegion(0),
mDebugDDMS(0),
mDebugDisableHWC(1),
mDebugDisableTransformHint(0),
mDebugInSwapBuffers(0),
mLastSwapBufferTime(0),
mDebugInTransaction(0),
mLastTransactionTime(0),
mBootFinished(false)
修改后,编译源码,烧写system.img 。启动后,Setting ---->developer options------->Disable HW overlays 选项就被默认勾选了。闪屏现象消失。