From 2a9a83a45832b7d5d19901290ec68ab7524b608e Mon Sep 17 00:00:00 2001 From: Brett Chabot Date: Fri, 17 Jul 2026 15:46:29 -0700 Subject: [PATCH] Catch LinkageError in addition to ClassNotFoundErrors. TestRequestBuilder uses Class.forName to load the legacy Suppress annotation and other annotation classes. The call sites currently only catch ClassNotFoundException, but according to the reference docs Class.forName can also throw LinkageError e.g. NoClassDefFoundError. There has been a report of TestRequestBuilder.maybeAddLegacySuppressFilter throwing a fatal NoClassDefFoundError when used with AGP 9.4.0-alpha03. See issuetracker bug 536117227 To make androidx.test.runner more resilient to class loading issues, this commit expands the catch block to also catch Linkage errors PiperOrigin-RevId: 949797644 --- runner/android_junit_runner/CHANGELOG.md | 2 ++ .../androidx/test/internal/runner/TestRequestBuilder.java | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/runner/android_junit_runner/CHANGELOG.md b/runner/android_junit_runner/CHANGELOG.md index 43ae3fda7..5e886f303 100644 --- a/runner/android_junit_runner/CHANGELOG.md +++ b/runner/android_junit_runner/CHANGELOG.md @@ -6,6 +6,8 @@ **Bug Fixes** +* Catch LinkageError when loading annotation classes (b/536117227) + **New Features** * Make perfetto trace sections for tests more identifiable by prefixing with "test:" and using fully qualified class name. (b/204992764) diff --git a/runner/android_junit_runner/java/androidx/test/internal/runner/TestRequestBuilder.java b/runner/android_junit_runner/java/androidx/test/internal/runner/TestRequestBuilder.java index 043ab6a4f..0ed9bac6f 100644 --- a/runner/android_junit_runner/java/androidx/test/internal/runner/TestRequestBuilder.java +++ b/runner/android_junit_runner/java/androidx/test/internal/runner/TestRequestBuilder.java @@ -449,7 +449,7 @@ private void maybeAddLegacySuppressFilter() { (Class) Class.forName("android.test.suitebuilder.annotation.Suppress"); filter = filter.intersect(new AnnotationExclusionFilter(legacySuppressClass)); - } catch (ClassNotFoundException e) { + } catch (ClassNotFoundException | LinkageError e) { // ignore } } @@ -817,7 +817,7 @@ private Class loadAnnotationClass(String className) { try { Class clazz = Class.forName(className); return (Class) clazz; - } catch (ClassNotFoundException e) { + } catch (ClassNotFoundException | LinkageError e) { Log.e(TAG, String.format("Could not find annotation class: %s", className)); } catch (ClassCastException e) { Log.e(TAG, String.format("Class %s is not an annotation", className));