是什么导致 Android 13 设备上出现“getHistoricalRawPointerCoords:MotionEvent 的历史索引 1 无效”?

2024-01-02

以下崩溃很少见,但确实会发生在不同的设备上:

[libc.so] abort
SIGABRT

Thread:

getHistoricalRawPointerCoords: Invalid historical index 1 for MotionEvent { action=UP, id[0]=0, x[0]=810.527, y[0]=1609.98, eventTime=232287463228000, downTime=232287242045000, deviceId=3, source=TOUCHSCREEN, displayId=0, eventId=<US_SOCIAL_SECURITY_NUMBER>}

回溯:

#00  pc 0x0000000000051ce8  /apex/com.android.runtime/lib64/bionic/libc.so (abort+164)
  #01  pc 0x00000000006f9f28  /apex/com.android.art/lib64/libart.so (art::Runtime::Abort(char const*)+472)
  #02  pc 0x0000000000016ea8  /apex/com.android.art/lib64/libbase.so (android::base::SetAborter(std::__1::function<void (char const*)>&&)::$_3::__invoke(char const*)+80)
  #03  pc 0x00000000000a3090  /system/lib64/libbinder.so (android::base::LogMessage::~LogMessage()+352)
  #04  pc 0x000000000002a824  /system/lib64/libinput.so (android::MotionEvent::getHistoricalRawPointerCoords(unsigned long, unsigned long) const+504)
  #05  pc 0x000000000002a578  /system/lib64/libinput.so (android::MotionEvent::getHistoricalRawAxisValue(int, unsigned long, unsigned long) const+28)
  #06  pc 0x0000000000048c40  /system/lib64/libinput.so (android::VelocityTracker::addMovement(android::MotionEvent const*)+496)
  #07  pc 0x00000000002f0384  /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (art_jni_trampoline+132)
  #08  pc 0x0000000000c93f14  /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (android.view.VelocityTracker.addMovement+68)
  #09  pc 0x0000000000c80bb4  /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (android.view.GestureDetector.onTouchEvent+660)
  #10  pc 0x0000000000c924d0  /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (android.view.ScaleGestureDetector.onTouchEvent+176)
  #11  pc 0x000000000020a2b0  /apex/com.android.art/lib64/libart.so (nterp_helper+4016)

相关代码:

relativeLayoutFoo.setOnTouchListener((v, event) -> {
    try {
        if (event == null) {
            return false;
        } else {
            //consume event
  
        }
    } catch (Exception ex) {
        
    }
    return false;
}); 

任何人都可以提供有关此事故的可能原因的提示吗?

请注意帖子中的“eventId=”。该应用程序与美国社会保障无关。它根本不访问用户帐户信息。它不使用任何第三方广告包。

更新[2023-05-26]

I modified the code to consume only copies of MotionEvent by using MotionEvent.obtain(event) and it has not made any difference. This appears to occur only on Android 13 devices: enter image description here

是什么让 Android 13 如此特别,导致出现这些崩溃?

这次崩溃可能与这个问题 https://issuetracker.google.com/issues/244248855.

更新[2023-10-01]

这是来自 Android 13 设备的另一份崩溃报告。此事件的 eventId 不是 ,而是 2097529323。

Thread: getHistoricalRawPointerCoords: Invalid array index 6 for MotionEvent { action=POINTER_DOWN(3), id[0]=1, x[0]=748.557, y[0]=1198.73, id[1]=2, x[1]=728.326, y[1]=1627.55, id[2]=3, x[2]=295.227, y[2]=1446.13, id[3]=6, x[3]=633.913, y[3]=1036.8, pointerCount=4, eventTime=15864785755000, downTime=15491031632000, deviceId=2, source=TOUCHSCREEN, displayId=0, eventId=2097529323}

backtrace:
  #00  pc 0x0000000000062eee  /apex/com.android.runtime/lib/bionic/libc.so (abort+138)
  #01  pc 0x00000000005406db  /apex/com.android.art/lib/libart.so (art::Runtime::Abort(char const*)+1406)
  #02  pc 0x00000000000238ad  /apex/com.google.mainline.primary.libs@340817060/lib/libbase.so/23d1f2e6ffbc35ebafef6e31362a3ad20b7abe9823895afd2d10c652dbdbbe07db02a7a5f2db936dc8c8553a986dd6324be678f3d22e389cd8261ae6d5bcecc3/libbase.so (android::base::SetAborter(std::__1::function<void (char const*)>&&)::$_0::__invoke(char const*)+48)
  #03  pc 0x0000000000071b5d  /system/lib/libbinder.so (android::base::LogMessage::~LogMessage()+228)
  #04  pc 0x00000000000206e1  /system/lib/libinput.so (android::MotionEvent::getHistoricalRawPointerCoords(unsigned int, unsigned int) const+456)
  #05  pc 0x000000000002047d  /system/lib/libinput.so (android::MotionEvent::getRawAxisValue(int, unsigned int) const+36)
  #06  pc 0x000000000033d3b5  /data/misc/apexdata/com.android.art/dalvik-cache/arm/boot.oat (art_jni_trampoline+60)
  #07  pc 0x0000000000b8bd4d  /data/misc/apexdata/com.android.art/dalvik-cache/arm/boot.oat (android.view.MotionEvent.getRawX+156)
  #08  pc 0x0000000000a69aa7  /data/misc/apexdata/com.android.art/dalvik-cache/arm/boot.oat (android.view.GestureDetector.onTouchEvent+438)

tl;dr:在您的函数中,使用以下模式:

MotionEvent myEventCopy = MotionEvent.obtain(event);
// store or pass around 'myEventCopy' for later use

长答案:

假设您正确索引到 MotionEvent,则此崩溃的最典型原因是事件被回收后的使用。您没有发布 OnTouchListener 的全部内容。但我认为它可能是这样的:

  1. 将事件存储在某个集合中,以便在“onTouchListener”完成后使用
  2. 将事件传递给另一个线程
  3. 发布一些可运行的文件并引用此事件

一般来说,MotionEvent 的生命周期是这样的(只是一个代码草图):

MotionEvent event = MotionEvent.obtain();
View.onTouchListener(event);
event.recycle();

视图的侦听器完成后,该事件将被回收。这意味着同一个 MotionEvent 对象将用于存储具有不同数量的指针或历史坐标的不同事件。

解决方案是在侦听器代码中完全处理事件,或者通过以下方式复制接收到的事件MotionEvent.obtain(MotionEvent e)API 以避免竞争条件。

由于历史原因,Android 使用 MotionEvent 的对象池来尝试减少分配和垃圾回收的数量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是什么导致 Android 13 设备上出现“getHistoricalRawPointerCoords:MotionEvent 的历史索引 1 无效”? 的相关文章

随机推荐