仅Android 14出现libinput.so中VelocityTracker崩溃的原因排查求助
Android 14设备libinput.so SIGSEGV崩溃排查及疑问
根据Google Play Console数据,仅Android 14设备出现如下崩溃:
[libinput.so] android::VelocityTracker::addMovement(long, int, int, float) SIGSEGV backtrace: #00 pc 0x000000000006fa64 /system/lib64/libinput.so (android::VelocityTracker::addMovement(long, int, int, float)+444) #01 pc 0x000000000007052c /system/lib64/libinput.so (android::VelocityTracker::addMovement(android::MotionEvent const*)+1284) #02 pc 0x000000000020abd4 /system/framework/arm64/boot-framework.oat (art_jni_trampoline+132) #03 pc 0x0000000000715084 /system/framework/arm64/boot-framework.oat (android.view.VelocityTracker.addMovement+68) #04 pc 0x0000000000707754 /system/framework/arm64/boot-framework.oat (android.view.GestureDetector.onTouchEvent+660)
恳请各位提供可能的原因线索。
更新[2023-12-10]
应用使用了ScaleGestureDetector,以下为相关代码(所有代码均包含在try-catch块中,为简洁起见此处省略):
scaleGestureDetector = new ScaleGestureDetector(activity, new ScaleListener()); private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { @Override public boolean onScale(@NonNull ScaleGestureDetector detector) { try { float fScaleCurrent = detector.getScaleFactor(); if ((detector.getCurrentSpan() > (getResources().getDisplayMetrics().widthPixels + getResources().getDisplayMetrics().heightPixels)) && (Math.abs(fScaleCurrent - 1) < 0.03)) { } else { _fScaleFactor *= fScaleCurrent; } } catch (Exception ex) { } return true; } } _relativeLayoutCell.setOnTouchListener((v, event) -> { MotionEvent eventCopy= MotionEvent.obtain(event); gestureDetector.onTouchEvent(eventCopy); return false; });
更新[2024-01-01]
尽管Android 14设备并未进入应用安装量Top5 API版本,但该崩溃仍是最频发的崩溃类型,且全部来自三星设备。
更新[2024-01-09]
终于收到来自OPPO和一加机型的崩溃报告,但绝大多数崩溃仍来自三星设备,且仅Android 14设备出现该崩溃。
更新[2024-07-08]
Android 14上的用户感知崩溃率(日活跃用户中至少遭遇一次感知崩溃的占比)高达3.4%,是不良行为阈值(1.09%)的三倍多。
我最终找到了解决方案——移除使用GestureDetector检测双击的代码。我原以为以下被移除的双击检测代码是标准写法:
final GestureDetector gestureDetector = new GestureDetector(getActivity(), new GestureDetector.SimpleOnGestureListener() { @Override public boolean onDoubleTap(@NonNull MotionEvent e) { try { //handle double-tap; } catch (Exception ex) { } return true; } }); _relativeLayoutCell.setOnTouchListener((v, event) -> { final MotionEvent eventCopy = MotionEvent.obtain(event); executorService.execute(()->{ gestureDetector.onTouchEvent(eventCopy); eventCopy.recycle(); }); return false; });
虽然通过这种方式避免双击检测已彻底解决问题,但我十分好奇为何这段双击检测代码仅在Android 14设备上导致如此高的用户感知崩溃率。
内容的提问来源于stack exchange,提问作者Hong
相关产品推荐
相关产品推荐

