Skip to content

Commit 9892a51

Browse files
authored
Merge branch '8.x.x' into feat/remove-reportfulldisplayed
2 parents 5618a31 + f1b7116 commit 9892a51

40 files changed

+172
-138
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
- This will reduce the number of spans created by the SDK
1010
- `options.experimental.sessionReplay.errorSampleRate` was renamed to `options.experimental.sessionReplay.onErrorSampleRate` ([#3637](https://github.com/getsentry/sentry-java/pull/3637))
1111
- Manifest option `io.sentry.session-replay.error-sample-rate` was renamed to `io.sentry.session-replay.on-error-sample-rate` ([#3637](https://github.com/getsentry/sentry-java/pull/3637))
12+
- Replace `synchronized` methods and blocks with `ReentrantLock` (`AutoClosableReentrantLock`) ([#3715](https://github.com/getsentry/sentry-java/pull/3715))
13+
- If you are subclassing any Sentry classes, please check if the parent class used `synchronized` before. Please make sure to use the same lock object as the parent class in that case.
1214

1315
### Features
1416

@@ -41,6 +43,10 @@
4143
- Honor ignored span origins in `SentryTracer.startChild` ([#3704](https://github.com/getsentry/sentry-java/pull/3704))
4244
- Add `enable-spotlight` and `spotlight-connection-url` to external options and check if spotlight is enabled when deciding whether to inspect an OpenTelemetry span for connecting to splotlight ([#3709](https://github.com/getsentry/sentry-java/pull/3709))
4345

46+
### Behavioural Changes
47+
48+
- (Android) Replace thread id with kernel thread id in span data ([#3706](https://github.com/getsentry/sentry-java/pull/3706))
49+
4450
### Dependencies
4551

4652
- Bump OpenTelemetry to 1.41.0, OpenTelemetry Java Agent to 2.7.0 and Semantic Conventions to 1.25.0 ([#3668](https://github.com/getsentry/sentry-java/pull/3668))

sentry-android-core/api/sentry-android-core.api

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,10 +399,10 @@ public final class io/sentry/android/core/ViewHierarchyEventProcessor : io/sentr
399399
public fun process (Lio/sentry/SentryEvent;Lio/sentry/Hint;)Lio/sentry/SentryEvent;
400400
public fun process (Lio/sentry/protocol/SentryTransaction;Lio/sentry/Hint;)Lio/sentry/protocol/SentryTransaction;
401401
public static fun snapshotViewHierarchy (Landroid/app/Activity;Lio/sentry/ILogger;)Lio/sentry/protocol/ViewHierarchy;
402-
public static fun snapshotViewHierarchy (Landroid/app/Activity;Ljava/util/List;Lio/sentry/util/thread/IMainThreadChecker;Lio/sentry/ILogger;)Lio/sentry/protocol/ViewHierarchy;
402+
public static fun snapshotViewHierarchy (Landroid/app/Activity;Ljava/util/List;Lio/sentry/util/thread/IThreadChecker;Lio/sentry/ILogger;)Lio/sentry/protocol/ViewHierarchy;
403403
public static fun snapshotViewHierarchy (Landroid/view/View;)Lio/sentry/protocol/ViewHierarchy;
404404
public static fun snapshotViewHierarchy (Landroid/view/View;Ljava/util/List;)Lio/sentry/protocol/ViewHierarchy;
405-
public static fun snapshotViewHierarchyAsData (Landroid/app/Activity;Lio/sentry/util/thread/IMainThreadChecker;Lio/sentry/ISerializer;Lio/sentry/ILogger;)[B
405+
public static fun snapshotViewHierarchyAsData (Landroid/app/Activity;Lio/sentry/util/thread/IThreadChecker;Lio/sentry/ISerializer;Lio/sentry/ILogger;)[B
406406
}
407407

408408
public final class io/sentry/android/core/cache/AndroidEnvelopeCache : io/sentry/cache/EnvelopeCache {

sentry-android-core/src/main/java/io/sentry/android/core/ActivityBreadcrumbsIntegration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public final class ActivityBreadcrumbsIntegration
2929
private boolean enabled;
3030
private final @NotNull AutoClosableReentrantLock lock = new AutoClosableReentrantLock();
3131

32+
// TODO check if locking is even required at all for lifecycle methods
3233
public ActivityBreadcrumbsIntegration(final @NotNull Application application) {
3334
this.application = Objects.requireNonNull(application, "Application is required");
3435
}

sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import io.sentry.ISentryLifecycleToken;
77
import io.sentry.MeasurementUnit;
88
import io.sentry.SentryLevel;
9-
import io.sentry.android.core.internal.util.AndroidMainThreadChecker;
9+
import io.sentry.android.core.internal.util.AndroidThreadChecker;
1010
import io.sentry.protocol.MeasurementValue;
1111
import io.sentry.protocol.SentryId;
1212
import io.sentry.util.AutoClosableReentrantLock;
@@ -224,7 +224,7 @@ public void stop() {
224224

225225
private void runSafelyOnUiThread(final Runnable runnable, final String tag) {
226226
try {
227-
if (AndroidMainThreadChecker.getInstance().isMainThread()) {
227+
if (AndroidThreadChecker.getInstance().isMainThread()) {
228228
runnable.run();
229229
} else {
230230
handler.post(

sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -478,17 +478,13 @@ public void onActivityPaused(final @NotNull Activity activity) {
478478

479479
@Override
480480
public void onActivityStopped(final @NotNull Activity activity) {
481-
try (final @NotNull ISentryLifecycleToken ignored = lock.acquire()) {
482-
// no-op
483-
}
481+
// no-op (acquire lock if this no longer is no-op)
484482
}
485483

486484
@Override
487485
public void onActivitySaveInstanceState(
488486
final @NotNull Activity activity, final @NotNull Bundle outState) {
489-
try (final @NotNull ISentryLifecycleToken ignored = lock.acquire()) {
490-
// no-op
491-
}
487+
// no-op (acquire lock if this no longer is no-op)
492488
}
493489

494490
@Override

sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import io.sentry.android.core.internal.gestures.AndroidViewGestureTargetLocator;
2121
import io.sentry.android.core.internal.modules.AssetsModulesLoader;
2222
import io.sentry.android.core.internal.util.AndroidConnectionStatusProvider;
23-
import io.sentry.android.core.internal.util.AndroidMainThreadChecker;
23+
import io.sentry.android.core.internal.util.AndroidThreadChecker;
2424
import io.sentry.android.core.internal.util.SentryFrameMetricsCollector;
2525
import io.sentry.android.core.performance.AppStartMetrics;
2626
import io.sentry.android.fragment.FragmentLifecycleIntegration;
@@ -212,7 +212,7 @@ static void initializeIntegrationsAndProcessors(
212212
options.setViewHierarchyExporters(viewHierarchyExporters);
213213
}
214214

215-
options.setMainThreadChecker(AndroidMainThreadChecker.getInstance());
215+
options.setThreadChecker(AndroidThreadChecker.getInstance());
216216
if (options.getPerformanceCollectors().isEmpty()) {
217217
options.addPerformanceCollector(new AndroidMemoryCollector());
218218
options.addPerformanceCollector(

sentry-android-core/src/main/java/io/sentry/android/core/AppLifecycleIntegration.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import io.sentry.Integration;
88
import io.sentry.SentryLevel;
99
import io.sentry.SentryOptions;
10-
import io.sentry.android.core.internal.util.AndroidMainThreadChecker;
10+
import io.sentry.android.core.internal.util.AndroidThreadChecker;
1111
import io.sentry.util.Objects;
1212
import java.io.Closeable;
1313
import java.io.IOException;
@@ -58,7 +58,7 @@ public void register(final @NotNull IScopes scopes, final @NotNull SentryOptions
5858
try {
5959
Class.forName("androidx.lifecycle.DefaultLifecycleObserver");
6060
Class.forName("androidx.lifecycle.ProcessLifecycleOwner");
61-
if (AndroidMainThreadChecker.getInstance().isMainThread()) {
61+
if (AndroidThreadChecker.getInstance().isMainThread()) {
6262
addObserver(scopes);
6363
} else {
6464
// some versions of the androidx lifecycle-process require this to be executed on the main
@@ -127,7 +127,7 @@ public void close() throws IOException {
127127
if (watcher == null) {
128128
return;
129129
}
130-
if (AndroidMainThreadChecker.getInstance().isMainThread()) {
130+
if (AndroidThreadChecker.getInstance().isMainThread()) {
131131
removeObserver();
132132
} else {
133133
// some versions of the androidx lifecycle-process require this to be executed on the main

sentry-android-core/src/main/java/io/sentry/android/core/DefaultAndroidEventProcessor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import io.sentry.SentryEvent;
1212
import io.sentry.SentryLevel;
1313
import io.sentry.SentryReplayEvent;
14-
import io.sentry.android.core.internal.util.AndroidMainThreadChecker;
14+
import io.sentry.android.core.internal.util.AndroidThreadChecker;
1515
import io.sentry.android.core.performance.AppStartMetrics;
1616
import io.sentry.android.core.performance.TimeSpan;
1717
import io.sentry.protocol.App;
@@ -214,7 +214,7 @@ private void setThreads(final @NotNull SentryEvent event, final @NotNull Hint hi
214214
final boolean isHybridSDK = HintUtils.isFromHybridSdk(hint);
215215

216216
for (final SentryThread thread : event.getThreads()) {
217-
final boolean isMainThread = AndroidMainThreadChecker.getInstance().isMainThread(thread);
217+
final boolean isMainThread = AndroidThreadChecker.getInstance().isMainThread(thread);
218218

219219
// TODO: Fix https://github.com/getsentry/team-mobile/issues/47
220220
if (thread.isCurrent() == null) {

sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ public static SentryId captureEnvelope(
196196
deleteCurrentSessionFile(
197197
options,
198198
// should be sync if going to crash or already not a main thread
199-
!maybeStartNewSession || !scopes.getOptions().getMainThreadChecker().isMainThread());
199+
!maybeStartNewSession || !scopes.getOptions().getThreadChecker().isMainThread());
200200
if (maybeStartNewSession) {
201201
scopes.startSession();
202202
}

sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import static io.sentry.android.core.ActivityLifecycleIntegration.APP_START_WARM;
55
import static io.sentry.android.core.ActivityLifecycleIntegration.UI_LOAD_OP;
66

7-
import android.os.Looper;
87
import io.sentry.EventProcessor;
98
import io.sentry.Hint;
109
import io.sentry.ISentryLifecycleToken;
@@ -14,6 +13,7 @@
1413
import io.sentry.SpanDataConvention;
1514
import io.sentry.SpanId;
1615
import io.sentry.SpanStatus;
16+
import io.sentry.android.core.internal.util.AndroidThreadChecker;
1717
import io.sentry.android.core.performance.ActivityLifecycleTimeSpan;
1818
import io.sentry.android.core.performance.AppStartMetrics;
1919
import io.sentry.android.core.performance.TimeSpan;
@@ -321,7 +321,7 @@ private static SentrySpan timeSpanToSentrySpan(
321321
final @NotNull String operation) {
322322

323323
final Map<String, Object> defaultSpanData = new HashMap<>(2);
324-
defaultSpanData.put(SpanDataConvention.THREAD_ID, Looper.getMainLooper().getThread().getId());
324+
defaultSpanData.put(SpanDataConvention.THREAD_ID, AndroidThreadChecker.mainThreadSystemId);
325325
defaultSpanData.put(SpanDataConvention.THREAD_NAME, "main");
326326

327327
defaultSpanData.put(SpanDataConvention.CONTRIBUTES_TTID, true);

sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public ScreenshotEventProcessor(
8989

9090
final byte[] screenshot =
9191
takeScreenshot(
92-
activity, options.getMainThreadChecker(), options.getLogger(), buildInfoProvider);
92+
activity, options.getThreadChecker(), options.getLogger(), buildInfoProvider);
9393
if (screenshot == null) {
9494
return event;
9595
}

sentry-android-core/src/main/java/io/sentry/android/core/ViewHierarchyEventProcessor.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import io.sentry.SentryLevel;
1616
import io.sentry.android.core.internal.gestures.ViewUtils;
1717
import io.sentry.android.core.internal.util.AndroidCurrentDateProvider;
18-
import io.sentry.android.core.internal.util.AndroidMainThreadChecker;
18+
import io.sentry.android.core.internal.util.AndroidThreadChecker;
1919
import io.sentry.android.core.internal.util.ClassUtil;
2020
import io.sentry.android.core.internal.util.Debouncer;
2121
import io.sentry.internal.viewhierarchy.ViewHierarchyExporter;
@@ -25,7 +25,7 @@
2525
import io.sentry.util.HintUtils;
2626
import io.sentry.util.JsonSerializationUtils;
2727
import io.sentry.util.Objects;
28-
import io.sentry.util.thread.IMainThreadChecker;
28+
import io.sentry.util.thread.IThreadChecker;
2929
import java.util.ArrayList;
3030
import java.util.List;
3131
import java.util.concurrent.CountDownLatch;
@@ -101,7 +101,7 @@ public ViewHierarchyEventProcessor(final @NotNull SentryAndroidOptions options)
101101
snapshotViewHierarchy(
102102
activity,
103103
options.getViewHierarchyExporters(),
104-
options.getMainThreadChecker(),
104+
options.getThreadChecker(),
105105
options.getLogger());
106106

107107
if (viewHierarchy != null) {
@@ -113,13 +113,13 @@ public ViewHierarchyEventProcessor(final @NotNull SentryAndroidOptions options)
113113

114114
public static byte[] snapshotViewHierarchyAsData(
115115
@Nullable Activity activity,
116-
@NotNull IMainThreadChecker mainThreadChecker,
116+
@NotNull IThreadChecker threadChecker,
117117
@NotNull ISerializer serializer,
118118
@NotNull ILogger logger) {
119119

120120
@Nullable
121121
ViewHierarchy viewHierarchy =
122-
snapshotViewHierarchy(activity, new ArrayList<>(0), mainThreadChecker, logger);
122+
snapshotViewHierarchy(activity, new ArrayList<>(0), threadChecker, logger);
123123

124124
if (viewHierarchy == null) {
125125
logger.log(SentryLevel.ERROR, "Could not get ViewHierarchy.");
@@ -144,14 +144,14 @@ public static byte[] snapshotViewHierarchyAsData(
144144
public static ViewHierarchy snapshotViewHierarchy(
145145
final @Nullable Activity activity, final @NotNull ILogger logger) {
146146
return snapshotViewHierarchy(
147-
activity, new ArrayList<>(0), AndroidMainThreadChecker.getInstance(), logger);
147+
activity, new ArrayList<>(0), AndroidThreadChecker.getInstance(), logger);
148148
}
149149

150150
@Nullable
151151
public static ViewHierarchy snapshotViewHierarchy(
152152
final @Nullable Activity activity,
153153
final @NotNull List<ViewHierarchyExporter> exporters,
154-
final @NotNull IMainThreadChecker mainThreadChecker,
154+
final @NotNull IThreadChecker threadChecker,
155155
final @NotNull ILogger logger) {
156156

157157
if (activity == null) {
@@ -172,7 +172,7 @@ public static ViewHierarchy snapshotViewHierarchy(
172172
}
173173

174174
try {
175-
if (mainThreadChecker.isMainThread()) {
175+
if (threadChecker.isMainThread()) {
176176
return snapshotViewHierarchy(decorView, exporters);
177177
} else {
178178
final CountDownLatch latch = new CountDownLatch(1);
Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
package io.sentry.android.core.internal.util;
22

3+
import android.os.Handler;
34
import android.os.Looper;
5+
import android.os.Process;
46
import io.sentry.protocol.SentryThread;
5-
import io.sentry.util.thread.IMainThreadChecker;
7+
import io.sentry.util.thread.IThreadChecker;
68
import org.jetbrains.annotations.ApiStatus;
79
import org.jetbrains.annotations.NotNull;
810

911
/** Class that checks if a given thread is the Android Main/UI thread */
1012
@ApiStatus.Internal
11-
public final class AndroidMainThreadChecker implements IMainThreadChecker {
13+
public final class AndroidThreadChecker implements IThreadChecker {
1214

13-
private static final AndroidMainThreadChecker instance = new AndroidMainThreadChecker();
15+
private static final AndroidThreadChecker instance = new AndroidThreadChecker();
16+
public static volatile long mainThreadSystemId = Process.myTid();
1417

15-
public static AndroidMainThreadChecker getInstance() {
18+
public static AndroidThreadChecker getInstance() {
1619
return instance;
1720
}
1821

19-
private AndroidMainThreadChecker() {}
22+
private AndroidThreadChecker() {
23+
// The first time this class is loaded, we make sure to set the correct mainThreadId
24+
new Handler(Looper.getMainLooper()).post(() -> mainThreadSystemId = Process.myTid());
25+
}
2026

2127
@Override
2228
public boolean isMainThread(final long threadId) {
@@ -38,4 +44,9 @@ public boolean isMainThread(final @NotNull SentryThread sentryThread) {
3844
final Long threadId = sentryThread.getId();
3945
return threadId != null && isMainThread(threadId);
4046
}
47+
48+
@Override
49+
public long currentThreadSystemId() {
50+
return Process.myTid();
51+
}
4152
}

sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ScreenshotUtils.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import io.sentry.ILogger;
1515
import io.sentry.SentryLevel;
1616
import io.sentry.android.core.BuildInfoProvider;
17-
import io.sentry.util.thread.IMainThreadChecker;
17+
import io.sentry.util.thread.IThreadChecker;
1818
import java.io.ByteArrayOutputStream;
1919
import java.util.concurrent.CountDownLatch;
2020
import java.util.concurrent.TimeUnit;
@@ -31,14 +31,13 @@ public class ScreenshotUtils {
3131
final @NotNull Activity activity,
3232
final @NotNull ILogger logger,
3333
final @NotNull BuildInfoProvider buildInfoProvider) {
34-
return takeScreenshot(
35-
activity, AndroidMainThreadChecker.getInstance(), logger, buildInfoProvider);
34+
return takeScreenshot(activity, AndroidThreadChecker.getInstance(), logger, buildInfoProvider);
3635
}
3736

3837
@SuppressLint("NewApi")
3938
public static @Nullable byte[] takeScreenshot(
4039
final @NotNull Activity activity,
41-
final @NotNull IMainThreadChecker mainThreadChecker,
40+
final @NotNull IThreadChecker threadChecker,
4241
final @NotNull ILogger logger,
4342
final @NotNull BuildInfoProvider buildInfoProvider) {
4443
// We are keeping BuildInfoProvider param for compatibility, as it's being used by
@@ -113,7 +112,7 @@ public class ScreenshotUtils {
113112
}
114113
} else {
115114
final Canvas canvas = new Canvas(bitmap);
116-
if (mainThreadChecker.isMainThread()) {
115+
if (threadChecker.isMainThread()) {
117116
view.draw(canvas);
118117
latch.countDown();
119118
} else {

sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import io.sentry.SentryOptions
1313
import io.sentry.android.core.cache.AndroidEnvelopeCache
1414
import io.sentry.android.core.internal.gestures.AndroidViewGestureTargetLocator
1515
import io.sentry.android.core.internal.modules.AssetsModulesLoader
16-
import io.sentry.android.core.internal.util.AndroidMainThreadChecker
16+
import io.sentry.android.core.internal.util.AndroidThreadChecker
1717
import io.sentry.android.fragment.FragmentLifecycleIntegration
1818
import io.sentry.android.replay.ReplayIntegration
1919
import io.sentry.android.timber.SentryTimberIntegration
@@ -582,10 +582,10 @@ class AndroidOptionsInitializerTest {
582582
}
583583

584584
@Test
585-
fun `AndroidMainThreadChecker is set to options`() {
585+
fun `AndroidThreadChecker is set to options`() {
586586
fixture.initSut()
587587

588-
assertTrue { fixture.sentryOptions.mainThreadChecker is AndroidMainThreadChecker }
588+
assertTrue { fixture.sentryOptions.threadChecker is AndroidThreadChecker }
589589
}
590590

591591
@Test

sentry-android-core/src/test/java/io/sentry/android/core/ScreenshotEventProcessorTest.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import io.sentry.SentryEvent
1111
import io.sentry.SentryIntegrationPackageStorage
1212
import io.sentry.TypeCheckHint.ANDROID_ACTIVITY
1313
import io.sentry.protocol.SentryException
14-
import io.sentry.util.thread.IMainThreadChecker
14+
import io.sentry.util.thread.IThreadChecker
1515
import org.junit.runner.RunWith
1616
import org.mockito.kotlin.any
1717
import org.mockito.kotlin.mock
@@ -35,7 +35,7 @@ class ScreenshotEventProcessorTest {
3535
val window = mock<Window>()
3636
val view = mock<View>()
3737
val rootView = mock<View>()
38-
val mainThreadChecker = mock<IMainThreadChecker>()
38+
val threadChecker = mock<IThreadChecker>()
3939
val options = SentryAndroidOptions().apply {
4040
dsn = "https://[email protected]/proj"
4141
}
@@ -52,12 +52,12 @@ class ScreenshotEventProcessorTest {
5252
it.getArgument<Runnable>(0).run()
5353
}
5454

55-
whenever(mainThreadChecker.isMainThread).thenReturn(true)
55+
whenever(threadChecker.isMainThread).thenReturn(true)
5656
}
5757

5858
fun getSut(attachScreenshot: Boolean = false): ScreenshotEventProcessor {
5959
options.isAttachScreenshot = attachScreenshot
60-
options.mainThreadChecker = mainThreadChecker
60+
options.threadChecker = threadChecker
6161

6262
return ScreenshotEventProcessor(options, buildInfo)
6363
}
@@ -172,7 +172,7 @@ class ScreenshotEventProcessorTest {
172172
@Test
173173
fun `when screenshot event processor is called from background thread it executes on main thread`() {
174174
val sut = fixture.getSut(true)
175-
whenever(fixture.mainThreadChecker.isMainThread).thenReturn(false)
175+
whenever(fixture.threadChecker.isMainThread).thenReturn(false)
176176

177177
CurrentActivityHolder.getInstance().setActivity(fixture.activity)
178178

0 commit comments

Comments
 (0)