diff --git a/CHANGELOG.md b/CHANGELOG.md index 16b1bb5324..3f4883b579 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,10 @@ } ``` +### Fixes + +- Avoid StrictMode warnings ([#4724](https://github.com/getsentry/sentry-java/pull/4724)) + ### Improvements - Remove internal API status from get/setDistinctId ([#4708](https://github.com/getsentry/sentry-java/pull/4708)) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroid.java b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroid.java index d183d4c45b..2c06263e15 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroid.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroid.java @@ -4,6 +4,7 @@ import android.app.Application; import android.content.Context; import android.os.Process; +import android.os.StrictMode; import android.os.SystemClock; import io.sentry.ILogger; import io.sentry.IScopes; @@ -93,6 +94,10 @@ public static void init( @NotNull final Context context, @NotNull ILogger logger, @NotNull Sentry.OptionsConfiguration configuration) { + final @NotNull StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy(); + final @NotNull StrictMode.VmPolicy oldVmPolicy = StrictMode.getVmPolicy(); + StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.LAX); + StrictMode.setVmPolicy(StrictMode.VmPolicy.LAX); try (final @NotNull ISentryLifecycleToken ignored = staticLock.acquire()) { Sentry.init( OptionsContainer.create(SentryAndroidOptions.class), @@ -209,6 +214,9 @@ public static void init( logger.log(SentryLevel.FATAL, "Fatal error during SentryAndroid.init(...)", e); throw new RuntimeException("Failed to initialize Sentry's SDK", e); + } finally { + StrictMode.setThreadPolicy(oldPolicy); + StrictMode.setVmPolicy(oldVmPolicy); } } diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/cache/AndroidEnvelopeCache.java b/sentry-android-core/src/main/java/io/sentry/android/core/cache/AndroidEnvelopeCache.java index 2829abc50c..af57727a8d 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/cache/AndroidEnvelopeCache.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/cache/AndroidEnvelopeCache.java @@ -19,6 +19,7 @@ import io.sentry.util.HintUtils; import io.sentry.util.Objects; import java.io.File; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStream; import org.jetbrains.annotations.ApiStatus; @@ -157,18 +158,18 @@ public static boolean hasStartupCrashMarker(final @NotNull SentryOptions options final File lastAnrMarker = new File(cacheDirPath, LAST_ANR_REPORT); try { - if (lastAnrMarker.exists() && lastAnrMarker.canRead()) { - final String content = FileUtils.readText(lastAnrMarker); - // we wrapped into try-catch already - //noinspection ConstantConditions - return content.equals("null") ? null : Long.parseLong(content.trim()); - } else { + final String content = FileUtils.readText(lastAnrMarker); + // we wrapped into try-catch already + //noinspection ConstantConditions + return content.equals("null") ? null : Long.parseLong(content.trim()); + } catch (Throwable e) { + if (e instanceof FileNotFoundException) { options .getLogger() .log(DEBUG, "Last ANR marker does not exist. %s.", lastAnrMarker.getAbsolutePath()); + } else { + options.getLogger().log(ERROR, "Error reading last ANR marker", e); } - } catch (Throwable e) { - options.getLogger().log(ERROR, "Error reading last ANR marker", e); } return null; } diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/CpuInfoUtils.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/CpuInfoUtils.java index 019db99fc7..c289a9c06a 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/CpuInfoUtils.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/CpuInfoUtils.java @@ -51,8 +51,6 @@ private CpuInfoUtils() {} if (!cpuDir.getName().matches("cpu[0-9]+")) continue; File cpuMaxFreqFile = new File(cpuDir, CPUINFO_MAX_FREQ_PATH); - if (!cpuMaxFreqFile.exists() || !cpuMaxFreqFile.canRead()) continue; - long khz; try { String content = FileUtils.readText(cpuMaxFreqFile); diff --git a/sentry-android-integration-tests/sentry-uitest-android/src/androidTest/java/io/sentry/uitest/android/SdkInitTests.kt b/sentry-android-integration-tests/sentry-uitest-android/src/androidTest/java/io/sentry/uitest/android/SdkInitTests.kt index 07c9cd391a..a21402c456 100644 --- a/sentry-android-integration-tests/sentry-uitest-android/src/androidTest/java/io/sentry/uitest/android/SdkInitTests.kt +++ b/sentry-android-integration-tests/sentry-uitest-android/src/androidTest/java/io/sentry/uitest/android/SdkInitTests.kt @@ -1,5 +1,6 @@ package io.sentry.uitest.android +import android.os.StrictMode import androidx.lifecycle.Lifecycle import androidx.test.core.app.launchActivity import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -269,6 +270,13 @@ class SdkInitTests : BaseUiTest() { assertDefaultIntegrations() } + @Test + fun initNotThrowStrictMode() { + StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder().detectAll().penaltyDeath().build()) + StrictMode.setVmPolicy(StrictMode.VmPolicy.Builder().detectAll().penaltyDeath().build()) + initSentry() + } + private fun assertDefaultIntegrations() { val integrations = mutableListOf( diff --git a/sentry/src/main/java/io/sentry/DirectoryProcessor.java b/sentry/src/main/java/io/sentry/DirectoryProcessor.java index a6bb258f30..1bc277b18c 100644 --- a/sentry/src/main/java/io/sentry/DirectoryProcessor.java +++ b/sentry/src/main/java/io/sentry/DirectoryProcessor.java @@ -40,34 +40,22 @@ public void processDirectory(final @NotNull File directory) { try { logger.log(SentryLevel.DEBUG, "Processing dir. %s", directory.getAbsolutePath()); - if (!directory.exists()) { + final File[] filteredListFiles = directory.listFiles((d, name) -> isRelevantFileName(name)); + if (filteredListFiles == null) { logger.log( - SentryLevel.WARNING, - "Directory '%s' doesn't exist. No cached events to send.", + SentryLevel.ERROR, + "Cache dir %s is null or is not a directory.", directory.getAbsolutePath()); return; } - if (!directory.isDirectory()) { - logger.log( - SentryLevel.ERROR, "Cache dir %s is not a directory.", directory.getAbsolutePath()); - return; - } - - final File[] listFiles = directory.listFiles(); - if (listFiles == null) { - logger.log(SentryLevel.ERROR, "Cache dir %s is null.", directory.getAbsolutePath()); - return; - } - - final File[] filteredListFiles = directory.listFiles((d, name) -> isRelevantFileName(name)); logger.log( SentryLevel.DEBUG, "Processing %d items from cache dir %s", - filteredListFiles != null ? filteredListFiles.length : 0, + filteredListFiles.length, directory.getAbsolutePath()); - for (File file : listFiles) { + for (File file : filteredListFiles) { // it ignores .sentry-native database folder and new ones that might come up if (!file.isFile()) { logger.log(SentryLevel.DEBUG, "File %s is not a File.", file.getAbsolutePath()); diff --git a/sentry/src/main/java/io/sentry/cache/EnvelopeCache.java b/sentry/src/main/java/io/sentry/cache/EnvelopeCache.java index d2a32d44cd..893bef4ab9 100644 --- a/sentry/src/main/java/io/sentry/cache/EnvelopeCache.java +++ b/sentry/src/main/java/io/sentry/cache/EnvelopeCache.java @@ -336,18 +336,17 @@ public void discard(final @NotNull SentryEnvelope envelope) { Objects.requireNonNull(envelope, "Envelope is required."); final File envelopeFile = getEnvelopeFile(envelope); - if (envelopeFile.exists()) { + if (envelopeFile.delete()) { options .getLogger() .log(DEBUG, "Discarding envelope from cache: %s", envelopeFile.getAbsolutePath()); - - if (!envelopeFile.delete()) { - options - .getLogger() - .log(ERROR, "Failed to delete envelope: %s", envelopeFile.getAbsolutePath()); - } } else { - options.getLogger().log(DEBUG, "Envelope was not cached: %s", envelopeFile.getAbsolutePath()); + options + .getLogger() + .log( + DEBUG, + "Envelope was not cached or could not be deleted: %s", + envelopeFile.getAbsolutePath()); } } diff --git a/sentry/src/test/java/io/sentry/EnvelopeSenderTest.kt b/sentry/src/test/java/io/sentry/EnvelopeSenderTest.kt index 4ddc5561af..dce7c3d586 100644 --- a/sentry/src/test/java/io/sentry/EnvelopeSenderTest.kt +++ b/sentry/src/test/java/io/sentry/EnvelopeSenderTest.kt @@ -61,8 +61,8 @@ class EnvelopeSenderTest { val sut = fixture.getSut() sut.processDirectory(File("i don't exist")) verify(fixture.logger)!!.log( - eq(SentryLevel.WARNING), - eq("Directory '%s' doesn't exist. No cached events to send."), + eq(SentryLevel.ERROR), + eq("Cache dir %s is null or is not a directory."), any(), ) verifyNoMoreInteractions(fixture.scopes) @@ -79,14 +79,14 @@ class EnvelopeSenderTest { sut.processDirectory(testFile) verify(fixture.logger)!!.log( eq(SentryLevel.ERROR), - eq("Cache dir %s is not a directory."), + eq("Cache dir %s is null or is not a directory."), any(), ) verifyNoMoreInteractions(fixture.scopes) } @Test - fun `when directory has non event files, processDirectory logs that`() { + fun `when directory has non event files, processDirectory skips them`() { val sut = fixture.getSut() val testFile = File( @@ -96,7 +96,8 @@ class EnvelopeSenderTest { testFile.deleteOnExit() verify(fixture.logger)!!.log( eq(SentryLevel.DEBUG), - eq("File '%s' doesn't match extension expected."), + eq("Processing %d items from cache dir %s"), + eq(0), any(), ) verify(fixture.scopes, never())!!.captureEnvelope(any(), anyOrNull())