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 cd5a0ecda..b2d1d8ee4 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 @@ -1,6 +1,7 @@ package io.sentry.android.core; import android.content.Context; +import android.os.Build; import io.sentry.core.ILogger; import io.sentry.core.SentryLevel; import io.sentry.core.SentryOptions; @@ -22,30 +23,26 @@ static void init(SentryOptions options, Context context, ILogger logger) { ManifestMetadataReader.applyMetadata(context, options); createsEnvelopeDirPath(options, context); - if (options.isEnableNdk()) { + options.addEventProcessor(new DefaultAndroidEventProcessor(context, options)); + options.setSerializer(new AndroidSerializer(options.getLogger())); + + if (options.isEnableNdk() && isNdkAvailable()) { try { // TODO: Create Integrations interface and use that to initialize NDK Class cls = Class.forName("io.sentry.android.ndk.SentryNdk"); - // TODO: temporary hack - String cacheDirPath = context.getCacheDir().getAbsolutePath() + "/sentry-envelopes"; - File f = new File(cacheDirPath); - f.mkdirs(); - - Method method = cls.getMethod("init", SentryOptions.class, String.class); - Object[] args = new Object[2]; + Method method = cls.getMethod("init", SentryOptions.class); + Object[] args = new Object[1]; args[0] = options; - args[1] = cacheDirPath; method.invoke(null, args); - } catch (ClassNotFoundException exc) { - options.getLogger().log(SentryLevel.ERROR, "Failed to load SentryNdk."); + } catch (ClassNotFoundException e) { + options.setEnableNdk(false); + options.getLogger().log(SentryLevel.ERROR, "Failed to load SentryNdk.", e); } catch (Exception e) { + options.setEnableNdk(false); options.getLogger().log(SentryLevel.ERROR, "Failed to initialize SentryNdk.", e); } } - - options.addEventProcessor(new DefaultAndroidEventProcessor(context, options)); - options.setSerializer(new AndroidSerializer(options.getLogger())); } private static void createsEnvelopeDirPath(SentryOptions options, Context context) { @@ -56,4 +53,8 @@ private static void createsEnvelopeDirPath(SentryOptions options, Context contex } options.setCacheDirPath(envelopesDir.getAbsolutePath()); } + + private static boolean isNdkAvailable() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; + } } diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java b/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java index 55b701aca..d1ee2e354 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java @@ -15,6 +15,7 @@ class ManifestMetadataReader { static final String DSN_KEY = "io.sentry.dsn"; static final String DEBUG_KEY = "io.sentry.debug"; static final String AUTO_INIT = "io.sentry.auto-init"; + static final String ENABLE_NDK = "io.sentry.ndk"; public static void applyMetadata(Context context, SentryOptions options) { if (context == null) throw new IllegalArgumentException("The application context is required."); @@ -32,6 +33,10 @@ public static void applyMetadata(Context context, SentryOptions options) { log(options.getLogger(), SentryLevel.DEBUG, "DSN read: %s", dsn); options.setDsn(dsn); } + + boolean ndk = metadata.getBoolean(ENABLE_NDK, options.isEnableNdk()); + log(options.getLogger(), SentryLevel.DEBUG, "NDK read: %s", ndk); + options.setEnableNdk(ndk); } log( options.getLogger(), diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/SentryInitProviderTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/SentryInitProviderTest.kt index 5d39570ec..0104be9e3 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/SentryInitProviderTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/SentryInitProviderTest.kt @@ -10,8 +10,10 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import com.nhaarman.mockitokotlin2.doReturn import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever +import io.sentry.core.ILogger import io.sentry.core.InvalidDsnException import io.sentry.core.Sentry +import io.sentry.core.SentryOptions import java.io.File import kotlin.test.BeforeTest import kotlin.test.Test @@ -128,6 +130,22 @@ class SentryInitProviderTest { assertFalse(Sentry.isEnabled()) } + @Test + fun `when applicationId is defined, ndk in meta-data is set to false, NDK doesnt initialize`() { + val sentryOptions = SentryOptions() + val mockLogger = mock() + + val mockContext = createMockContext() + + val metaData = Bundle() + mockMetaData(mockContext, metaData) + metaData.putBoolean(ManifestMetadataReader.ENABLE_NDK, false) + + AndroidOptionsInitializer.init(sentryOptions, mockContext, mockLogger) + + assertFalse(sentryOptions.isEnableNdk) + } + private fun mockMetaData(mockContext: Context, metaData: Bundle) { val mockPackageManager: PackageManager = mock() val mockApplicationInfo: ApplicationInfo = mock() diff --git a/sentry-android-ndk/src/main/java/io/sentry/android/ndk/SentryNdk.java b/sentry-android-ndk/src/main/java/io/sentry/android/ndk/SentryNdk.java index 4e9a273bf..72b002286 100644 --- a/sentry-android-ndk/src/main/java/io/sentry/android/ndk/SentryNdk.java +++ b/sentry-android-ndk/src/main/java/io/sentry/android/ndk/SentryNdk.java @@ -17,8 +17,8 @@ public static void notifyNewSerializedEnvelope(String path) { System.out.println("envelope written to " + path); } - public static void init(SentryOptions options, String cacheDirPath) { + public static void init(SentryOptions options) { // Java_example - initSentryNative(cacheDirPath); + initSentryNative(options.getCacheDirPath()); } } diff --git a/sentry-sample/src/main/AndroidManifest.xml b/sentry-sample/src/main/AndroidManifest.xml index c93e5dcfe..a90efc34b 100644 --- a/sentry-sample/src/main/AndroidManifest.xml +++ b/sentry-sample/src/main/AndroidManifest.xml @@ -22,6 +22,9 @@ + + +