From b02c31ed7036bfb9fdb23af1896b9bece1b84e66 Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 12 Apr 2022 21:16:04 +0200 Subject: [PATCH] Added leak canary --- ATTRIBUTION.md | 1 + app/build.gradle | 6 ++++++ app/src/main/assets/ATTRIBUTION.md | 1 + .../main/java/eu/faircode/email/ApplicationEx.java | 1 + .../java/eu/faircode/email/FragmentOptionsMisc.java | 2 +- app/src/main/java/eu/faircode/email/Log.java | 13 +++++++++++++ .../java/eu/faircode/email/ServiceSynchronize.java | 6 +++++- app/src/main/java/eu/faircode/email/ServiceUI.java | 5 +++++ 8 files changed, 33 insertions(+), 2 deletions(-) diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index 59a6bd3681..469f86036f 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -42,3 +42,4 @@ FairEmail uses: * [Lato font](https://fonts.google.com/specimen/Lato). By Łukasz Dziedzic. [Apache License 2.0](https://fonts.google.com/specimen/Lato#license). * [Caladea font](https://fonts.google.com/specimen/Caladea). By Andrés Torresi, Carolina Giovanolli. [Apache License 2.0](https://fonts.google.com/specimen/Caladea#license). * [Apache Commons Compress](https://commons.apache.org/proper/commons-compress/). Copyright © 2002-2021 The Apache Software Foundation. All Rights Reserved. [Apache License 2.0](https://www.apache.org/licenses/). +* [LeakCanary](https://github.com/square/leakcanary). Copyright 2015 Square, Inc. [Apache License 2.0](https://github.com/square/leakcanary/blob/main/LICENSE.txt). diff --git a/app/build.gradle b/app/build.gradle index 25e4684bbb..71431a26c5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -385,6 +385,7 @@ dependencies { def rxjava2_version = "2.2.21" def svg_version = "1.4" def compress_version = "1.21" + def canary_version = "2.8.1" // https://developer.android.com/jetpack/androidx/releases/startup implementation "androidx.startup:startup-runtime:$startup_version" @@ -585,4 +586,9 @@ dependencies { // https://commons.apache.org/proper/commons-compress/ // https://mvnrepository.com/artifact/org.apache.commons/commons-compress implementation "org.apache.commons:commons-compress:$compress_version" + + // https://github.com/square/leakcanary + // https://square.github.io/leakcanary/getting_started/ + // https://mvnrepository.com/artifact/com.squareup.leakcanary/leakcanary-android + implementation "com.squareup.leakcanary:leakcanary-android:$canary_version" } diff --git a/app/src/main/assets/ATTRIBUTION.md b/app/src/main/assets/ATTRIBUTION.md index 59a6bd3681..469f86036f 100644 --- a/app/src/main/assets/ATTRIBUTION.md +++ b/app/src/main/assets/ATTRIBUTION.md @@ -42,3 +42,4 @@ FairEmail uses: * [Lato font](https://fonts.google.com/specimen/Lato). By Łukasz Dziedzic. [Apache License 2.0](https://fonts.google.com/specimen/Lato#license). * [Caladea font](https://fonts.google.com/specimen/Caladea). By Andrés Torresi, Carolina Giovanolli. [Apache License 2.0](https://fonts.google.com/specimen/Caladea#license). * [Apache Commons Compress](https://commons.apache.org/proper/commons-compress/). Copyright © 2002-2021 The Apache Software Foundation. All Rights Reserved. [Apache License 2.0](https://www.apache.org/licenses/). +* [LeakCanary](https://github.com/square/leakcanary). Copyright 2015 Square, Inc. [Apache License 2.0](https://github.com/square/leakcanary/blob/main/LICENSE.txt). diff --git a/app/src/main/java/eu/faircode/email/ApplicationEx.java b/app/src/main/java/eu/faircode/email/ApplicationEx.java index 35c4134f4c..75cf59bdb9 100644 --- a/app/src/main/java/eu/faircode/email/ApplicationEx.java +++ b/app/src/main/java/eu/faircode/email/ApplicationEx.java @@ -182,6 +182,7 @@ public class ApplicationEx extends Application }); Log.setup(this); + Log.setupLeakCanary(crash_reports); upgrade(this); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index 36bb84103a..358dca988f 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -19,7 +19,6 @@ package eu.faircode.email; Copyright 2018-2022 by Marcel Bokhorst (M66B) */ -import android.app.Activity; import android.app.ActivityManager; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -664,6 +663,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc .putBoolean("crash_reports", checked) .apply(); Log.setCrashReporting(checked); + Log.setupLeakCanary(checked); } }); diff --git a/app/src/main/java/eu/faircode/email/Log.java b/app/src/main/java/eu/faircode/email/Log.java index 61aa9c84a3..c46db44a99 100644 --- a/app/src/main/java/eu/faircode/email/Log.java +++ b/app/src/main/java/eu/faircode/email/Log.java @@ -154,6 +154,7 @@ import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import io.requery.android.database.CursorWindowAllocationException; +import leakcanary.LeakCanary; public class Log { private static Context ctx; @@ -569,6 +570,18 @@ public class Log { } } + static void setupLeakCanary(boolean enabled) { + LeakCanary.Config config = LeakCanary.getConfig().newBuilder() + .dumpHeap(enabled && BuildConfig.DEBUG) + .build(); + LeakCanary.setConfig(config); + LeakCanary.INSTANCE.showLeakDisplayActivityLauncherIcon(BuildConfig.DEBUG); + } + + static void checkCanary() { + LeakCanary.INSTANCE.dumpHeap(); + } + static void logExtras(Intent intent) { if (intent != null) logBundle(intent.getExtras()); diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index ce87913853..fab13b42a9 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -1288,11 +1288,15 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences PendingIntent piWhy = PendingIntentCompat.getActivity( this, ActivityView.PI_WHY, why, PendingIntent.FLAG_UPDATE_CURRENT); + Intent dump = new Intent(this, ServiceUI.class).setAction("dump"); + PendingIntent piDump = PendingIntentCompat.getService( + this, ServiceUI.PI_DUMP, dump, PendingIntent.FLAG_UPDATE_CURRENT); + // Build notification NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "service") .setSmallIcon(R.drawable.baseline_compare_arrows_white_24) - .setContentIntent(piWhy) + .setContentIntent(BuildConfig.DEBUG ? piDump : piWhy) .setAutoCancel(false) .setShowWhen(false) .setPriority(NotificationCompat.PRIORITY_MIN) diff --git a/app/src/main/java/eu/faircode/email/ServiceUI.java b/app/src/main/java/eu/faircode/email/ServiceUI.java index 11b07afc0f..89d70b614c 100644 --- a/app/src/main/java/eu/faircode/email/ServiceUI.java +++ b/app/src/main/java/eu/faircode/email/ServiceUI.java @@ -58,6 +58,7 @@ public class ServiceUI extends IntentService { static final int PI_SNOOZE = 10; static final int PI_IGNORED = 11; static final int PI_DELETE = 12; + static final int PI_DUMP = 13; public ServiceUI() { this(ServiceUI.class.getName()); @@ -175,6 +176,10 @@ public class ServiceUI extends IntentService { // ignore break; + case "dump": + Log.checkCanary(); + break; + default: throw new IllegalArgumentException("Unknown UI action: " + parts[0]); }