阅读:7804回复:2

Android Direct Boot黑屏问题

楼主#
更多 发布于:2019-07-27 09:35
为了支持Direct Boot模式,系统提供了两个存储数据的地方:
1.Credential encrypted storage,默认存储数据的地方,仅在用户解锁手机后可用。
2.Device encrypted storage,主要对应的就是Direct Boot使用的存储空间。在Direct Boot模式下和用户解锁手机后都可以使用的存储空间


一般情况下,应用是无法在Direct Boot模式下运行的
如果需要某个app能够在Direct Boot模式下运行,需要注册相关APP的组。
应用组件申请在Direct Boot模式下运行:在AndroidManinfest.xml中设置 android:directBootAware="true"。


android 7.0 在启动Launcher之前会先启动一个FallbackHome,之后才会启动Launcher,通过调查发现FallbackHome属于Settings中的一个activity,Settings的android:directBootAware为true,并且FallbackHome在category中配置了Home属性,而Launcher的android:directBootAware为false,所有只有FallbackHome可以在direct boot模式下启动。
所以在ActivityManagerService启动Home界面时,从PackageManagerService(boolean startHomeActivityLocked)中获取到的Home界面就是FallbackHome


现在启动Launcher时多了一个流程,导致启动launcher比原来6.0要慢(大约4S)。这4S有时会造成设备黑屏


4S时间黑屏问题处理方法:
1.Launcher里配置属性 android:directBootAware="true",简单有效。
2.如果不能修改launcher的情况下,去除黑屏的方法:延长开机动画的显示时间,等到4s时间过去之后,显示launcher

diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
old mode 100644
new mode 100755
index 779a0dd..8043471
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -3434,7 +3434,7 @@
                     && getDefaultDisplayContentLocked().checkWaitingForWindows()) {
                 return;
             }
-
+ /*
             if (!mBootAnimationStopped) {
                 Trace.asyncTraceBegin(TRACE_TAG_WINDOW_MANAGER, "Stop bootanim", 0);
                 // stop boot animation
@@ -3443,7 +3443,7 @@
                 SystemProperties.set("service.bootanim.exit", "1");
                 mBootAnimationStopped = true;
             }
-
+
             if (!mForceDisplayEnabled && !checkBootAnimationCompleteLocked()) {
                 if (DEBUG_BOOT) Slog.i(TAG_WM, "performEnableScreen: Waiting for anim complete");
                 return;
@@ -3462,6 +3462,7 @@
             } catch (RemoteException ex) {
                 Slog.e(TAG_WM, "Boot completed: SurfaceFlinger is dead!");
             }
+ */
 
             EventLog.writeEvent(EventLogTags.WM_BOOT_ANIMATION_DONE, SystemClock.uptimeMillis());
             Trace.asyncTraceEnd(TRACE_TAG_WINDOW_MANAGER, "Stop bootanim", 0);















diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
old mode 100644
new mode 100755
index 75f2723..83db16a
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -163,6 +163,8 @@
 import android.os.Process;
 import android.os.RemoteException;
 import android.os.SystemClock;
+import android.os.SystemProperties;
+import android.os.SystemService;
 import android.os.Trace;
 import android.os.UserHandle;
 import android.os.storage.StorageManager;
@@ -2075,6 +2077,21 @@
     @Override
     public void onWindowsDrawn(long timestamp) {
         synchronized (service) {
+ //Launcher is drawn completed,box can exit bootanim
+ if(shortComponentName!=null && !shortComponentName.contains(".FallbackHome") && !"1".equals(SystemProperties.get("service.bootanim.exit")))
+ {
+ boolean wallpaperEnabled = service.mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_enableWallpaperService);
+ if(wallpaperEnabled){
+ try {
+ Thread.sleep(1000);
+ } catch (Exception e) {
+ }
+ }
+ SystemProperties.set("service.bootanim.exit", "1");
+ }
             mStackSupervisor.getActivityMetricsLogger().notifyWindowsDrawn(getWindowingMode(),
                     timestamp);
             if (displayStartTime != 0) {

最新喜欢:

zhaoyf13zhaoyf... VastStarGamesVastSt...
沙发#
发布于:2019-07-27 09:38
不错,感谢分享,学习一下
If you have nothing to lose, then you can do anything.
板凳#
发布于:2019-07-28 09:47
[url]http://190.lsal.cn/195/1329.gif?0728100424873[/url]
游客

返回顶部