Launcher3 两个崩溃问题的堆栈分析与修复
最近在调试 AOSP 16 r4 Launcher3 的 Quickstep 模块时遇到两个导致启动即崩溃的
1、bug资源类型不匹配导致 Resources$NotFoundException
2、Bug 2:TaskView InflateException 如何高效分析呢?
特别是bug2属于比较难分析和解决的,各位vip学员欢迎挑战分享你的解决经验,记得留言哈。
Bug 1:资源类型不匹配导致 Resources$NotFoundException
复现步骤
桌面随意点击一个Activity进入,然后点击home按键退回桌面,发现直接crash了。
崩溃日志
FATAL EXCEPTION: main
Process: com.android.launcher3, PID: 7435
android.content.res.Resources$NotFoundException: Resource ID #0x7f0a0049 type #0x10 is not valid
at android.content.res.Resources.getDimensionPixelSize(Resources.java:863)
at com.android.quickstep.util.ScalingWorkspaceRevealAnim.<init>(ScalingWorkspaceRevealAnim.kt:189)
at com.android.launcher3.QuickstepTransitionManager.createWallpaperOpenAnimations(QuickstepTransitionManager.java:1858)
at com.android.launcher3.QuickstepTransitionManager$WallpaperOpenLauncherAnimationRunner.onAnimationStart(QuickstepTransitionManager.java:1988)
at com.android.launcher3.LauncherAnimationRunner.lambda$onAnimationStart$2(LauncherAnimationRunner.java:92)
堆栈分析
崩溃链从上到下:
用户执行上滑回桌面手势 QuickstepTransitionManager创建壁纸打开动画ScalingWorkspaceRevealAnim构造时尝试获取 blur radiusResources.getDimensionPixelSize()抛出NotFoundException
关键信息在错误信息中:
Resource ID: 0x7f0a0049Type: #0x10(即integer类型)
定位资源
通过查 R.txt 确认资源 ID 0x7f0a0049 对应的是:
int integer max_depth_blur_radius 0x7f0a0049
定义在 quickstep/res/values/config.xml:33:
<integername="max_depth_blur_radius">23</integer>
根因修复
ScalingWorkspaceRevealAnim.kt:189 的代码:
var maxBlurRadius =
launcher.resources.getDimensionPixelSize( // ← 错误!getDimensionPixelSize 要求 dimen
if (Flags.allAppsBlur() || Flags.enableOverviewBackgroundWallpaperBlur()) {
R.dimen.max_depth_blur_radius_enhanced // dimen 类型 对
} else {
R.integer.max_depth_blur_radius // integer 类型 错
}
)
getDimensionPixelSize()dimen 类型资源 | |
R.integer.max_depth_blur_radiusinteger 类型 | |
#0x10 | 0x10 = TypedValue.TYPE_INT_DEC,不是 dimension |
dimen 类型查找时发现类型不匹配,抛 NotFoundException |
为什么另外两个文件没有崩溃? 同项目中 LauncherBackAnimationController.java:603 和 BaseDepthController.java:138 使用同一个资源时正确地调用了 getInteger():
// 正确做法
mMaxBlurRadius = mLauncher.getResources().getInteger(R.integer.max_depth_blur_radius);
根据资源类型分发到不同 API:
var maxBlurRadius =
if (Flags.allAppsBlur() || Flags.enableOverviewBackgroundWallpaperBlur()) {
launcher.resources.getDimensionPixelSize(
R.dimen.max_depth_blur_radius_enhanced) // dimen → getDimensionPixelSize
} else {
launcher.resources.getInteger(
R.integer.max_depth_blur_radius) // integer → getInteger
}
Bug 2:TaskView InflateException 如何高效分析呢?
修复 Bug 1 后重新运行,在同一条代码路径上立即遇到新的崩溃。
复现步骤

