aosp16 r4版本的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

<integer name="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 类型 错
        }
    )
问题说明
调用 APIgetDimensionPixelSize() 只能接受 dimen 类型资源
传入资源R.integer.max_depth_blur_radiusinteger 类型
类型码 #0x10Android 资源类型码,0x10 = TypedValue.TYPE_INT_DEC,不是 dimension
结果Resources 框架按 dimen 类型查找时发现类型不匹配,抛 NotFoundException

为什么另外两个文件没有崩溃? 同项目中 LauncherBackAnimationController.java:603BaseDepthController.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

堆栈分析

崩溃链有三层包装:

层级异常类型含义
外层InflateExceptionLayoutInflater 解析 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都无法轻松解决了?

希望各位网友粉丝朋友分享分享你们的经验哈,可以留言哈

更多fw系统开发等干货分享,请关注下面原文
原文地址:https://mp.weixin.qq.com/s/HWZTN73GE8RStC4_V6kZww

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

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

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

打赏作者

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

抵扣说明:

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

余额充值