From 41edd00b39a1912e6ed7fed6dfbca5d2033e9553 Mon Sep 17 00:00:00 2001 From: Hans-Peter Lehmann Date: Sun, 2 Nov 2025 08:33:00 +0100 Subject: [PATCH] Crash debug version when doing I/O on main thread (#8064) --- .../java/de/danoeh/antennapod/PodcastApp.java | 8 +++++--- .../storage/database/PodDBAdapter.java | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/de/danoeh/antennapod/PodcastApp.java b/app/src/main/java/de/danoeh/antennapod/PodcastApp.java index a16a25615..2f58b8e6d 100644 --- a/app/src/main/java/de/danoeh/antennapod/PodcastApp.java +++ b/app/src/main/java/de/danoeh/antennapod/PodcastApp.java @@ -21,12 +21,14 @@ public class PodcastApp extends Application { if (BuildConfig.DEBUG) { StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder() - .detectLeakedSqlLiteObjects() + .penaltyDeath() .penaltyLog() - .penaltyDropBox() + .detectLeakedSqlLiteObjects() .detectActivityLeaks() - .detectLeakedClosableObjects() .detectLeakedRegistrationObjects(); + if (android.os.Build.VERSION.SDK_INT >= 26) { + builder.detectContentUriWithoutPermission(); + } StrictMode.setVmPolicy(builder.build()); } diff --git a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java index e440ef754..c37d9aa7e 100644 --- a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java @@ -10,6 +10,8 @@ import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; +import android.os.Build; +import android.os.Looper; import android.text.TextUtils; import android.util.Log; @@ -387,7 +389,24 @@ public class PodDBAdapter { return newDb; } + private boolean isTest() { + if ("robolectric".equals(Build.FINGERPRINT)) { + return true; + } + try { + Class.forName("org.junit.Test"); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } + public synchronized PodDBAdapter open() { + if (BuildConfig.DEBUG) { + if (Looper.myLooper() == Looper.getMainLooper() && !isTest()) { + throw new RuntimeException("I/O on main thread"); + } + } // do nothing return this; }