-
-
Notifications
You must be signed in to change notification settings - Fork 63
fix(android): write lowercase booleans to the AndroidManifest
#2846
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
f10a719
15c8011
d428510
2578256
175da24
842014f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -48,6 +48,8 @@ public class AndroidManifestConfiguration | |
| private readonly bool _isDevelopmentBuild; | ||
| private readonly ScriptingImplementation _scriptingImplementation; | ||
|
|
||
| private bool? _androidSdkEnabled; | ||
|
|
||
| public AndroidManifestConfiguration() | ||
| : this( | ||
| SentryScriptableObject.LoadOptions, | ||
|
|
@@ -111,43 +113,60 @@ public void OnPostGenerateGradleAndroidProject(string basePath) | |
| SetupProguard(gradleProjectPath); | ||
| } | ||
|
|
||
| internal void ModifyManifest(string basePath) | ||
| { | ||
| var manifestPath = GetManifestPath(basePath); | ||
| if (!File.Exists(manifestPath)) | ||
| { | ||
| throw new FileNotFoundException("Can't configure native Android SDK nor set auto-init:false.", | ||
| manifestPath); | ||
| } | ||
| /// <summary> | ||
| /// Whether this build ships the Android SDK. Shared with <see cref="ModifyManifest"/> because an app that | ||
| /// carries `sentry-android-core` without the matching manifest entries auto-initializes without a DSN, | ||
| /// which crashes it on startup. | ||
| /// </summary> | ||
| private bool AndroidSdkEnabled => _androidSdkEnabled ??= EvaluateAndroidSdkEnabled(); | ||
|
|
||
| var enableNativeSupport = true; | ||
| private bool EvaluateAndroidSdkEnabled() | ||
| { | ||
| if (_options is null) | ||
| { | ||
| _logger.LogWarning("Android native support disabled because Sentry has not been configured. " + | ||
| "You can do that through the editor: {0}", SentryWindow.EditorMenuPath); | ||
| enableNativeSupport = false; | ||
| return false; | ||
| } | ||
| else if (!_options.IsValid()) | ||
|
|
||
| if (!_options.IsValid()) | ||
| { | ||
| _logger.LogDebug("Android native support disabled."); | ||
| enableNativeSupport = false; | ||
| return false; | ||
| } | ||
| else if (!_options.AndroidNativeSupportEnabled) | ||
|
|
||
| if (!_options.AndroidNativeSupportEnabled) | ||
| { | ||
| _logger.LogDebug("Android native support disabled through the options."); | ||
| enableNativeSupport = false; | ||
| return false; | ||
| } | ||
|
|
||
| return true; | ||
| } | ||
|
|
||
| internal void ModifyManifest(string basePath) | ||
| { | ||
| var manifestPath = GetManifestPath(basePath); | ||
| if (!File.Exists(manifestPath)) | ||
| { | ||
| throw new FileNotFoundException("Can't configure native Android SDK nor set auto-init:false.", | ||
| manifestPath); | ||
| } | ||
|
|
||
| var androidManifest = new AndroidManifest(manifestPath, _logger); | ||
| androidManifest.RemovePreviousConfigurations(); | ||
| androidManifest.AddDisclaimerComment(); | ||
|
|
||
| if (!enableNativeSupport) | ||
| if (!AndroidSdkEnabled) | ||
| { | ||
| // Should the SDK end up in the app regardless, this keeps it from crashing on startup. | ||
| _logger.LogDebug("Setting 'auto-init' to 'false'. The Android SDK is not part of this build."); | ||
| androidManifest.SetAutoInit(false); | ||
| _ = androidManifest.Save(); | ||
|
|
||
| return; | ||
| } | ||
|
|
||
| androidManifest.AddDisclaimerComment(); | ||
|
|
||
| if (_options?.AndroidNativeInitializationType is NativeInitializationType.Runtime) | ||
| { | ||
| _logger.LogDebug("Setting 'auto-init' to 'false'. The Android SDK will be initialized at runtime."); | ||
|
|
@@ -239,7 +258,7 @@ internal void CopyAndroidSdkToGradleProject(string unityProjectPath, string grad | |
| var androidSdkPath = Path.Combine(unityProjectPath, "Packages", SentryPackageInfo.GetName(), "Plugins", "Android", "Sentry~"); | ||
| var targetPath = Path.Combine(gradlePath, "unityLibrary", "libs"); | ||
|
|
||
| if (_options is { Enabled: true, AndroidNativeSupportEnabled: true }) | ||
| if (AndroidSdkEnabled) | ||
| { | ||
| if (!Directory.Exists(androidSdkPath)) | ||
| { | ||
|
|
@@ -260,6 +279,13 @@ internal void CopyAndroidSdkToGradleProject(string unityProjectPath, string grad | |
| } | ||
| else | ||
| { | ||
| if (!Directory.Exists(androidSdkPath)) | ||
| { | ||
| // A build that does not ship the SDK has no reason to fail over a missing SDK. | ||
| _logger.LogDebug("Failed to find the Android SDK at '{0}'. Nothing to remove.", androidSdkPath); | ||
| return; | ||
| } | ||
|
|
||
| _logger.LogInfo("Removing the Android SDK from the output project."); | ||
| foreach (var file in Directory.GetFiles(androidSdkPath)) | ||
| { | ||
|
|
@@ -275,7 +301,7 @@ internal void CopyAndroidSdkToGradleProject(string unityProjectPath, string grad | |
| internal void AddAndroidSdkDependencies(string gradleProjectPath) | ||
| { | ||
| var tool = new GradleSetup(_logger, gradleProjectPath); | ||
| var nativeSupportEnabled = _options is { Enabled: true, AndroidNativeSupportEnabled: true }; | ||
| var nativeSupportEnabled = AndroidSdkEnabled; | ||
|
|
||
| try | ||
| { | ||
|
|
@@ -358,7 +384,7 @@ internal void SetupSymbolsUpload(string unityProjectPath, string gradleProjectPa | |
| private void SetupProguard(string gradleProjectPath) | ||
| { | ||
| var tool = new ProguardSetup(_logger, gradleProjectPath); | ||
| var nativeSupportEnabled = _options is { Enabled: true, AndroidNativeSupportEnabled: true }; | ||
| var nativeSupportEnabled = AndroidSdkEnabled; | ||
|
|
||
| try | ||
| { | ||
|
|
@@ -470,7 +496,7 @@ public void AddDisclaimerComment() => | |
| _applicationElement.AppendChild(_applicationElement.OwnerDocument.CreateComment(Disclaimer)); | ||
|
|
||
| internal void SetAutoInit(bool enableAutoInit) | ||
| => SetMetaData($"{SentryPrefix}.auto-init", enableAutoInit.ToString()); | ||
| => SetMetaData($"{SentryPrefix}.auto-init", enableAutoInit); | ||
|
|
||
| internal void SetDsn(string dsn) => SetMetaData($"{SentryPrefix}.dsn", dsn); | ||
|
|
||
|
|
@@ -482,58 +508,58 @@ internal void SetSampleRate(float sampleRate) => | |
|
|
||
| internal void SetDist(string dist) => SetMetaData($"{SentryPrefix}.dist", dist); | ||
|
|
||
| internal void SetAttachScreenshot(bool value) => SetMetaData($"{SentryPrefix}.attach-screenshot", value.ToString()); | ||
| internal void SetAttachScreenshot(bool value) => SetMetaData($"{SentryPrefix}.attach-screenshot", value); | ||
|
|
||
| internal void SetEnvironment(string environment) => SetMetaData($"{SentryPrefix}.environment", environment); | ||
|
|
||
| internal void SetSDK(string name) => SetMetaData($"{SentryPrefix}.sdk.name", name); | ||
|
|
||
| internal void SetAutoSessionTracking(bool enableAutoSessionTracking) | ||
| => SetMetaData($"{SentryPrefix}.auto-session-tracking.enable", enableAutoSessionTracking.ToString()); | ||
| => SetMetaData($"{SentryPrefix}.auto-session-tracking.enable", enableAutoSessionTracking); | ||
|
|
||
| public void SetAutoAppLifecycleBreadcrumbs(bool enableAutoAppLifeCycleBreadcrumbs) | ||
| => SetMetaData($"{SentryPrefix}.breadcrumbs.app-lifecycle", enableAutoAppLifeCycleBreadcrumbs.ToString()); | ||
| => SetMetaData($"{SentryPrefix}.breadcrumbs.app-lifecycle", enableAutoAppLifeCycleBreadcrumbs); | ||
|
|
||
| internal void SetAnr(bool enableAnr) | ||
| => SetMetaData($"{SentryPrefix}.anr.enable", enableAnr.ToString()); | ||
| => SetMetaData($"{SentryPrefix}.anr.enable", enableAnr); | ||
|
|
||
| internal void SetPersistentScopeObserver(bool enableScopePersistence) | ||
| => SetMetaData($"{SentryPrefix}.enable-scope-persistence", enableScopePersistence.ToString()); | ||
| => SetMetaData($"{SentryPrefix}.enable-scope-persistence", enableScopePersistence); | ||
|
|
||
| internal void SetAttachAnrThreadDump(bool attachAnrThreadDump) | ||
| => SetMetaData($"{SentryPrefix}.anr.attach-thread-dumps", attachAnrThreadDump.ToString()); | ||
| => SetMetaData($"{SentryPrefix}.anr.attach-thread-dumps", attachAnrThreadDump); | ||
|
|
||
| internal void SetNdkAppHangTracking(bool enableNdkAppHangTracking) | ||
| => SetMetaData($"{SentryPrefix}.ndk.app-hang.enable", enableNdkAppHangTracking.ToString()); | ||
| => SetMetaData($"{SentryPrefix}.ndk.app-hang.enable", enableNdkAppHangTracking); | ||
|
|
||
| internal void SetNdkAppHangTimeout(long ndkAppHangTimeout) | ||
| => SetMetaData($"{SentryPrefix}.ndk.app-hang.timeout-interval-millis", ndkAppHangTimeout.ToString(CultureInfo.InvariantCulture)); | ||
|
|
||
| internal void SetTombstone(bool enableTombstone) | ||
| => SetMetaData($"{SentryPrefix}.tombstone.enable", enableTombstone.ToString()); | ||
| => SetMetaData($"{SentryPrefix}.tombstone.enable", enableTombstone); | ||
|
|
||
| internal void SetTombstoneReportHistorical(bool enableTombstoneReportHistorical) | ||
| => SetMetaData($"{SentryPrefix}.tombstone.report-historical", enableTombstoneReportHistorical.ToString()); | ||
| => SetMetaData($"{SentryPrefix}.tombstone.report-historical", enableTombstoneReportHistorical); | ||
|
|
||
| internal void SetNdkEnabled(bool enableNdk) | ||
| => SetMetaData($"{SentryPrefix}.ndk.enable", enableNdk.ToString()); | ||
| => SetMetaData($"{SentryPrefix}.ndk.enable", enableNdk); | ||
|
|
||
| internal void SetNdkScopeSync(bool enableNdkScopeSync) | ||
| => SetMetaData($"{SentryPrefix}.ndk.scope-sync.enable", enableNdkScopeSync.ToString()); | ||
| => SetMetaData($"{SentryPrefix}.ndk.scope-sync.enable", enableNdkScopeSync); | ||
|
|
||
| internal void SetNdkSdkName(string sdkName) | ||
| => SetMetaData($"{SentryPrefix}.ndk.sdk-name", sdkName); | ||
|
|
||
| internal void SetAutoTraceIdGeneration(bool enableAutoTraceIdGeneration) | ||
| => SetMetaData($"{SentryPrefix}.traces.enable-auto-id-generation", enableAutoTraceIdGeneration.ToString()); | ||
| => SetMetaData($"{SentryPrefix}.traces.enable-auto-id-generation", enableAutoTraceIdGeneration); | ||
|
|
||
| internal void SetEnableUserInteractionBreadcrumbs(bool enableUserInteractionBreadcrumbs) | ||
| => SetMetaData($"{SentryPrefix}.breadcrumbs.user-interaction", enableUserInteractionBreadcrumbs.ToString()); | ||
| => SetMetaData($"{SentryPrefix}.breadcrumbs.user-interaction", enableUserInteractionBreadcrumbs); | ||
|
|
||
| internal void SetEnableUserInteractionTracing(bool enableUserInteractionTracing) | ||
| => SetMetaData($"{SentryPrefix}.traces.user-interaction.enable", enableUserInteractionTracing.ToString()); | ||
| => SetMetaData($"{SentryPrefix}.traces.user-interaction.enable", enableUserInteractionTracing); | ||
|
|
||
| internal void SetDebug(bool debug) => SetMetaData($"{SentryPrefix}.debug", debug ? "true" : "false"); | ||
| internal void SetDebug(bool debug) => SetMetaData($"{SentryPrefix}.debug", debug); | ||
|
|
||
| // https://github.com/getsentry/sentry-java/blob/db4dfc92f202b1cefc48d019fdabe24d487db923/sentry/src/main/java/io/sentry/SentryLevel.java#L4-L9 | ||
| internal void SetLevel(SentryLevel level) => | ||
|
|
@@ -547,6 +573,9 @@ internal void SetLevel(SentryLevel level) => | |
| _ => "debug" | ||
| }); | ||
|
|
||
| // The Sentry Gradle plugin only recognizes lowercase booleans when resolving the metadata at build time. | ||
|
Comment on lines
573
to
+576
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Bug: The check in Suggested FixUpdate the conditional check in the Prompt for AI Agent |
||
| private void SetMetaData(string key, bool value) => SetMetaData(key, value ? "true" : "false"); | ||
|
|
||
| private void SetMetaData(string key, string value) | ||
| { | ||
| var element = _applicationElement.AppendChild(_applicationElement.OwnerDocument | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.