去掉开机正在启动,去掉开机黑屏问题

问题描述:
1)开机动画播放不完整,第一次刷机启动能够播放完整,后面开机开机动画播放只有2秒左右
2)开机动画播放完后在进入Launcher之前会有一个 "正在启动…"显示着
3)开机动画播完后进入Launcher前有一个黑屏阶段或者白屏阶段


现象

现象描述:

  • 客户的产品平台是MTK,存在开机动画播放不完整问题,在刚刷完固件,资源加载比较多情况下开机动画能够播放完全。除此之外开机uboot、内核启动比较久,开机动画只有2-3秒左右,根本没有播放完全。 rk 和 和全志平台,uboot、内核启动还算比较快的,开机动画能够播放完整
  • 存在开机后一直显示正在启动
  • 存在开机动画结束后进入Launcher阶段黑屏问题、白屏问题、或者黑一下。和 apk 大小有关系,越大 黑越久。

涉及到修改的资源文件

frameworks/base/services/core/java/com/android/server/wm/ActivityRecord.java
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/FallbackHome.java

必备知识

代码跟踪

我们在源码里面搜索看看,和动画相关指令的地方,这里只关注framework层:

在这里插入图片描述
可以看到关闭开机动画地方涉及到两个类:WindowManagerService.java ActivityRecord.java

修改点一

追踪,WindowManagerService.java
在线源码位置
根据关闭开机动画指令位置,追踪到方法:

performEnableScreen 方法

 private void performEnableScreen() {
   
        synchronized (mGlobalLock) {
   
           ....
            if (!mBootAnimationStopped) {
   
                Trace.asyncTraceBegin(TRACE_TAG_WINDOW_MANAGER, "Stop bootanim", 0);
                // stop boot animation
                // formerly we would just kill the process, but we now ask it to exit so it
                // can choose where to stop the animation.
                SystemProperties.set("service.bootanim.exit", "1");
                mBootAnimationStopped = true;
            }
           .....
        }
        try {
   
            mActivityManager.bootAnimationComplete();
        } catch (RemoteException e) {
   
        }
        mPolicy.enableScreenAfterBoot();
        // Make sure the last requested orientation has been applied.
        updateRotationUnchecked(false, false);
    }

反向追踪到调用的地方WindowManagerService 类: enableScreenAfterBoot() -》performEnableScreen 代码如下

 public void enableScreenAfterBoot() {
   
         .....
        mPolicy.systemBooted();
        performEnableScreen();
    }

那么又是谁调用了 enableScreenAfterBoot 方法,我们在源码里面找。 如下,ActivityTaskmanagerInternal 指向的不就是 ActivityTaskManagerService 吗?
在这里插入图片描述
ActivityTaskManagerService 看看对应的方法:

   @Override
        public void enableScreenAfterBoot(boolean booted) {
   
            writeBootProgressEnableScreen(SystemClock.uptimeMillis());
            mWindowManager.enableScreenAfterBoot();
            synchronized (mGlobalLock) {
   
                updateEventDispatchingLocked(booted);
            }
        }

继续往上追代码,是谁执行了 enableScreenAfterBoot 方法

  void postFinishBooting(boolean finishBooting, boolean enableScreen) {
   
        mH.post(() -> {
   
            if (finishBooting) {
   
                mAmInternal.finishBooting();
            }
            if (enableScreen) {
   
                mInternal.enableScreenAfterBoot(isBooted());
            }
        });
    }

这里不就是一个Handler ,所以这个Handler 延时执行几秒就实现了 开机动画播放时间就延长了,控制时间晚些执行关闭开机动画的操作就实现了让开机动画播放完整的需求。

所以,修改点一:

修改点一:ActivityTaskManagerService.java ->postFinishBooting 方法:

     void postFinishBooting(boolean finishBooting, boolean enableScreen) {
   
-        mH.post(</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ItJavawfc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值