Disable sentry on F-Droid flavor

pull/27/head
Fox2Code 3 years ago
parent 7a7b829cd2
commit bf92f586ba

@ -79,6 +79,9 @@ aboutLibraries {
}
sentry {
// Disable sentry on F-Droid flavor
ignoredFlavors = [ "fdroid" ]
// Disables or enables the handling of Proguard mapping for Sentry.
// If enabled the plugin will generate a UUID and will take care of
// uploading the mapping to Sentry. If disabled, all the logic
@ -137,7 +140,6 @@ sentry {
configurations {
implementation.exclude group: 'org.jetbrains', module: 'annotations'
implementation.exclude group: 'io.sentry', module: 'sentry-android-okhttp'
}
dependencies {
@ -156,7 +158,7 @@ dependencies {
implementation "dev.rikka.rikkax.insets:insets:1.3.0"
implementation 'com.github.Dimezis:BlurView:version-1.6.6'
implementation 'com.github.KieronQuinn:MonetCompat:0.4.1'
implementation 'com.github.Fox2Code:FoxCompat:0.1.4b'
implementation 'com.github.Fox2Code:FoxCompat:0.1.5'
// Utils
implementation 'androidx.work:work-runtime:2.7.1'
@ -167,11 +169,11 @@ dependencies {
implementation 'com.github.Fox2Code:AndroidANSI:1.0.1'
// Error reporting
implementation 'io.sentry:sentry-android:6.4.1'
implementation 'io.sentry:sentry-android-fragment:6.4.1'
implementation 'io.sentry:sentry-android-okhttp:6.4.1'
implementation 'io.sentry:sentry-android-core:6.4.1'
implementation 'io.sentry:sentry-android-ndk:6.4.1'
defaultImplementation 'io.sentry:sentry-android:6.4.1'
defaultImplementation 'io.sentry:sentry-android-fragment:6.4.1'
defaultImplementation 'io.sentry:sentry-android-okhttp:6.4.1'
defaultImplementation 'io.sentry:sentry-android-core:6.4.1'
defaultImplementation 'io.sentry:sentry-android-ndk:6.4.1'
// Markdown
implementation "io.noties.markwon:core:4.6.2"

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="QueryAllPackagesPermission">
<application android:icon="@mipmap/ic_launcher">
<meta-data android:name="io.sentry.auto-init" android:value="false" />
<meta-data
android:name="io.sentry.dsn"
android:value="https://cdcdb0efca4a42a28df90e4b7f087347@sentry.androidacy.com/2" />
<!-- Sane value, but feel free to lower it -->
<meta-data
android:name="io.sentry.traces.sample-rate"
android:value="0.5" />
<!-- Doesn't actually monitor anything, just used to get the activities the user went through -->
<meta-data
android:name="io.sentry.traces.user-interaction.enable"
android:value="true" />
<!-- Just a screenshot of ONLY the current activity at the time of the crash -->
<meta-data
android:name="io.sentry.attach-screenshot"
android:value="true" />
</application>
</manifest>

@ -0,0 +1,32 @@
package com.fox2code.mmm.sentry;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
import io.sentry.Breadcrumb;
import io.sentry.SentryLevel;
public class SentryBreadcrumb {
final Breadcrumb breadcrumb;
public SentryBreadcrumb() {
breadcrumb = new Breadcrumb();
breadcrumb.setLevel(SentryLevel.INFO);
}
public void setType(@Nullable String type) {
breadcrumb.setType(type);
}
public void setData(@NotNull String key, @NotNull Object value) {
Objects.requireNonNull(key);
Objects.requireNonNull(value);
breadcrumb.setData(key, value);
}
public void setCategory(@Nullable String category) {
breadcrumb.setCategory(category);
}
}

@ -0,0 +1,97 @@
package com.fox2code.mmm.sentry;
import android.util.Log;
import com.fox2code.mmm.BuildConfig;
import com.fox2code.mmm.MainApplication;
import java.io.IOException;
import java.io.Writer;
import io.sentry.JsonObjectWriter;
import io.sentry.NoOpLogger;
import io.sentry.Sentry;
import io.sentry.TypeCheckHint;
import io.sentry.android.core.SentryAndroid;
import io.sentry.android.fragment.FragmentLifecycleIntegration;
import io.sentry.hints.DiskFlushNotification;
public class SentryMain {
public static final boolean IS_SENTRY_INSTALLED = true;
private static final String TAG = "SentryMain";
public static void initialize(final MainApplication mainApplication) {
SentryAndroid.init(mainApplication, options -> {
// If crash reporting is disabled, stop here.
if (!MainApplication.isCrashReportingEnabled()) {
options.setDsn("");
} else {
options.addIntegration(new FragmentLifecycleIntegration(mainApplication, true, true));
// Sentry sends ABSOLUTELY NO Personally Identifiable Information (PII) by default.
// Already set to false by default, just set it again to make peoples feel safer.
options.setSendDefaultPii(false);
// It just tell if sentry should ping the sentry dsn to tell the app is running.
// This is not needed at all for crash reporting purposes, so disable it.
options.setEnableAutoSessionTracking(false);
// A screenshot of the app itself is only sent if the app crashes, and it only shows the last activity
// In addition, sentry is configured with a trusted third party other than sentry.io, and only trusted people have access to the sentry instance
// Add a callback that will be used before the event is sent to Sentry.
// With this callback, you can modify the event or, when returning null, also discard the event.
options.setBeforeSend((event, hint) -> {
if (BuildConfig.DEBUG) { // Debug sentry events for debug.
StringBuilder stringBuilder = new StringBuilder("Sentry report debug: ");
try {
event.serialize(new JsonObjectWriter(new Writer() {
@Override
public void write(char[] cbuf) {
stringBuilder.append(cbuf);
}
@Override
public void write(String str) {
stringBuilder.append(str);
}
@Override
public void write(char[] chars, int i, int i1) {
stringBuilder.append(chars, i, i1);
}
@Override
public void write(String str, int off, int len) {
stringBuilder.append(str, off, len);
}
@Override
public void flush() {
}
@Override
public void close() {
}
}, 4), NoOpLogger.getInstance());
} catch (IOException ignored) {
}
Log.i(TAG, stringBuilder.toString());
}
if (MainApplication.isCrashReportingEnabled()) {
return event;
} else {
// We need to do this to avoid crash delay on crash when the event is dropped
DiskFlushNotification diskFlushNotification = hint.getAs(
TypeCheckHint.SENTRY_TYPE_CHECK_HINT, DiskFlushNotification.class);
if (diskFlushNotification != null) diskFlushNotification.markFlushed();
return null;
}
});
}
});
}
public static void addSentryBreadcrumb(SentryBreadcrumb sentryBreadcrumb) {
if (MainApplication.isCrashReportingEnabled()) {
Sentry.addBreadcrumb(sentryBreadcrumb.breadcrumb);
}
}
}

@ -0,0 +1,19 @@
package com.fox2code.mmm.sentry;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
public class SentryBreadcrumb {
public SentryBreadcrumb() {}
public void setType(@Nullable String type) {}
public void setData(@NotNull String key, @NotNull Object value) {
Objects.requireNonNull(key);
Objects.requireNonNull(value);
}
public void setCategory(@Nullable String category) {}
}

@ -0,0 +1,11 @@
package com.fox2code.mmm.sentry;
import com.fox2code.mmm.MainApplication;
public class SentryMain {
public static final boolean IS_SENTRY_INSTALLED = false;
public static void initialize(MainApplication mainApplication) {}
public static void addSentryBreadcrumb(SentryBreadcrumb sentryBreadcrumb) {}
}

@ -10,9 +10,7 @@
</queries>
<!-- Wifi is not the only way to get an internet connection -->
<uses-feature
android:name="android.hardware.wifi"
android:required="false" />
<uses-feature android:name="android.hardware.wifi" android:required="false" />
<!-- Retrieve online modules -->
<uses-permission android:name="android.permission.INTERNET" />
@ -113,21 +111,5 @@
android:name="androidx.work.WorkManagerInitializer"
tools:node="remove" />
</provider>
<meta-data android:name="io.sentry.auto-init" android:value="false" />
<meta-data
android:name="io.sentry.dsn"
android:value="https://cdcdb0efca4a42a28df90e4b7f087347@sentry.androidacy.com/2" />
<!-- Sane value, but feel free to lower it -->
<meta-data
android:name="io.sentry.traces.sample-rate"
android:value="0.5" />
<!-- Doesn't actually monitor anything, just used to get the activities the user went through -->
<meta-data
android:name="io.sentry.traces.user-interaction.enable"
android:value="true" />
<!-- Just a screenshot of ONLY the current activity at the time of the crash -->
<meta-data
android:name="io.sentry.attach-screenshot"
android:value="true" />
</application>
</manifest>

@ -23,6 +23,7 @@ import com.fox2code.foxcompat.FoxApplication;
import com.fox2code.foxcompat.FoxThemeWrapper;
import com.fox2code.foxcompat.internal.FoxProcessExt;
import com.fox2code.mmm.installer.InstallerInitializer;
import com.fox2code.mmm.sentry.SentryMain;
import com.fox2code.mmm.utils.GMSProviderInstaller;
import com.fox2code.mmm.utils.Http;
import com.fox2code.rosettax.LanguageSwitcher;
@ -366,60 +367,7 @@ public class MainApplication extends FoxApplication
}, "Emoji compat init.").start();
}
SentryAndroid.init(this, options -> {
// If crash reporting is disabled, stop here.
if (!isCrashReportingEnabled()) {
options.setDsn("");
} else {
options.addIntegration(new FragmentLifecycleIntegration(this, true, true));
// Sentry sends ABSOLUTELY NO Personally Identifiable Information (PII) by default.
// A screenshot of the app itself is only sent if the app crashes, and it only shows the last activity
// In addition, sentry is configured with a trusted third party other than sentry.io, and only trusted people have access to the sentry instance
// Add a callback that will be used before the event is sent to Sentry.
// With this callback, you can modify the event or, when returning null, also discard the event.
options.setBeforeSend((event, hint) -> {
if (BuildConfig.DEBUG) { // Debug sentry events for debug.
StringBuilder stringBuilder = new StringBuilder("Sentry report debug: ");
try {
event.serialize(new JsonObjectWriter(new Writer() {
@Override
public void write(char[] cbuf) {
stringBuilder.append(cbuf);
}
@Override
public void write(String str) {
stringBuilder.append(str);
}
@Override
public void write(char[] chars, int i, int i1) {
stringBuilder.append(chars, i, i1);
}
@Override
public void write(String str, int off, int len) {
stringBuilder.append(str, off, len);
}
@Override
public void flush() {
}
@Override
public void close() {
}
}, 4), NoOpLogger.getInstance());
} catch (IOException ignored) {
}
Log.i(TAG, stringBuilder.toString());
}
// We already know that the user has opted in to crash reporting, so we don't need to ask again.
return event;
});
}
});
SentryMain.initialize(this);
}
@Override

@ -24,6 +24,8 @@ import com.fox2code.mmm.MainApplication;
import com.fox2code.mmm.R;
import com.fox2code.mmm.XHooks;
import com.fox2code.mmm.module.ActionButtonType;
import com.fox2code.mmm.sentry.SentryBreadcrumb;
import com.fox2code.mmm.sentry.SentryMain;
import com.fox2code.mmm.utils.FastException;
import com.fox2code.mmm.utils.Files;
import com.fox2code.mmm.utils.Hashes;
@ -50,10 +52,6 @@ import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import io.sentry.Breadcrumb;
import io.sentry.Sentry;
import io.sentry.SentryLevel;
public class InstallerActivity extends FoxActivity {
private static final String TAG = "InstallerActivity";
public LinearProgressIndicator progressIndicator;
@ -109,14 +107,13 @@ public class InstallerActivity extends FoxActivity {
Log.i(TAG, "Install link: " + target);
// Note: Sentry only send this info on crash.
if (MainApplication.isCrashReportingEnabled()) {
Breadcrumb breadcrumb = new Breadcrumb();
SentryBreadcrumb breadcrumb = new SentryBreadcrumb();
breadcrumb.setType("install");
breadcrumb.setData("target", target);
breadcrumb.setData("name", name);
breadcrumb.setData("checksum", checksum);
breadcrumb.setCategory("app.action.preinstall");
breadcrumb.setLevel(SentryLevel.INFO);
Sentry.addBreadcrumb(breadcrumb);
SentryMain.addSentryBreadcrumb(breadcrumb);
}
boolean urlMode = target.startsWith("http://") || target.startsWith("https://");
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
@ -450,7 +447,7 @@ public class InstallerActivity extends FoxActivity {
}
// Note: Sentry only send this info on crash.
if (MainApplication.isCrashReportingEnabled()) {
Breadcrumb breadcrumb = new Breadcrumb();
SentryBreadcrumb breadcrumb = new SentryBreadcrumb();
breadcrumb.setType("install");
breadcrumb.setData("moduleId", moduleId == null ? "<null>" : moduleId);
breadcrumb.setData("mmtReborn", mmtReborn ? "true" : "false");
@ -460,8 +457,7 @@ public class InstallerActivity extends FoxActivity {
breadcrumb.setData("ansi", this.installerTerminal
.isAnsiEnabled() ? "enabled" : "disabled");
breadcrumb.setCategory("app.action.install");
breadcrumb.setLevel(SentryLevel.INFO);
Sentry.addBreadcrumb(breadcrumb);
SentryMain.addSentryBreadcrumb(breadcrumb);
}
if (mmtReborn && magiskCmdLine) {
Log.w(TAG, "mmtReborn and magiskCmdLine may not work well together");

@ -47,6 +47,7 @@ import com.fox2code.mmm.repo.CustomRepoData;
import com.fox2code.mmm.repo.CustomRepoManager;
import com.fox2code.mmm.repo.RepoData;
import com.fox2code.mmm.repo.RepoManager;
import com.fox2code.mmm.sentry.SentryMain;
import com.fox2code.mmm.utils.ExternalHelper;
import com.fox2code.mmm.utils.Http;
import com.fox2code.mmm.utils.IntentHelper;
@ -134,13 +135,13 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity {
});
// Crash reporting
TwoStatePreference crashReportingPreference = findPreference("pref_crash_reporting");
if (!SentryMain.IS_SENTRY_INSTALLED) crashReportingPreference.setVisible(false);
crashReportingPreference.setChecked(MainApplication.isCrashReportingEnabled());
final Object initialValue = MainApplication.isCrashReportingEnabled();
crashReportingPreference.setOnPreferenceChangeListener((preference, newValue) -> {
devModeStepFirstBootIgnore = true;
devModeStep = 0;
// Save the new value and restart the app
MainApplication.getSharedPreferences().edit()
.putBoolean("crash_reporting", (boolean) newValue).apply();
if (initialValue == newValue) return true;
// Show a dialog to restart the app
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(requireContext());
materialAlertDialogBuilder.setTitle(R.string.crash_reporting_restart_title);
@ -165,12 +166,8 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity {
}
System.exit(0); // Exit app process
});
// Reverse the change if the user cancels the dialog
materialAlertDialogBuilder.setNegativeButton(R.string.cancel, (dialog, which) -> {
crashReportingPreference.setChecked(!crashReportingPreference.isChecked());
MainApplication.getSharedPreferences().edit()
.putBoolean("crash_reporting", crashReportingPreference.isChecked()).apply();
});
// Do not reverse the change if the user cancels the dialog
materialAlertDialogBuilder.setNegativeButton(R.string.no, (dialog, which) -> {});
materialAlertDialogBuilder.show();
return true;
});
@ -245,7 +242,8 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity {
if (!MainApplication.isDeveloper()) {
findPreference("pref_disable_low_quality_module_filter").setVisible(false);
}
if (!BuildConfig.DEBUG || InstallerInitializer.peekMagiskPath() == null) {
if (!SentryMain.IS_SENTRY_INSTALLED || !BuildConfig.DEBUG ||
InstallerInitializer.peekMagiskPath() == null) {
// Hide the pref_crash option if not in debug mode - stop users from purposely crashing the app
Objects.requireNonNull((Preference) findPreference("pref_crash")).setVisible(false);
} else {

@ -5,10 +5,10 @@ buildscript {
mavenCentral()
gradlePluginPortal()
}
project.ext.latestAboutLibsRelease = "10.4.1-a01"
project.ext.blockSentry = false // TODO: Make this block Sentry from even being added to the project
project.ext.latestAboutLibsRelease = "10.5.0"
project.ext.hasSentryConfig = false
dependencies {
classpath 'com.android.tools.build:gradle:7.2.2'
classpath 'com.android.tools.build:gradle:7.3.0'
classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${latestAboutLibsRelease}"
// NOTE: Do not place your application dependencies here; they belong

Loading…
Cancel
Save