问题描述:
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
必备知识
- BootAnimation
启动流程了解 - 开机动画 关闭指令 SystemProperties.set(“service.bootanim.exit”, “1”);
- FallbackHome 了解
代码跟踪
我们在源码里面搜索看看,和动画相关指令的地方,这里只关注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(</