diff --git a/exporters/common/src/main/java/io/opentelemetry/exporter/internal/marshal/StringEncoderHolder.java b/exporters/common/src/main/java/io/opentelemetry/exporter/internal/marshal/StringEncoderHolder.java index 3f0155b20fe..ba64ba4ebda 100644 --- a/exporters/common/src/main/java/io/opentelemetry/exporter/internal/marshal/StringEncoderHolder.java +++ b/exporters/common/src/main/java/io/opentelemetry/exporter/internal/marshal/StringEncoderHolder.java @@ -39,6 +39,12 @@ public static StringEncoder createFallbackEncoder() { */ @Nullable public static StringEncoder createUnsafeEncoder() { + // Android exposes sun.misc.Unsafe, but String does not have the OpenJDK internal fields used by + // UnsafeStringEncoder. ART logs an error when these missing fields are queried, even though the + // exception is caught. + if ("Dalvik".equals(System.getProperty("java.vm.name"))) { + return null; + } return UnsafeStringEncoder.createIfAvailable(); } diff --git a/exporters/common/src/test/java/io/opentelemetry/exporter/internal/marshal/StringEncoderTest.java b/exporters/common/src/test/java/io/opentelemetry/exporter/internal/marshal/StringEncoderTest.java index 6a0f3e8a813..a0b117292cf 100644 --- a/exporters/common/src/test/java/io/opentelemetry/exporter/internal/marshal/StringEncoderTest.java +++ b/exporters/common/src/test/java/io/opentelemetry/exporter/internal/marshal/StringEncoderTest.java @@ -13,6 +13,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledOnJre; import org.junit.jupiter.api.condition.JRE; +import org.junitpioneer.jupiter.SetSystemProperty; class StringEncoderTest { @@ -57,6 +58,12 @@ void testUtf8SizeLatin1_VarHandle() { testUtf8SizeLatin1(varHandleStringEncoder); } + @Test + @SetSystemProperty(key = "java.vm.name", value = "Dalvik") + void unsafeStringEncoderNotAvailableOnAndroid() { + assertThat(StringEncoderHolder.createUnsafeEncoder()).isNull(); + } + @SuppressWarnings("AvoidEscapedUnicodeCharacters") private static void testUtf8Encoding(StringEncoder stringEncoder) { assertThat(stringEncoder).isNotNull();