You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:17:29