Status Update
Comments
al...@google.com <al...@google.com> #2
Full stack trace of the initial failure:
08-15 21:19:59.378 2989 3302 W QueryController: AccessibilityNodeInfo returned a null child (0 of 5)
08-15 21:19:59.378 2989 3302 W QueryController: parent = android.view.accessibility.AccessibilityNodeInfo@e508; boundsInParent: Rect(0, 0 - 720, 1280); boundsInScreen: Rect(0, 0 - 720, 1280); packageName: com.android.launcher3; className: android.widget.RelativeLayout; text: null; error: null; maxTextLength: -1; stateDescription: null; contentDescription: null; tooltipText: null; viewIdResName: com.android.launcher3:id/apps_view; uniqueId: null; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: false; longClickable: false; contextClickable: false; enabled: true; password: false; scrollable: false; importantForAccessibility: false; visible: true; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_SHOW_ON_SCREEN - null]; isTextSelectable: false
08-15 21:19:59.378 3120 3120 E AndroidRuntime: FATAL EXCEPTION: main
08-15 21:19:59.378 3120 3120 E AndroidRuntime: Process: com.android.launcher3, PID: 3120
08-15 21:19:59.378 3120 3120 E AndroidRuntime: java.lang.NoSuchFieldError: No static field ACTION_SCROLL_IN_DIRECTION of type Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; in class Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; or its superclasses (declaration of 'android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction' appears in /system/framework/framework.jar!classes3.dex)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at androidx.core.view.accessibility.AccessibilityNodeInfoCompat$AccessibilityActionCompat.<clinit>(AccessibilityNodeInfoCompat.java:748)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at androidx.recyclerview.widget.LinearLayoutManager.onInitializeAccessibilityNodeInfo(LinearLayoutManager.java:275)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at androidx.recyclerview.widget.GridLayoutManager.onInitializeAccessibilityNodeInfo(GridLayoutManager.java:173)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at androidx.recyclerview.widget.RecyclerView$LayoutManager.onInitializeAccessibilityNodeInfo(RecyclerView.java:11200)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.onInitializeAccessibilityNodeInfo(RecyclerViewAccessibilityDelegate.java:81)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at androidx.core.view.AccessibilityDelegateCompat$AccessibilityDelegateAdapter.onInitializeAccessibilityNodeInfo(AccessibilityDelegateCompat.java:91)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at android.view.View.onInitializeAccessibilityNodeInfo(View.java:8752)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at com.android.launcher3.FastScrollRecyclerView.onInitializeAccessibilityNodeInfo(FastScrollRecyclerView.java:179)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at android.view.View.createAccessibilityNodeInfoInternal(View.java:8713)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at android.view.View$AccessibilityDelegate.createAccessibilityNodeInfo(View.java:30974)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at android.view.View.createAccessibilityNodeInfo(View.java:8696)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at android.view.AccessibilityInteractionController.populateAccessibilityNodeInfoForView(AccessibilityInteractionController.java:420)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at android.view.AccessibilityInteractionController.findAccessibilityNodeInfoByAccessibilityIdUiThread(AccessibilityInteractionController.java:363)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at android.view.AccessibilityInteractionController.-$$Nest$mfindAccessibilityNodeInfoByAccessibilityIdUiThread(Unknown Source:0)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at android.view.AccessibilityInteractionController$PrivateHandler.handleMessage(AccessibilityInteractionController.java:1647)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:201)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at android.os.Looper.loop(Looper.java:288)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7949)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
08-15 21:19:59.378 3120 3120 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:859)
08-15 21:19:59.379 749 762 I am_crash: [3120,0,com.android.launcher3,885767749,java.lang.NoSuchFieldError,No st
So this is specifically triggered by RV using ACTION_SCROLL_IN_DIRECTION
:
if (mRecyclerView.mAdapter != null && mRecyclerView.mAdapter.getItemCount() > 0) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
info.addAction(AccessibilityActionCompat.ACTION_SCROLL_TO_POSITION);
}
}
Which causes <clinit>
for AccessibilityActionCompat
and the resulting NSFE
for ACTION_SCROLL_IN_DIRECTION
.
al...@google.com <al...@google.com> #3
Similar stack trace after Shailen bumped the field reference into a static inner class:
08-16 21:48:55.339 10072 3236 3236 E AndroidRuntime: FATAL EXCEPTION: main
08-16 21:48:55.339 10072 3236 3236 E AndroidRuntime: Process: com.android.launcher3, PID: 3236
08-16 21:48:55.339 10072 3236 3236 E AndroidRuntime: java.lang.NoSuchFieldError: No field ACTION_SCROLL_IN_DIRECTION of type Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; in class Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; or its superclasses (declaration of 'android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction' appears in /system/framework/framework.jar!classes3.dex)
08-16 21:48:55.339 10072 3236 3236 E AndroidRuntime: at androidx.core.view.accessibility.AccessibilityNodeInfoCompat$Api34Impl.getActionScrollInDirection(AccessibilityNodeInfoCompat.java:5592)
08-16 21:48:55.339 10072 3236 3236 E AndroidRuntime: at androidx.core.view.accessibility.AccessibilityNodeInfoCompat$AccessibilityActionCompat.<clinit>(AccessibilityNodeInfoCompat.java:748)
08-16 21:48:55.339 10072 3236 3236 E AndroidRuntime: at androidx.recyclerview.widget.LinearLayoutManager.onInitializeAccessibilityNodeInfo(LinearLayoutManager.java:275)
al...@google.com <al...@google.com> #4
Which, looking at the decompiled bytecode, seems like a violation of
@NonNull
@OptIn(markerClass = {BuildCompat.PrereleaseSdkCheck.class})
public static final AccessibilityActionCompat ACTION_SCROLL_IN_DIRECTION = new AccessibilityActionCompat(
(Build.VERSION.SDK_INT >= 34) ? AccessibilityNodeInfoCompat.Api34Impl.getActionScrollInDirection() : null, 16908382, null, null, null);
At run time, the first operand expression of the conditional expression is evaluated first. If necessary, unboxing conversion is performed on the result.
The resulting boolean value is then used to choose either the second or the third operand expression:
If the value of the first operand is true, then the second operand expression is chosen.
If the value of the first operand is false, then the third operand expression is chosen.
The chosen operand expression is then evaluated and the resulting value is converted to the type of the conditional expression as determined by the rules stated above.
This conversion may include boxing (§5.1.7) or unboxing (§5.1.8) conversion.
The operand expression not chosen is not evaluated for that particular evaluation of the conditional expression.
Unless SDK_INT
is >= 34
-- and as far as I can tell it cannot be -- then we should never see that stack trace.
al...@google.com <al...@google.com> #5
What the heck? I moved this to a static init block to avoid the ternary expression, and I added logging in getActionScrollInDirection()
to validate the SDK_INT
, and we're still getting:
08-17 15:35:38.683 3203 3203 D AccessibilityNodeInfoCompat: Executing getActionScrollInDirection() on SDK_INT 33
...
08-17 15:35:38.684 3203 3203 E AndroidRuntime: FATAL EXCEPTION: main
08-17 15:35:38.684 3203 3203 E AndroidRuntime: Process: com.android.launcher3, PID: 3203
08-17 15:35:38.684 3203 3203 E AndroidRuntime: java.lang.NoSuchFieldError: No field ACTION_SCROLL_IN_DIRECTION of type Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; in class Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; or its superclasses (declaration of 'android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction' appears in /system/framework/framework.jar!classes3.dex)
08-17 15:35:38.684 3203 3203 E AndroidRuntime: at androidx.core.view.accessibility.AccessibilityNodeInfoCompat$Api34Impl.getActionScrollInDirection(AccessibilityNodeInfoCompat.java:5601)
08-17 15:35:38.684 3203 3203 E AndroidRuntime: at androidx.core.view.accessibility.AccessibilityNodeInfoCompat$AccessibilityActionCompat.<clinit>(AccessibilityNodeInfoCompat.java:750)
public static final AccessibilityActionCompat ACTION_SCROLL_IN_DIRECTION;
static {
final Object action;
if (Build.VERSION.SDK_INT >= 34) {
action = Api34Impl.getActionScrollInDirection();
} else {
action = null;
}
ACTION_SCROLL_IN_DIRECTION = new AccessibilityActionCompat(
action, android.R.id.accessibilityActionScrollInDirection, null, null, null);
}
al...@google.com <al...@google.com> #6
Fixed in the platform, you should be okay to restore the code as it was originally.
ap...@google.com <ap...@google.com> #7
Branch: androidx-main
commit 0a5b8a598b10ef9d2982431f01fb6582d3c2fd60
Author: Ryan Mentley <ryanmentley@google.com>
Date: Tue Oct 10 22:31:53 2023
Revert "Avoid class init issue in AccessibilityNodeInfoCompat"
This reverts commit 7b7d5883e4a9105471e835c9bab14ebc5ecb77b4.
Reason for revert:
According to
the root issue (
workaround.
Fixes: 296294128
Test: CI tests
Change-Id: I315c16af41c823c131ae0acd32a6601ddb6f09e3
M core/core/src/androidTest/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompatTest.java
M core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
ry...@google.com <ry...@google.com>
pr...@google.com <pr...@google.com> #8
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.core:core:1.13.0-alpha01
Description
We had to temporarily break b/296118211 , and we should restore that functionality.
AccessibilityNodeInfoCompat.ACTION_SCROLL_IN_DIRECTION
to addressNote that even with what seemed to be proper gating:
We were still getting a
NSFE
from CTS tests:However, we didn't catch this in
ClassVerificationException
or, more curiously, our own tests on pre-34 devices.