diff --git a/CHANGELOG.md b/CHANGELOG.md index 75132627cc..b757475e07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Breaking Changes +- The Android minSdk level for all Android modules is now 21 ([#3852](https://github.com/getsentry/sentry-java/pull/3852)) - The minSdk level for sentry-android-ndk changed from 19 to 21 ([#3851](https://github.com/getsentry/sentry-java/pull/3851)) ### Features diff --git a/README.md b/README.md index 58002699ce..6e60edda9d 100644 --- a/README.md +++ b/README.md @@ -18,24 +18,24 @@ Sentry SDK for Java and Android | Packages | Maven Central | Minimum Android API Version | |-----------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ------- | -| sentry-android | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android) | 19 | -| sentry-android-core | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-core/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-core) | 19 | +| sentry-android | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android) | 21 | +| sentry-android-core | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-core/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-core) | 21 | | sentry-android-ndk | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-ndk/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-ndk) | 21 | -| sentry-android-timber | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-timber/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-timber) | 19 | -| sentry-android-fragment | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-fragment/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-fragment) | 19 | -| sentry-android-navigation | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-navigation/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-navigation) | 19 | -| sentry-android-sqlite | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-sqlite/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-sqlite) | 19 | +| sentry-android-timber | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-timber/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-timber) | 21 | +| sentry-android-fragment | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-fragment/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-fragment) | 21 | +| sentry-android-navigation | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-navigation/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-navigation) | 21 | +| sentry-android-sqlite | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-sqlite/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-sqlite) | 21 | | sentry-android-replay | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-replay/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-android-replay) | 26 | | sentry-compose-android | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-compose-android/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-compose-android) | 21 | | sentry-compose-desktop | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-compose-desktop/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-compose-desktop) | | sentry-compose | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-compose/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-compose) | | sentry-apache-http-client-5 | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-apache-http-client-5/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-apache-http-client-5) | -| sentry | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry) | 19 | +| sentry | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry) | 21 | | sentry-jul | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-jul/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-jul) | | sentry-jdbc | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-jdbc/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-jdbc) | -| sentry-apollo | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-apollo/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-apollo) | 19 | -| sentry-apollo-3 | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-apollo-3/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-apollo-3) | 19 | -| sentry-kotlin-extensions | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-kotlin-extensions/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-kotlin-extensions) | 19 | +| sentry-apollo | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-apollo/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-apollo) | 21 | +| sentry-apollo-3 | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-apollo-3/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-apollo-3) | 21 | +| sentry-kotlin-extensions | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-kotlin-extensions/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-kotlin-extensions) | 21 | | sentry-servlet | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-servlet/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-servlet) | | | sentry-servlet-jakarta | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-servlet-jakarta/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-servlet-jakarta) | | | sentry-spring-boot | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-spring-boot/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-spring-boot) | diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index ef82b9ca67..2019a16f23 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -33,11 +33,7 @@ object Config { object Android { private val sdkVersion = 34 - val minSdkVersion = 19 - val minSdkVersionOkHttp = 21 - val minSdkVersionReplay = 19 - val minSdkVersionNdk = 21 - val minSdkVersionCompose = 21 + val minSdkVersion = 21 val targetSdkVersion = sdkVersion val compileSdkVersion = sdkVersion diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index 35c8408af2..8734d5736b 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -37,7 +37,7 @@ public final class io/sentry/android/core/ActivityLifecycleIntegration : android } public final class io/sentry/android/core/AndroidCpuCollector : io/sentry/IPerformanceSnapshotCollector { - public fun (Lio/sentry/ILogger;Lio/sentry/android/core/BuildInfoProvider;)V + public fun (Lio/sentry/ILogger;)V public fun collect (Lio/sentry/PerformanceCollectionData;)V public fun setup ()V } @@ -64,7 +64,7 @@ public class io/sentry/android/core/AndroidMemoryCollector : io/sentry/IPerforma public class io/sentry/android/core/AndroidProfiler { protected final field lock Lio/sentry/util/AutoClosableReentrantLock; - public fun (Ljava/lang/String;ILio/sentry/android/core/internal/util/SentryFrameMetricsCollector;Lio/sentry/ISentryExecutorService;Lio/sentry/ILogger;Lio/sentry/android/core/BuildInfoProvider;)V + public fun (Ljava/lang/String;ILio/sentry/android/core/internal/util/SentryFrameMetricsCollector;Lio/sentry/ISentryExecutorService;Lio/sentry/ILogger;)V public fun close ()V public fun endAndCollect (ZLjava/util/List;)Lio/sentry/android/core/AndroidProfiler$ProfileEndData; public fun start ()Lio/sentry/android/core/AndroidProfiler$ProfileStartData; diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidCpuCollector.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidCpuCollector.java index 8f54305e6f..ccd878761d 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidCpuCollector.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidCpuCollector.java @@ -1,7 +1,5 @@ package io.sentry.android.core; -import android.annotation.SuppressLint; -import android.os.Build; import android.os.SystemClock; import android.system.Os; import android.system.OsConstants; @@ -41,24 +39,15 @@ public final class AndroidCpuCollector implements IPerformanceSnapshotCollector private final @NotNull File selfStat = new File("/proc/self/stat"); private final @NotNull ILogger logger; - private final @NotNull BuildInfoProvider buildInfoProvider; private boolean isEnabled = false; private final @NotNull Pattern newLinePattern = Pattern.compile("[\n\t\r ]"); - public AndroidCpuCollector( - final @NotNull ILogger logger, final @NotNull BuildInfoProvider buildInfoProvider) { + public AndroidCpuCollector(final @NotNull ILogger logger) { this.logger = Objects.requireNonNull(logger, "Logger is required."); - this.buildInfoProvider = - Objects.requireNonNull(buildInfoProvider, "BuildInfoProvider is required."); } - @SuppressLint("NewApi") @Override public void setup() { - if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.LOLLIPOP) { - isEnabled = false; - return; - } isEnabled = true; clockSpeedHz = Os.sysconf(OsConstants._SC_CLK_TCK); numCores = Os.sysconf(OsConstants._SC_NPROCESSORS_CONF); @@ -66,10 +55,9 @@ public void setup() { lastCpuNanos = readTotalCpuNanos(); } - @SuppressLint("NewApi") @Override public void collect(final @NotNull PerformanceCollectionData performanceCollectionData) { - if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.LOLLIPOP || !isEnabled) { + if (!isEnabled) { return; } final long nowNanos = SystemClock.elapsedRealtimeNanos(); diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java index 8562f6ad2d..62900c25b8 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java @@ -212,8 +212,7 @@ static void initializeIntegrationsAndProcessors( options.setThreadChecker(AndroidThreadChecker.getInstance()); if (options.getPerformanceCollectors().isEmpty()) { options.addPerformanceCollector(new AndroidMemoryCollector()); - options.addPerformanceCollector( - new AndroidCpuCollector(options.getLogger(), buildInfoProvider)); + options.addPerformanceCollector(new AndroidCpuCollector(options.getLogger())); if (options.isEnablePerformanceV2()) { options.addPerformanceCollector( diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidProfiler.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidProfiler.java index 379123c2c8..f10dbef109 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidProfiler.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidProfiler.java @@ -1,7 +1,6 @@ package io.sentry.android.core; import android.annotation.SuppressLint; -import android.os.Build; import android.os.Debug; import android.os.Process; import android.os.SystemClock; @@ -94,7 +93,6 @@ public ProfileEndData( private final @NotNull ArrayDeque frozenFrameRenderMeasurements = new ArrayDeque<>(); private final @NotNull Map measurementsMap = new HashMap<>(); - private final @NotNull BuildInfoProvider buildInfoProvider; private final @NotNull ISentryExecutorService executorService; private final @NotNull ILogger logger; private boolean isRunning = false; @@ -105,8 +103,7 @@ public AndroidProfiler( final int intervalUs, final @NotNull SentryFrameMetricsCollector frameMetricsCollector, final @NotNull ISentryExecutorService executorService, - final @NotNull ILogger logger, - final @NotNull BuildInfoProvider buildInfoProvider) { + final @NotNull ILogger logger) { this.traceFilesDir = new File(Objects.requireNonNull(tracesFilesDirPath, "TracesFilesDirPath is required")); this.intervalUs = intervalUs; @@ -114,8 +111,6 @@ public AndroidProfiler( this.executorService = Objects.requireNonNull(executorService, "ExecutorService is required."); this.frameMetricsCollector = Objects.requireNonNull(frameMetricsCollector, "SentryFrameMetricsCollector is required"); - this.buildInfoProvider = - Objects.requireNonNull(buildInfoProvider, "The BuildInfoProvider is required."); } @SuppressLint("NewApi") @@ -133,9 +128,6 @@ public AndroidProfiler( return null; } - // and SystemClock.elapsedRealtimeNanos() since Jelly Bean - if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.LOLLIPOP) return null; - // We create a file with a uuid name, so no need to check if it already exists traceFile = new File(traceFilesDir, UUID.randomUUID() + ".trace"); @@ -232,9 +224,6 @@ public void onFrameMetricCollected( return null; } - // and SystemClock.elapsedRealtimeNanos() since Jelly Bean - if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.LOLLIPOP) return null; - try { // If there is any problem with the file this method could throw, but the start is also // wrapped, so this should never happen (except for tests, where this is the only method @@ -304,12 +293,6 @@ public void close() { private void putPerformanceCollectionDataInMeasurements( final @Nullable List performanceCollectionData) { - // onTransactionStart() is only available since Lollipop - // and SystemClock.elapsedRealtimeNanos() since Jelly Bean - if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.LOLLIPOP) { - return; - } - // This difference is required, since the PerformanceCollectionData timestamps are expressed in // terms of System.currentTimeMillis() and measurements timestamps require the nanoseconds since // the beginning, expressed with SystemClock.elapsedRealtimeNanos() diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidTransactionProfiler.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidTransactionProfiler.java index a2d61e9921..3455ff8b8d 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidTransactionProfiler.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidTransactionProfiler.java @@ -121,8 +121,7 @@ private void init() { (int) SECONDS.toMicros(1) / profilingTracesHz, frameMetricsCollector, executorService, - logger, - buildInfoProvider); + logger); } @Override diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AnrV2EventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/AnrV2EventProcessor.java index 431e9dc4c0..d41789cd5b 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AnrV2EventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AnrV2EventProcessor.java @@ -641,7 +641,7 @@ private void setDevice(final @NotNull SentryBaseEvent event) { device.setFamily(ContextUtils.getFamily(options.getLogger())); device.setModel(Build.MODEL); device.setModelId(Build.ID); - device.setArchs(ContextUtils.getArchitectures(buildInfoProvider)); + device.setArchs(ContextUtils.getArchitectures()); final ActivityManager.MemoryInfo memInfo = ContextUtils.getMemInfo(context, options.getLogger()); diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ContextUtils.java b/sentry-android-core/src/main/java/io/sentry/android/core/ContextUtils.java index 89fe856631..7f3889e143 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ContextUtils.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ContextUtils.java @@ -293,16 +293,8 @@ public static boolean isForegroundImportance() { return Settings.Global.getString(context.getContentResolver(), "device_name"); } - @SuppressWarnings("deprecation") - @SuppressLint("NewApi") // we're wrapping into if-check with sdk version - static @NotNull String[] getArchitectures(final @NotNull BuildInfoProvider buildInfoProvider) { - final String[] supportedAbis; - if (buildInfoProvider.getSdkInfoVersion() >= Build.VERSION_CODES.LOLLIPOP) { - supportedAbis = Build.SUPPORTED_ABIS; - } else { - supportedAbis = new String[] {Build.CPU_ABI, Build.CPU_ABI2}; - } - return supportedAbis; + static @NotNull String[] getArchitectures() { + return Build.SUPPORTED_ABIS; } /** diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/DeviceInfoUtil.java b/sentry-android-core/src/main/java/io/sentry/android/core/DeviceInfoUtil.java index 9c7b748c03..25aad2d08c 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/DeviceInfoUtil.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/DeviceInfoUtil.java @@ -109,7 +109,7 @@ public Device collectDeviceInformation( device.setFamily(ContextUtils.getFamily(options.getLogger())); device.setModel(Build.MODEL); device.setModelId(Build.ID); - device.setArchs(ContextUtils.getArchitectures(buildInfoProvider)); + device.setArchs(ContextUtils.getArchitectures()); device.setOrientation(getOrientation()); if (isEmulator != null) { diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/NetworkBreadcrumbsIntegration.java b/sentry-android-core/src/main/java/io/sentry/android/core/NetworkBreadcrumbsIntegration.java index dc715119c1..c7b5bb21d0 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/NetworkBreadcrumbsIntegration.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/NetworkBreadcrumbsIntegration.java @@ -9,7 +9,6 @@ import android.net.NetworkCapabilities; import android.os.Build; import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; import io.sentry.Breadcrumb; import io.sentry.DateUtils; import io.sentry.Hint; @@ -52,7 +51,6 @@ public NetworkBreadcrumbsIntegration( this.logger = Objects.requireNonNull(logger, "ILogger is required"); } - @SuppressLint("NewApi") @Override public void register(final @NotNull IScopes scopes, final @NotNull SentryOptions options) { Objects.requireNonNull(scopes, "Scopes are required"); @@ -125,7 +123,7 @@ public void close() throws IOException { try (final @NotNull ISentryLifecycleToken ignored = lock.acquire()) { if (networkCallback != null) { AndroidConnectionStatusProvider.unregisterNetworkCallback( - context, logger, buildInfoProvider, networkCallback); + context, logger, networkCallback); logger.log(SentryLevel.DEBUG, "NetworkBreadcrumbsIntegration removed."); } networkCallback = null; @@ -136,8 +134,6 @@ public void close() throws IOException { } } - @SuppressLint("ObsoleteSdkInt") - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) static final class NetworkBreadcrumbsNetworkCallback extends ConnectivityManager.NetworkCallback { final @NotNull IScopes scopes; final @NotNull BuildInfoProvider buildInfoProvider; @@ -248,8 +244,7 @@ static class NetworkBreadcrumbConnectionDetail { final boolean isVpn; final @NotNull String type; - @SuppressLint({"NewApi", "ObsoleteSdkInt"}) - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + @SuppressLint({"NewApi"}) NetworkBreadcrumbConnectionDetail( final @NotNull NetworkCapabilities networkCapabilities, final @NotNull BuildInfoProvider buildInfoProvider, @@ -266,7 +261,7 @@ static class NetworkBreadcrumbConnectionDetail { this.signalStrength = strength > -100 ? strength : 0; this.isVpn = networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN); String connectionType = - AndroidConnectionStatusProvider.getConnectionType(networkCapabilities, buildInfoProvider); + AndroidConnectionStatusProvider.getConnectionType(networkCapabilities); this.type = connectionType != null ? connectionType : ""; this.timestampNanos = capabilityNanos; } diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SentryPerformanceProvider.java b/sentry-android-core/src/main/java/io/sentry/android/core/SentryPerformanceProvider.java index 7334b0bb9e..64a1ceda60 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/SentryPerformanceProvider.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/SentryPerformanceProvider.java @@ -8,7 +8,6 @@ import android.content.Context; import android.content.pm.ProviderInfo; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.Process; import android.os.SystemClock; @@ -112,11 +111,6 @@ private void launchAppStartProfiler(final @NotNull AppStartMetrics appStartMetri return; } - // Debug.startMethodTracingSampling() is only available since Lollipop - if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.LOLLIPOP) { - return; - } - final @NotNull File cacheDir = AndroidOptionsInitializer.getCacheDir(context); final @NotNull File configFile = new File(cacheDir, APP_START_PROFILING_CONFIG_FILE_NAME); diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidConnectionStatusProvider.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidConnectionStatusProvider.java index 0afd2bce97..76a10567d2 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidConnectionStatusProvider.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidConnectionStatusProvider.java @@ -63,13 +63,8 @@ public AndroidConnectionStatusProvider( return getConnectionType(context, logger, buildInfoProvider); } - @SuppressLint("NewApi") // we have an if-check for that down below @Override public boolean addConnectionStatusObserver(final @NotNull IConnectionStatusObserver observer) { - if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.LOLLIPOP) { - logger.log(SentryLevel.DEBUG, "addConnectionStatusObserver requires Android 5+."); - return false; - } final ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback() { @@ -103,7 +98,7 @@ public void removeConnectionStatusObserver(final @NotNull IConnectionStatusObser final @Nullable ConnectivityManager.NetworkCallback callback = registeredCallbacks.remove(observer); if (callback != null) { - unregisterNetworkCallback(context, logger, buildInfoProvider, callback); + unregisterNetworkCallback(context, logger, callback); } } @@ -253,13 +248,8 @@ public void removeConnectionStatusObserver(final @NotNull IConnectionStatusObser * @param networkCapabilities the NetworkCapabilities to check the transport type * @return the connection type wifi, ethernet, cellular or null */ - @SuppressLint("NewApi") public static @Nullable String getConnectionType( - final @NotNull NetworkCapabilities networkCapabilities, - final @NotNull BuildInfoProvider buildInfoProvider) { - if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.LOLLIPOP) { - return null; - } + final @NotNull NetworkCapabilities networkCapabilities) { // TODO: change the protocol to be a list of transports as a device may have the capability of // multiple @@ -317,11 +307,8 @@ public static boolean registerNetworkCallback( public static void unregisterNetworkCallback( final @NotNull Context context, final @NotNull ILogger logger, - final @NotNull BuildInfoProvider buildInfoProvider, final @NotNull ConnectivityManager.NetworkCallback networkCallback) { - if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.LOLLIPOP) { - return; - } + final ConnectivityManager connectivityManager = getConnectivityManager(context, logger); if (connectivityManager == null) { return; diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidConnectionStatusProviderTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidConnectionStatusProviderTest.kt index 359fee49cc..d10cdea35e 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidConnectionStatusProviderTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidConnectionStatusProviderTest.kt @@ -4,9 +4,6 @@ import android.content.Context import android.content.pm.PackageManager.PERMISSION_DENIED import android.net.ConnectivityManager import android.net.ConnectivityManager.NetworkCallback -import android.net.ConnectivityManager.TYPE_ETHERNET -import android.net.ConnectivityManager.TYPE_MOBILE -import android.net.ConnectivityManager.TYPE_WIFI import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkCapabilities.TRANSPORT_CELLULAR @@ -112,14 +109,6 @@ class AndroidConnectionStatusProviderTest { assertNull(AndroidConnectionStatusProvider.getConnectionType(mock(), mock(), buildInfo)) } - @Test - fun `When sdkInfoVersion is not min Marshmallow, return null for getConnectionType`() { - val buildInfo = mock() - whenever(buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT) - - assertNull(AndroidConnectionStatusProvider.getConnectionType(mock(), mock(), buildInfo)) - } - @Test fun `When there's no permission, return null for getConnectionType`() { whenever(contextMock.checkPermission(any(), any(), any())).thenReturn(PERMISSION_DENIED) @@ -146,14 +135,6 @@ class AndroidConnectionStatusProviderTest { assertEquals("wifi", AndroidConnectionStatusProvider.getConnectionType(contextMock, mock(), buildInfo)) } - @Test - fun `When network is TYPE_WIFI, return wifi`() { - whenever(buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT) - whenever(networkInfo.type).thenReturn(TYPE_WIFI) - - assertEquals("wifi", AndroidConnectionStatusProvider.getConnectionType(contextMock, mock(), buildInfo)) - } - @Test fun `When network capabilities has TRANSPORT_ETHERNET, return ethernet`() { whenever(networkCapabilities.hasTransport(eq(TRANSPORT_ETHERNET))).thenReturn(true) @@ -164,17 +145,6 @@ class AndroidConnectionStatusProviderTest { ) } - @Test - fun `When network is TYPE_ETHERNET, return ethernet`() { - whenever(buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT) - whenever(networkInfo.type).thenReturn(TYPE_ETHERNET) - - assertEquals( - "ethernet", - AndroidConnectionStatusProvider.getConnectionType(contextMock, mock(), buildInfo) - ) - } - @Test fun `When network capabilities has TRANSPORT_CELLULAR, return cellular`() { whenever(networkCapabilities.hasTransport(eq(TRANSPORT_CELLULAR))).thenReturn(true) @@ -185,17 +155,6 @@ class AndroidConnectionStatusProviderTest { ) } - @Test - fun `When network is TYPE_MOBILE, return cellular`() { - whenever(buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT) - whenever(networkInfo.type).thenReturn(TYPE_MOBILE) - - assertEquals( - "cellular", - AndroidConnectionStatusProvider.getConnectionType(contextMock, mock(), buildInfo) - ) - } - @Test fun `When there's no permission, do not register any NetworkCallback`() { val buildInfo = mock() @@ -231,20 +190,10 @@ class AndroidConnectionStatusProviderTest { verify(connectivityManager).registerDefaultNetworkCallback(any()) } - @Test - fun `When sdkInfoVersion is not min Lollipop, do not unregister any NetworkCallback`() { - val buildInfo = mock() - whenever(buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT) - whenever(contextMock.getSystemService(any())).thenReturn(connectivityManager) - AndroidConnectionStatusProvider.unregisterNetworkCallback(contextMock, mock(), buildInfo, mock()) - - verify(connectivityManager, never()).unregisterNetworkCallback(any()) - } - @Test fun `unregisterNetworkCallback calls connectivityManager unregisterDefaultNetworkCallback`() { whenever(contextMock.getSystemService(any())).thenReturn(connectivityManager) - AndroidConnectionStatusProvider.unregisterNetworkCallback(contextMock, mock(), buildInfo, mock()) + AndroidConnectionStatusProvider.unregisterNetworkCallback(contextMock, mock(), mock()) verify(connectivityManager).unregisterNetworkCallback(any()) } @@ -257,15 +206,6 @@ class AndroidConnectionStatusProviderTest { assertNull(AndroidConnectionStatusProvider.getConnectionType(contextMock, mock(), buildInfo)) } - @Test - fun `When connectivityManager getActiveNetworkInfo throws an exception, getConnectionType returns null`() { - whenever(buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT) - whenever(connectivityManager.activeNetworkInfo).thenThrow(SecurityException("Android OS Bug")) - - assertNull(AndroidConnectionStatusProvider.getConnectionType(contextMock, mock(), buildInfo)) - assertEquals(IConnectionStatusProvider.ConnectionStatus.UNKNOWN, connectionStatusProvider.connectionStatus) - } - @Test fun `When connectivityManager registerDefaultCallback throws an exception, false is returned`() { whenever(connectivityManager.registerDefaultNetworkCallback(any())).thenThrow( @@ -289,7 +229,7 @@ class AndroidConnectionStatusProviderTest { var failed = false try { - AndroidConnectionStatusProvider.unregisterNetworkCallback(contextMock, mock(), buildInfo, mock()) + AndroidConnectionStatusProvider.unregisterNetworkCallback(contextMock, mock(), mock()) } catch (t: Throwable) { failed = true } diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidCpuCollectorTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidCpuCollectorTest.kt index 45010255e8..7f54b2c353 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidCpuCollectorTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidCpuCollectorTest.kt @@ -1,11 +1,9 @@ package io.sentry.android.core -import android.os.Build import io.sentry.ILogger import io.sentry.PerformanceCollectionData import io.sentry.test.getCtor import org.mockito.kotlin.mock -import org.mockito.kotlin.whenever import kotlin.test.Test import kotlin.test.assertFailsWith import kotlin.test.assertNotEquals @@ -15,16 +13,11 @@ import kotlin.test.assertNull class AndroidCpuCollectorTest { private val className = "io.sentry.android.core.AndroidCpuCollector" - private val ctorTypes = arrayOf(ILogger::class.java, BuildInfoProvider::class.java) + private val ctorTypes = arrayOf>(ILogger::class.java) private val fixture = Fixture() private class Fixture { - private val mockBuildInfoProvider = mock() - init { - whenever(mockBuildInfoProvider.sdkInfoVersion).thenReturn(Build.VERSION_CODES.LOLLIPOP) - } - fun getSut(buildInfoProvider: BuildInfoProvider = mockBuildInfoProvider) = - AndroidCpuCollector(mock(), buildInfoProvider) + fun getSut() = AndroidCpuCollector(mock()) } @Test @@ -32,10 +25,7 @@ class AndroidCpuCollectorTest { val ctor = className.getCtor(ctorTypes) assertFailsWith { - ctor.newInstance(arrayOf(null, mock())) - } - assertFailsWith { - ctor.newInstance(arrayOf(mock(), null)) + ctor.newInstance(arrayOf(mock())) } } @@ -57,15 +47,4 @@ class AndroidCpuCollectorTest { assertNotEquals(0.0, cpuData.cpuUsagePercentage) assertNotEquals(0, cpuData.timestampMillis) } - - @Test - fun `collector works only on api 21+`() { - val data = PerformanceCollectionData() - val mockBuildInfoProvider = mock() - whenever(mockBuildInfoProvider.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT) - val collector = fixture.getSut(mockBuildInfoProvider) - collector.setup() - collector.collect(data) - assertNull(data.cpuData) - } } diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt index fce84bc855..95ca59a06e 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt @@ -98,7 +98,6 @@ class AndroidOptionsInitializerTest { } fun initSutWithClassLoader( - minApi: Int = Build.VERSION_CODES.KITKAT, classesToLoad: List = emptyList(), isFragmentAvailable: Boolean = false, isTimberAvailable: Boolean = false, @@ -111,7 +110,7 @@ class AndroidOptionsInitializerTest { } ) sentryOptions.isDebug = true - val buildInfo = createBuildInfo(minApi) + val buildInfo = createBuildInfo() val loadClass = createClassMock(classesToLoad) val activityFramesTracker = ActivityFramesTracker(loadClass, sentryOptions) @@ -142,9 +141,9 @@ class AndroidOptionsInitializerTest { ) } - private fun createBuildInfo(minApi: Int): BuildInfoProvider { + private fun createBuildInfo(): BuildInfoProvider { val buildInfo = mock() - whenever(buildInfo.sdkInfoVersion).thenReturn(minApi) + whenever(buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.LOLLIPOP) return buildInfo } diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidProfilerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidProfilerTest.kt index c5bb334bb3..670729c4d7 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidProfilerTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidProfilerTest.kt @@ -1,7 +1,6 @@ package io.sentry.android.core import android.content.Context -import android.os.Build import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import io.sentry.CpuCollectionData @@ -42,14 +41,11 @@ class AndroidProfilerTest { private lateinit var context: Context private val className = "io.sentry.android.core.AndroidProfiler" - private val ctorTypes = arrayOf(String::class.java, Int::class.java, SentryFrameMetricsCollector::class.java, ISentryExecutorService::class.java, ILogger::class.java, BuildInfoProvider::class.java) + private val ctorTypes = arrayOf(String::class.java, Int::class.java, SentryFrameMetricsCollector::class.java, ISentryExecutorService::class.java, ILogger::class.java) private val fixture = Fixture() private class Fixture { private val mockDsn = "http://key@localhost/proj" - val buildInfo = mock { - whenever(it.sdkInfoVersion).thenReturn(Build.VERSION_CODES.LOLLIPOP) - } val mockLogger = mock() var lastScheduledRunnable: Runnable? = null val mockExecutorService = object : ISentryExecutorService { @@ -86,14 +82,13 @@ class AndroidProfilerTest { val frameMetricsCollector: SentryFrameMetricsCollector = mock() - fun getSut(interval: Int = 1, buildInfoProvider: BuildInfoProvider = buildInfo): AndroidProfiler { + fun getSut(interval: Int = 1): AndroidProfiler { return AndroidProfiler( options.profilingTracesDirPath!!, interval, frameMetricsCollector, options.executorService, - options.logger, - buildInfoProvider + options.logger ) } } @@ -144,34 +139,19 @@ class AndroidProfilerTest { val ctor = className.getCtor(ctorTypes) assertFailsWith { - ctor.newInstance(arrayOf(null, 0, mock(), mock(), mock(), mock())) - } - assertFailsWith { - ctor.newInstance(arrayOf("mock", 0, null, mock(), mock(), mock())) + ctor.newInstance(arrayOf(null, 0, mock(), mock(), mock())) } assertFailsWith { - ctor.newInstance(arrayOf("mock", 0, mock(), null, mock(), mock())) + ctor.newInstance(arrayOf("mock", 0, null, mock(), mock())) } assertFailsWith { - ctor.newInstance(arrayOf("mock", 0, mock(), mock(), null, mock())) + ctor.newInstance(arrayOf("mock", 0, mock(), null, mock())) } assertFailsWith { - ctor.newInstance(arrayOf("mock", 0, mock(), mock(), mock(), null)) + ctor.newInstance(arrayOf("mock", 0, mock(), mock(), null)) } } - @Test - fun `profiler works only on api 21+`() { - val buildInfo = mock { - whenever(it.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT) - } - val profiler = fixture.getSut(1, buildInfo) - val startData = profiler.start() - val endData = profiler.endAndCollect(false, null) - assertNull(startData) - assertNull(endData) - } - @Test fun `profiler returns start and end timestamps`() { val profiler = fixture.getSut() diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/ContextUtilsTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/ContextUtilsTest.kt index 588a32a656..04702dc0ee 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/ContextUtilsTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/ContextUtilsTest.kt @@ -146,7 +146,7 @@ class ContextUtilsTest { @Test fun `when supported abis is specified, getArchitectures returns correct values`() { - val architectures = ContextUtils.getArchitectures(BuildInfoProvider(logger)) + val architectures = ContextUtils.getArchitectures() assertEquals("armeabi-v7a", architectures[0]) } diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/SentryPerformanceProviderTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/SentryPerformanceProviderTest.kt index ff6a299bed..26a76af30e 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/SentryPerformanceProviderTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/SentryPerformanceProviderTest.kt @@ -189,15 +189,6 @@ class SentryPerformanceProviderTest { verify(fixture.logger, never()).log(any(), any()) } - @Test - fun `when SDK is lower than 21, nothing happens`() { - fixture.getSut(sdkVersion = Build.VERSION_CODES.KITKAT) { config -> - writeConfig(config) - } - assertNull(AppStartMetrics.getInstance().appStartProfiler) - verify(fixture.logger, never()).log(any(), any()) - } - @Test fun `when config file is empty, profiler is not started`() { fixture.getSut { config -> diff --git a/sentry-android-integration-tests/sentry-uitest-android-benchmark/build.gradle.kts b/sentry-android-integration-tests/sentry-uitest-android-benchmark/build.gradle.kts index 9cd769676a..9f9fd1b3d6 100644 --- a/sentry-android-integration-tests/sentry-uitest-android-benchmark/build.gradle.kts +++ b/sentry-android-integration-tests/sentry-uitest-android-benchmark/build.gradle.kts @@ -15,7 +15,7 @@ android { defaultConfig { applicationId = "io.sentry.uitest.android.benchmark" - minSdk = Config.Android.minSdkVersionNdk + minSdk = Config.Android.minSdkVersion targetSdk = Config.Android.targetSdkVersion versionCode = 1 versionName = "1.0.0" diff --git a/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts b/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts index 7755166a4e..dc4dbd171f 100644 --- a/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts +++ b/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts @@ -14,7 +14,7 @@ android { namespace = "io.sentry.uitest.android" defaultConfig { - minSdk = Config.Android.minSdkVersionCompose + minSdk = Config.Android.minSdkVersion targetSdk = Config.Android.targetSdkVersion versionCode = 1 versionName = "1.0.0" diff --git a/sentry-android-integration-tests/test-app-plain/build.gradle.kts b/sentry-android-integration-tests/test-app-plain/build.gradle.kts index 762bd2ce7c..7a094fe283 100644 --- a/sentry-android-integration-tests/test-app-plain/build.gradle.kts +++ b/sentry-android-integration-tests/test-app-plain/build.gradle.kts @@ -8,7 +8,7 @@ android { defaultConfig { applicationId = "io.sentry.java.tests.perf.appplain" - minSdk = Config.Android.minSdkVersionNdk + minSdk = Config.Android.minSdkVersion targetSdk = Config.Android.targetSdkVersion versionCode = 1 versionName = "1.0" diff --git a/sentry-android-integration-tests/test-app-sentry/build.gradle.kts b/sentry-android-integration-tests/test-app-sentry/build.gradle.kts index 3c067fb7ed..6464ca9d57 100644 --- a/sentry-android-integration-tests/test-app-sentry/build.gradle.kts +++ b/sentry-android-integration-tests/test-app-sentry/build.gradle.kts @@ -8,7 +8,7 @@ android { defaultConfig { applicationId = "io.sentry.java.tests.perf.appsentry" - minSdk = Config.Android.minSdkVersionNdk + minSdk = Config.Android.minSdkVersion targetSdk = Config.Android.targetSdkVersion versionCode = 1 versionName = "1.0" diff --git a/sentry-android-ndk/build.gradle.kts b/sentry-android-ndk/build.gradle.kts index feeb5fb878..ccf3a419f0 100644 --- a/sentry-android-ndk/build.gradle.kts +++ b/sentry-android-ndk/build.gradle.kts @@ -14,7 +14,7 @@ android { defaultConfig { targetSdk = Config.Android.targetSdkVersion - minSdk = Config.Android.minSdkVersionNdk // NDK requires a higher API level than core. + minSdk = Config.Android.minSdkVersion testInstrumentationRunner = Config.TestLibs.androidJUnitRunner diff --git a/sentry-android-replay/build.gradle.kts b/sentry-android-replay/build.gradle.kts index 15713bb6f4..7f1424096c 100644 --- a/sentry-android-replay/build.gradle.kts +++ b/sentry-android-replay/build.gradle.kts @@ -18,7 +18,7 @@ android { defaultConfig { targetSdk = Config.Android.targetSdkVersion - minSdk = Config.Android.minSdkVersionReplay + minSdk = Config.Android.minSdkVersion testInstrumentationRunner = Config.TestLibs.androidJUnitRunner diff --git a/sentry-android/build.gradle.kts b/sentry-android/build.gradle.kts index 81619b736f..49f7e75006 100644 --- a/sentry-android/build.gradle.kts +++ b/sentry-android/build.gradle.kts @@ -10,7 +10,7 @@ android { defaultConfig { targetSdk = Config.Android.targetSdkVersion - minSdk = Config.Android.minSdkVersionNdk + minSdk = Config.Android.minSdkVersion } buildFeatures { diff --git a/sentry-compose/build.gradle.kts b/sentry-compose/build.gradle.kts index 114c08a22f..0253b97268 100644 --- a/sentry-compose/build.gradle.kts +++ b/sentry-compose/build.gradle.kts @@ -71,7 +71,7 @@ android { defaultConfig { targetSdk = Config.Android.targetSdkVersion - minSdk = Config.Android.minSdkVersionCompose + minSdk = Config.Android.minSdkVersion // for AGP 4.1 buildConfigField("String", "VERSION_NAME", "\"${project.version}\"") diff --git a/sentry-samples/sentry-samples-android/build.gradle.kts b/sentry-samples/sentry-samples-android/build.gradle.kts index dc6737e763..1c1f565bd9 100644 --- a/sentry-samples/sentry-samples-android/build.gradle.kts +++ b/sentry-samples/sentry-samples-android/build.gradle.kts @@ -9,7 +9,7 @@ android { defaultConfig { applicationId = "io.sentry.samples.android" - minSdk = Config.Android.minSdkVersionCompose + minSdk = Config.Android.minSdkVersion targetSdk = Config.Android.targetSdkVersion versionCode = 2 versionName = project.version.toString()