乐于分享
好东西不私藏

安卓aosp16的桌面Launcher原生自带2个crash问题分析汇总

安卓aosp16的桌面Launcher原生自带2个crash问题分析汇总

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)

堆栈分析

崩溃链从上到下:

  1. 用户执行上滑回桌面手势
  2. QuickstepTransitionManager 创建壁纸打开动画
  3. ScalingWorkspaceRevealAnim 构造时尝试获取 blur radius
  4. Resources.getDimensionPixelSize() 抛出 NotFoundException

关键信息在错误信息中:

  • Resource ID: 0x7f0a0049
  • Type: #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 类型 错
        }
    )
问题
说明
调用 API
getDimensionPixelSize()
 只能接受 dimen 类型资源
传入资源
R.integer.max_depth_blur_radius
 是 integer 类型
类型码 #0x10
Android 资源类型码,0x10 = TypedValue.TYPE_INT_DEC,不是 dimension
结果
Resources 框架按 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
LayoutInflater 解析 task.xml line #18 失败
中间
InvocationTargetExceptionTaskView
 类通过反射构造时,构造函数内部抛出异常
内层
(被 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群,积极讨论各种行业难点痛点疑难问题,答疑服务等。

请联系马哥微信:

目前所有专题课程如下:
1、经典fw的入门到精通实战八件套专题
详细课表:
Android Framework开发rom实战合集课表/车载车机手机高级系统开发工程必会技能
重大消息:Hal+perfetto-systrace+SurfaceFlinger合集新专题发布

相关学习资料