软件平台:android6.0
硬件平台:MT6797
这两天搞了一个定制需求,也算是一个bug吧,6.0的系统前阵子做了系统裁剪,去掉了几十个app和service,结果一开始没出现的问题,裁剪后出来了,就是系统开机会始终显示一张默认壁纸,由于我们的硬件没有lcd,所以这个问题一开始被忽视了,在我们命令行开启app的时候,发现app内部的声音出来了,但实质屏幕显示依然是壁纸。
于是,有了裁撤壁纸功能的想法。
最开始是尝试setttings配置项把def_lockscreen_disabled设置为false,但是并没啥卵用。
接着尝试看WallPaperService启动部分代码:
在SystemServer.java中有其加载启动部分,如下:
if (!disableNonCoreServices && context.getResources().getBoolean(
R.bool.config_enableWallpaperService)) {
try {
Slog.i(TAG, "Wallpaper Service");
wallpaper = new WallpaperManagerService(context);
ServiceManager.addService(Context.WALLPAPER_SERVICE, wallpaper);
} catch (Throwable e) {
reportWtf("starting Wallpaper Service", e);
}
}
可以看到标红的属性字段是是否加载壁纸服务的条件,搜索这项配置,发现是在frameworks/base/core/res/res/values/config.xml中配置,
<bool name="config_enableWallpaperService">true</bool>
将true改为false:
<bool name="config_enableWallpaperService">false</bool>
在添加了上述改动后,壁纸问题概率低了不少,但是也会偶尔出现,后来发现是SystemUI状态栏状态更新的时候会有是否呈现壁纸的判断逻辑,而这个逻辑没有添加对上述两个属性的配置判断,在此,直接把SystemUI这部分作如下修改:
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
@@ -98,13 +98,17 @@ public class StatusBarWindowManager {
}
private void applyKeyguardFlags(State state) {
- if (state.keyguardShowing) {
+ /*if (state.keyguardShowing) {
mLpChanged.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
mLpChanged.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
} else {
mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
mLpChanged.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
- }
+ }*/
+
+ // we don't need keyguard display
+ mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
+ mLpChanged.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
}
private void adjustScreenOrientation(State state) {
无论啥情况,壁纸和锁屏的标志位都置为0。
至此,解决。。。