系统要设置桌面随意点击一个Activity进入,然后点击home按键退回桌面,发现直接crash了。
崩溃日志
05-27 09:40:30.734 1381 1381 E AndroidRuntime: FATAL EXCEPTION: main
05-27 09:40:30.734 1381 1381 E AndroidRuntime: Process: com.android.launcher3, PID: 1381
05-27 09:40:30.734 1381 1381 E AndroidRuntime: android.view.InflateException: Binary XML file line #18 in com.android.launcher3:layout/task: Binary XML file line #18 in com.android.launcher3:layout/task: Error inflating class <unknown>
05-27 09:40:30.734 1381 1381 E AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #18 in com.android.launcher3:layout/task: Error inflating class <unknown>
05-27 09:40:30.734 1381 1381 E AndroidRuntime: Caused by: java.lang.reflect.InvocationTargetException
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at java.lang.reflect.Constructor.newInstance0(Native Method)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at android.view.LayoutInflater.createView(LayoutInflater.java:743)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:895)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:850)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:544)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:462)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.launcher3.util.ViewPool.inflateNewView(ViewPool.java:104)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.launcher3.util.ViewPool.getView(ViewPool.java:99)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.views.RecentsView.getTaskViewFromPool(RecentsView.java:2950)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.views.RecentsView.showCurrentTask(RecentsView.java:3172)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.views.RecentsView.onGestureAnimationStart(RecentsView.java:3012)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.views.LauncherRecentsView.onGestureAnimationStart(LauncherRecentsView.java:254)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.AbsSwipeUpHandler.notifyGestureAnimationStartToRecents(AbsSwipeUpHandler.java:801)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.AbsSwipeUpHandler.setupRecentsViewUi(AbsSwipeUpHandler.java:781)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.AbsSwipeUpHandler.onActivityInit(AbsSwipeUpHandler.java:656)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.AbsSwipeUpHandler$$ExternalSyntheticLambda59.test(D8$$SyntheticClass:0)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.LauncherActivityInterface.lambda$createActivityInitListener$0(LauncherActivityInterface.java:140)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.LauncherActivityInterface$$ExternalSyntheticLambda0.test(D8$$SyntheticClass:0)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.util.ContextInitListener.handleInit(ContextInitListener.java:53)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.launcher3.LauncherInitListener.handleInit(LauncherInitListener.java:36)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.launcher3.LauncherInitListener.handleInit(LauncherInitListener.java:22)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.util.ContextInitListener.init(ContextInitListener.java:49)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.launcher3.util.ContextTracker.registerCallback(ContextTracker.java:70)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.util.ContextInitListener.register(ContextInitListener.java:62)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.AbsSwipeUpHandler.initWhenReady(AbsSwipeUpHandler.java:3019)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.inputconsumers.OtherActivityInputConsumer.startTouchTrackingForWindowAnimation(OtherActivityInputConsumer.java:452)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.inputconsumers.OtherActivityInputConsumer.onMotionEvent(OtherActivityInputConsumer.java:262)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.inputconsumers.NavHandleLongPressInputConsumer.onMotionEvent(NavHandleLongPressInputConsumer.java:156)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.TouchInteractionService.onInputEvent(TouchInteractionService.java:1278)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.TouchInteractionService.$r8$lambda$JDK2db7a_ZtzI6D1EJ5hYukunXo(Unknown Source:0)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.TouchInteractionService$$ExternalSyntheticLambda6.onInputEvent(D8$$SyntheticClass:0)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.systemui.shared.system.InputChannelCompat$InputEventReceiver$1.onInputEvent(InputChannelCompat.java:78)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:277)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at android.os.MessageQueue.nativePollOnce(Native Method)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at android.os.MessageQueue.nextLegacy(MessageQueue.java:985)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at android.os.MessageQueue.next(MessageQueue.java:1094)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:197)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at android.os.Looper.loop(Looper.java:367)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:9287)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:566)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:929)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: Caused by: kotlin.UninitializedPropertyAccessException: Recents dependencies are not initialized. Call `RecentsDependencies.maybeInitialize` before using this container.
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.recents.di.RecentsDependencies$Companion.getInstance(RecentsDependencies.kt:297)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.views.TaskView.<init>(TaskView.kt:2285)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.views.TaskView.<init>(TaskView.kt:129)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.views.TaskView.<init>(Unknown Source:17)
05-27 09:40:30.734 1381 1381 E AndroidRuntime: ... 43 more
堆栈分析
崩溃链有三层包装:
InflateException | task.xml line #18 失败 | |
InvocationTargetException | TaskView | |
| (被 logcat 截断) |
定位原因的困惑?
task.xml 第 18 行:
<com.android.quickstep.views.TaskView
xmlns:android="http://schemas.android.com/apk/res/android"
...
InvocationTargetException 意味着 TaskView 类被成功加载,但构造函数内部抛出了异常。由于 logcat 输出被截断,需要回溯 TaskView 构造函数中的全部执行路径:
但是发现报错堆栈的代码行数根本对不上源码的
明显TaskView.kt才2237行,但是
05-27 09:40:30.734 1381 1381 E AndroidRuntime: at com.android.quickstep.views.TaskView.<init>(TaskView.kt:2285)
这里却展示有TaskView.kt:2285行。
那么这种kotlin代码导致的行号对不上,大家有什么好方法么?行号都无法对上代码,那么简单的crash都无法轻松解决了?
希望各位网友粉丝朋友分享分享你们的经验哈,可以留言哈
更多vip免费系统开发经典大厂面试题库获取,课程优惠购买成为vip学员进入vip群,积极讨论各种行业难点痛点疑难问题,答疑服务等。
请联系马哥微信:


夜雨聆风