From 449e56c71e2ef5e086bbe3582baba7b545601fca Mon Sep 17 00:00:00 2001 From: Pierre-Yves Ricau Date: Wed, 1 May 2024 14:58:03 -0700 Subject: [PATCH 1/4] Add binder proxy to ignored list --- .../shark/AndroidHeapGrowthReferenceMatchers.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/shark/shark-android/src/main/java/shark/AndroidHeapGrowthReferenceMatchers.kt b/shark/shark-android/src/main/java/shark/AndroidHeapGrowthReferenceMatchers.kt index 1a18de253..874826cbe 100644 --- a/shark/shark-android/src/main/java/shark/AndroidHeapGrowthReferenceMatchers.kt +++ b/shark/shark-android/src/main/java/shark/AndroidHeapGrowthReferenceMatchers.kt @@ -51,6 +51,22 @@ enum class AndroidHeapGrowthReferenceMatchers : ReferenceMatcher.ListBuilder { } }, + BINDER_PROXY { + override fun add(references: MutableList) { + // BinderProxy is a manually implemented hashtable of weak refs to BinderProxy instances. + // The hashtable is optimized so that it has a fixed large array size that never grows, + // and every entry points to a list of weak refs. The weak references aren't removed when the + // BinderProxy instances are garbage collected, instead relying on random access to + // occasionally prune entries. This leads to BinderProxy being reported as a growing object. + // Interestingly, we've only observed this on API 34+ so far, so there might be something + // there that led to cleanups happening less often (?). + references += staticField("android.os.BinderProxy", "sProxyMap") + .ignored(patternApplies = AndroidBuildMirror.applyIf { + sdkInt >= 34 + }) + } + } + ; companion object { From 324980a415754af49c5c9ed31f92f742777ad3fd Mon Sep 17 00:00:00 2001 From: Pierre-Yves Ricau Date: Wed, 1 May 2024 15:01:46 -0700 Subject: [PATCH 2/4] Rename leakcanary-android-core to leakcanary-android-debug --- .github/workflows/main.yml | 2 +- docs/changelog.md | 4 ++-- docs/dev-env.md | 6 +++--- docs/upgrading-to-leakcanary-2.0.md | 2 +- .../leakcanary-android-core/gradle.properties | 3 --- .../api/leakcanary-android-debug.api} | 2 +- .../build.gradle | 6 +++--- .../consumer-proguard-rules.pro | 0 .../leakcanary-android-debug/gradle.properties | 3 +++ .../lint.xml | 0 .../src/androidTest/AndroidManifest.xml | 0 .../src/androidTest/assets/leaks-v24.db | Bin .../java/leakcanary/AndroidExtensionsTest.kt | 0 .../java/leakcanary/DatabaseMigrationTest.kt | 0 .../src/androidTest/java/leakcanary/DatabaseRule.kt | 0 .../androidTest/java/leakcanary/LeakActivityTest.kt | 2 +- .../java/leakcanary/ManualInstallTest.kt | 0 .../src/main/AndroidManifest.xml | 0 .../src/main/ic_launcher-web.png | Bin .../main/java/leakcanary/AndroidDebugHeapDumper.kt | 0 .../java/leakcanary/BackgroundThreadHeapAnalyzer.kt | 0 .../src/main/java/leakcanary/EventListener.kt | 0 .../java/leakcanary/LazyForwardingEventListener.kt | 0 .../src/main/java/leakcanary/LeakCanary.kt | 0 .../leakcanary/LeakCanaryAndroidInternalUtils.kt | 2 +- .../src/main/java/leakcanary/LogcatEventListener.kt | 0 .../java/leakcanary/NotificationEventListener.kt | 2 +- .../leakcanary/RemoteWorkManagerHeapAnalyzer.kt | 0 .../src/main/java/leakcanary/ToastEventListener.kt | 2 +- .../src/main/java/leakcanary/TvEventListener.kt | 2 +- .../main/java/leakcanary/WorkManagerHeapAnalyzer.kt | 0 .../leakcanary/internal/AndroidDebugHeapAnalyzer.kt | 0 .../java/leakcanary/internal/DebuggerControl.kt | 0 .../java/leakcanary/internal/DisplayLeakAdapter.kt | 2 +- .../leakcanary/internal/DisplayLeakConnectorView.kt | 2 +- .../java/leakcanary/internal/HeapAnalyzerWorker.kt | 2 +- .../java/leakcanary/internal/HeapDumpControl.kt | 2 +- .../java/leakcanary/internal/HeapDumpTrigger.kt | 2 +- .../java/leakcanary/internal/InternalLeakCanary.kt | 4 ++-- .../java/leakcanary/internal/LazyImmediateFuture.kt | 0 .../leakcanary/internal/LeakCanaryFileProvider.kt | 0 .../internal/LeakCanarySingleThreadFactory.kt | 0 .../java/leakcanary/internal/LeakCanaryTextView.kt | 0 .../leakcanary/internal/LeakDirectoryProvider.kt | 2 +- .../leakcanary/internal/NotificationReceiver.kt | 0 .../java/leakcanary/internal/NotificationType.kt | 4 ++-- .../main/java/leakcanary/internal/Notifications.kt | 2 +- .../leakcanary/internal/OnRetainInstanceListener.kt | 0 .../leakcanary/internal/RemoteHeapAnalyzerWorker.kt | 0 .../internal/RequestPermissionActivity.kt | 2 +- .../java/leakcanary/internal/RowElementLayout.kt | 2 +- .../java/leakcanary/internal/SerializableIntent.kt | 0 .../main/java/leakcanary/internal/Serializables.kt | 0 .../main/java/leakcanary/internal/SquigglySpan.kt | 2 +- .../leakcanary/internal/SquigglySpanRenderer.kt | 2 +- .../java/leakcanary/internal/VisibilityTracker.kt | 0 .../leakcanary/internal/activity/LeakActivity.kt | 2 +- .../java/leakcanary/internal/activity/LeakViews.kt | 4 ++-- .../java/leakcanary/internal/activity/db/Cursors.kt | 0 .../main/java/leakcanary/internal/activity/db/Db.kt | 0 .../internal/activity/db/HeapAnalysisTable.kt | 0 .../main/java/leakcanary/internal/activity/db/Io.kt | 0 .../leakcanary/internal/activity/db/LeakTable.kt | 0 .../internal/activity/db/LeakTraceTable.kt | 0 .../internal/activity/db/LeaksDbHelper.kt | 0 .../internal/activity/db/ScopedLeaksDb.kt | 0 .../internal/activity/screen/AboutScreen.kt | 4 ++-- .../activity/screen/HeapAnalysisFailureScreen.kt | 2 +- .../internal/activity/screen/HeapDumpRenderer.kt | 2 +- .../internal/activity/screen/HeapDumpScreen.kt | 2 +- .../internal/activity/screen/HeapDumpsScreen.kt | 2 +- .../internal/activity/screen/HprofExplorerScreen.kt | 2 +- .../internal/activity/screen/LeakScreen.kt | 2 +- .../internal/activity/screen/LeakTraceWrapper.kt | 0 .../internal/activity/screen/LeaksScreen.kt | 2 +- .../activity/screen/RenderHeapDumpScreen.kt | 2 +- .../internal/activity/ui/SimpleListAdapter.kt | 0 .../internal/activity/ui/TimeFormatter.kt | 0 .../java/leakcanary/internal/activity/ui/UiUtils.kt | 0 .../java/leakcanary/internal/friendly/Friendly.kt | 2 +- .../internal/navigation/BackstackFrame.kt | 2 +- .../internal/navigation/NavigatingActivity.kt | 2 +- .../java/leakcanary/internal/navigation/Screen.kt | 0 .../java/leakcanary/internal/navigation/Views.kt | 2 +- .../internal/tv/TvOnRetainInstanceListener.kt | 2 +- .../src/main/java/leakcanary/internal/tv/TvToast.kt | 2 +- .../src/main/java/leakcanary/internal/utils/Size.kt | 0 .../main/java/leakcanary/internal/utils/Tuples.kt | 0 .../src/main/res/anim/leak_canary_enter_alpha.xml | 0 .../main/res/anim/leak_canary_enter_backward.xml | 0 .../src/main/res/anim/leak_canary_enter_forward.xml | 0 .../src/main/res/anim/leak_canary_exit_alpha.xml | 0 .../src/main/res/anim/leak_canary_exit_backward.xml | 0 .../src/main/res/anim/leak_canary_exit_forward.xml | 0 .../src/main/res/color/leak_canary_bottom_menu.xml | 0 .../src/main/res/color/leak_canary_count_text.xml | 0 .../main/res/drawable-v21/leak_canary_gray_fill.xml | 0 .../res/drawable-v21/leak_canary_list_selector.xml | 0 .../res/drawable-v21/leak_canary_primary_button.xml | 0 .../drawable-v21/leak_canary_secondary_button.xml | 0 .../res/drawable-v21/leak_canary_tab_background.xml | 0 .../leak_canary_tab_selector_ripple.xml | 0 .../res/drawable/leak_canary_count_background.xml | 0 .../src/main/res/drawable/leak_canary_dump.xml | 0 .../src/main/res/drawable/leak_canary_gray_fill.xml | 0 .../src/main/res/drawable/leak_canary_icon.xml | 0 .../res/drawable/leak_canary_icon_foreground.xml | 0 .../res/drawable/leak_canary_icon_monochrome.xml | 0 .../src/main/res/drawable/leak_canary_info.xml | 0 .../res/drawable/leak_canary_info_rectangle.xml | 0 .../src/main/res/drawable/leak_canary_leak.xml | 0 .../main/res/drawable/leak_canary_list_selector.xml | 0 .../res/drawable/leak_canary_primary_button.xml | 0 .../res/drawable/leak_canary_secondary_button.xml | 0 .../res/drawable/leak_canary_tab_background.xml | 0 .../res/drawable/leak_canary_toast_background.xml | 0 .../src/main/res/drawable/leak_canary_tv_icon.xml | 0 .../main/res/layout/leak_canary_about_screen.xml | 0 .../leak_canary_heap_analysis_failure_screen.xml | 0 .../res/layout/leak_canary_heap_dump_leak_title.xml | 0 .../main/res/layout/leak_canary_heap_dump_toast.xml | 0 .../res/layout/leak_canary_heap_dumps_screen.xml | 0 .../src/main/res/layout/leak_canary_heap_render.xml | 0 .../main/res/layout/leak_canary_hprof_explorer.xml | 0 .../main/res/layout/leak_canary_leak_activity.xml | 0 .../src/main/res/layout/leak_canary_leak_chips.xml | 0 .../src/main/res/layout/leak_canary_leak_header.xml | 0 .../src/main/res/layout/leak_canary_leak_row.xml | 0 .../src/main/res/layout/leak_canary_leak_screen.xml | 0 .../src/main/res/layout/leak_canary_list.xml | 0 .../src/main/res/layout/leak_canary_ref_row.xml | 0 .../src/main/res/layout/leak_canary_simple_row.xml | 0 .../main/res/mipmap-anydpi-v26/leak_canary_icon.xml | 0 .../src/main/res/mipmap-hdpi/leak_canary_icon.png | Bin .../src/main/res/mipmap-mdpi/leak_canary_icon.png | Bin .../src/main/res/mipmap-xhdpi/leak_canary_icon.png | Bin .../src/main/res/mipmap-xxhdpi/leak_canary_icon.png | Bin .../main/res/mipmap-xxxhdpi/leak_canary_icon.png | Bin .../src/main/res/values-v21/leak_canary_themes.xml | 0 .../src/main/res/values/leak_canary_attrs.xml | 0 .../src/main/res/values/leak_canary_bools.xml | 0 .../src/main/res/values/leak_canary_colors.xml | 0 .../src/main/res/values/leak_canary_dimens.xml | 0 .../src/main/res/values/leak_canary_ids.xml | 0 .../src/main/res/values/leak_canary_public.xml | 0 .../src/main/res/values/leak_canary_strings.xml | 0 .../src/main/res/values/leak_canary_themes.xml | 0 .../src/main/res/xml/leak_canary_file_paths.xml | 0 .../test/java/leakcanary/LeakCanaryConfigTest.kt | 0 .../activity/screen/LeakTraceWrapperTest.kt | 0 .../leakcanary-android-instrumentation/build.gradle | 2 +- leakcanary/leakcanary-android-startup/build.gradle | 2 +- leakcanary/leakcanary-android/build.gradle | 2 +- leakcanary/leakcanary-app-service/build.gradle | 2 +- settings.gradle | 2 +- shark/shark-android/api/shark-android.api | 1 + 156 files changed, 59 insertions(+), 58 deletions(-) delete mode 100644 leakcanary/leakcanary-android-core/gradle.properties rename leakcanary/{leakcanary-android-core/api/leakcanary-android-core.api => leakcanary-android-debug/api/leakcanary-android-debug.api} (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/build.gradle (92%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/consumer-proguard-rules.pro (100%) create mode 100644 leakcanary/leakcanary-android-debug/gradle.properties rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/lint.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/androidTest/AndroidManifest.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/androidTest/assets/leaks-v24.db (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/androidTest/java/leakcanary/AndroidExtensionsTest.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/androidTest/java/leakcanary/DatabaseMigrationTest.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/androidTest/java/leakcanary/DatabaseRule.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/androidTest/java/leakcanary/LeakActivityTest.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/androidTest/java/leakcanary/ManualInstallTest.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/AndroidManifest.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/ic_launcher-web.png (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/AndroidDebugHeapDumper.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/BackgroundThreadHeapAnalyzer.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/EventListener.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/LazyForwardingEventListener.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/LeakCanary.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/LeakCanaryAndroidInternalUtils.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/LogcatEventListener.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/NotificationEventListener.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/RemoteWorkManagerHeapAnalyzer.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/ToastEventListener.kt (98%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/TvEventListener.kt (98%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/WorkManagerHeapAnalyzer.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/AndroidDebugHeapAnalyzer.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/DebuggerControl.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/DisplayLeakAdapter.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/DisplayLeakConnectorView.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/HeapAnalyzerWorker.kt (97%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/HeapDumpControl.kt (98%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/HeapDumpTrigger.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/InternalLeakCanary.kt (98%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/LazyImmediateFuture.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/LeakCanaryFileProvider.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/LeakCanarySingleThreadFactory.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/LeakCanaryTextView.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/LeakDirectoryProvider.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/NotificationReceiver.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/NotificationType.kt (81%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/Notifications.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/OnRetainInstanceListener.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/RemoteHeapAnalyzerWorker.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/RequestPermissionActivity.kt (98%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/RowElementLayout.kt (98%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/SerializableIntent.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/Serializables.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/SquigglySpan.kt (97%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/SquigglySpanRenderer.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/VisibilityTracker.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/LeakActivity.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/LeakViews.kt (97%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/db/Cursors.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/db/Db.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/db/HeapAnalysisTable.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/db/Io.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/db/LeakTable.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/db/LeakTraceTable.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/db/LeaksDbHelper.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/db/ScopedLeaksDb.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/screen/AboutScreen.kt (96%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/screen/HeapAnalysisFailureScreen.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/screen/HeapDumpRenderer.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/screen/HeapDumpScreen.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/screen/HeapDumpsScreen.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/screen/HprofExplorerScreen.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/screen/LeakScreen.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/screen/LeakTraceWrapper.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/screen/LeaksScreen.kt (98%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/screen/RenderHeapDumpScreen.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/ui/SimpleListAdapter.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/ui/TimeFormatter.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/activity/ui/UiUtils.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/friendly/Friendly.kt (91%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/navigation/BackstackFrame.kt (97%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/navigation/NavigatingActivity.kt (99%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/navigation/Screen.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/navigation/Views.kt (97%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/tv/TvOnRetainInstanceListener.kt (98%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/tv/TvToast.kt (97%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/utils/Size.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/java/leakcanary/internal/utils/Tuples.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/anim/leak_canary_enter_alpha.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/anim/leak_canary_enter_backward.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/anim/leak_canary_enter_forward.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/anim/leak_canary_exit_alpha.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/anim/leak_canary_exit_backward.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/anim/leak_canary_exit_forward.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/color/leak_canary_bottom_menu.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/color/leak_canary_count_text.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable-v21/leak_canary_gray_fill.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable-v21/leak_canary_list_selector.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable-v21/leak_canary_primary_button.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable-v21/leak_canary_secondary_button.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable-v21/leak_canary_tab_background.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable-v21/leak_canary_tab_selector_ripple.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_count_background.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_dump.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_gray_fill.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_icon.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_icon_foreground.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_icon_monochrome.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_info.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_info_rectangle.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_leak.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_list_selector.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_primary_button.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_secondary_button.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_tab_background.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_toast_background.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/drawable/leak_canary_tv_icon.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_about_screen.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_heap_analysis_failure_screen.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_heap_dump_leak_title.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_heap_dump_toast.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_heap_dumps_screen.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_heap_render.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_hprof_explorer.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_leak_activity.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_leak_chips.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_leak_header.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_leak_row.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_leak_screen.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_list.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_ref_row.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/layout/leak_canary_simple_row.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/mipmap-anydpi-v26/leak_canary_icon.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/mipmap-hdpi/leak_canary_icon.png (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/mipmap-mdpi/leak_canary_icon.png (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/mipmap-xhdpi/leak_canary_icon.png (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/mipmap-xxhdpi/leak_canary_icon.png (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/mipmap-xxxhdpi/leak_canary_icon.png (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/values-v21/leak_canary_themes.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/values/leak_canary_attrs.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/values/leak_canary_bools.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/values/leak_canary_colors.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/values/leak_canary_dimens.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/values/leak_canary_ids.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/values/leak_canary_public.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/values/leak_canary_strings.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/values/leak_canary_themes.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/main/res/xml/leak_canary_file_paths.xml (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/test/java/leakcanary/LeakCanaryConfigTest.kt (100%) rename leakcanary/{leakcanary-android-core => leakcanary-android-debug}/src/test/java/leakcanary/internal/activity/screen/LeakTraceWrapperTest.kt (100%) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4bfe43cf5..06638250c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -98,7 +98,7 @@ jobs: touch emulator.log # create log file chmod 777 emulator.log # allow writing to log file adb logcat >> emulator.log & # pipe all logcat messages into log file as a background process - ./gradlew leakcanary:leakcanary-android-core:connectedCheck leakcanary:leakcanary-android:connectedCheck leakcanary:leakcanary-android-instrumentation:connectedCheck --no-build-cache --no-daemon --stacktrace + ./gradlew leakcanary:leakcanary-android-debug:connectedCheck leakcanary:leakcanary-android:connectedCheck leakcanary:leakcanary-android-instrumentation:connectedCheck --no-build-cache --no-daemon --stacktrace - name: Upload results if: ${{ always() }} uses: actions/upload-artifact@v3 diff --git a/docs/changelog.md b/docs/changelog.md index 53c3954aa..ff9f72047 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -563,7 +563,7 @@ dependencies { } ``` -Note 1: `leakcanary-android` adds the code for automatic installl to `leakcanary-android-core`. If you're calling `AppWatcher.manualInstall()`, you can depend directly on `leakcanary-android-core` instead of `leakcanary-android`, and you won't need the disable any automatic install. +Note 1: `leakcanary-android` adds the code for automatic install to `leakcanary-android-core`. If you're calling `AppWatcher.manualInstall()`, you can depend directly on `leakcanary-android-core` instead of `leakcanary-android`, and you won't need the disable any automatic install. Note 2: the same principle applies to `leakcanary-object-watcher-android`: it depends on `leakcanary-object-watcher-android-core` and adds automatic install, while `leakcanary-object-watcher-android-startup` leverages the App Startup library. Same for `plumber-android`, `plumber-android-core` and `plumber-android-startup`. @@ -1432,7 +1432,7 @@ For more details, see the [2.0-beta-2 Milestone](https://github.com/square/leakc * New standalone library! [Shark](shark.md) is the heap analyzer that powers LeakCanary 2, and it can run in any Java VM. It comes with a [CLI](shark.md#shark-cli): you can now run `shark-cli analyze-process com.example.myapp` from your computer. * New Heap Explorer directly on device! Open a Heap Analysis in LeakCanary, tap the options menu and select "Heap Explorer". This is still experimental and not very user friendly, contributions welcome! -* **Large API rewrite** to improve usability. If you used the alpha with a customized configuration, there are breaking changes. Of note: LeakSentry became [AppWatcher](/leakcanary/api/leakcanary-object-watcher-android/leakcanary/-app-watcher/), RefWatcher became [ObjectWatcher](/leakcanary/api/leakcanary-object-watcher/leakcanary/-object-watcher/), AndroidExcludedRefs became [AndroidReferenceMatchers](/leakcanary/api/shark-android/shark/-android-reference-matchers/), AnalysisResultListener became [OnHeapAnalyzedListener](/leakcanary/api/leakcanary-android-core/leakcanary/-on-heap-analyzed-listener/), AndroidLeakTraceInspectors became [AndroidObjectInspectors](/leakcanary/api/shark-android/shark/-android-object-inspectors/). +* **Large API rewrite** to improve usability. If you used the alpha with a customized configuration, there are breaking changes. Of note: LeakSentry became [AppWatcher](/leakcanary/api/leakcanary-object-watcher-android/leakcanary/-app-watcher/), RefWatcher became [ObjectWatcher](/leakcanary/api/leakcanary-object-watcher/leakcanary/-object-watcher/), AndroidExcludedRefs became [AndroidReferenceMatchers](/leakcanary/api/shark-android/shark/-android-reference-matchers/), AnalysisResultListener became [OnHeapAnalyzedListener](/leakcanary/api/leakcanary-android-debug/leakcanary/-on-heap-analyzed-listener/), AndroidLeakTraceInspectors became [AndroidObjectInspectors](/leakcanary/api/shark-android/shark/-android-object-inspectors/). * The entire API surface is now documented and the documentation is available on this website: see the **LeakCanary API** tab at the top. * Removed the **dependency on Android X**. No more configuration issues! [#1462](https://github.com/square/leakcanary/issues/1462) * Added **Proguard rules** for LeakCanary and ObjectWatcher. [#1500](https://github.com/square/leakcanary/pull/1500) diff --git a/docs/dev-env.md b/docs/dev-env.md index b4d4afa8f..48c6d7681 100644 --- a/docs/dev-env.md +++ b/docs/dev-env.md @@ -5,13 +5,13 @@ * We use two spaces code indentation, use `SquareAndroid` code style settings from https://github.com/square/java-code-styles. * Build with `./gradlew build`. * Running the failing UI tests to confirm leak detection correctly fails UI tests: `./gradlew leakcanary-android-sample:connectedCheck`. -* Normal UI tests: `./gradlew leakcanary-android-core:connectedCheck`. +* Normal UI tests: `./gradlew leakcanary-android-debug:connectedCheck`. -## Static Code Analysis +## Static Code Analysis * LeakCanary [uses](https://github.com/square/leakcanary/pull/1535) [Detekt](https://arturbosch.github.io/detekt/) for static Code analysis. * Analyze the entire project with `./gradlew check` or particular modules with `./gradlew :module-name:check`. Detekt will fail the build if any ruleset violations are found. **You should fix all issues before pushing the branch to remote**. * There's also a **git pre-push** hook that will run analysis automatically before pushing a branch to the remote. If there are any violations - it will prevent the push. Fix the issues! - * You can bypass the git hook though; Travis CI will still run checks and will fail if any violations are found. + * You can bypass the git hook though; Travis CI will still run checks and will fail if any violations are found. * Detekt report will be printed in the console and saved to `/moduleDir/build/reports/`. ## Deploying locally diff --git a/docs/upgrading-to-leakcanary-2.0.md b/docs/upgrading-to-leakcanary-2.0.md index 4a473558b..8aacf4eba 100644 --- a/docs/upgrading-to-leakcanary-2.0.md +++ b/docs/upgrading-to-leakcanary-2.0.md @@ -150,7 +150,7 @@ class DebugExampleApplication : ExampleApplication() { } ``` -LeakCanary is in charge of taking heap dumps and analyzing them. Its configuration can be updated at any time by replacing [LeakCanary.config](/leakcanary/api/leakcanary-android-core/leakcanary/-leak-canary/config/): +LeakCanary is in charge of taking heap dumps and analyzing them. Its configuration can be updated at any time by replacing [LeakCanary.config](/leakcanary/api/leakcanary-android-debug/leakcanary/-leak-canary/config/): ```kotlin disableLeakCanaryButton.setOnClickListener { diff --git a/leakcanary/leakcanary-android-core/gradle.properties b/leakcanary/leakcanary-android-core/gradle.properties deleted file mode 100644 index f11d5355d..000000000 --- a/leakcanary/leakcanary-android-core/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -POM_ARTIFACT_ID=leakcanary-android-core -POM_NAME=LeakCanary for Android - Core -POM_PACKAGING=aar diff --git a/leakcanary/leakcanary-android-core/api/leakcanary-android-core.api b/leakcanary/leakcanary-android-debug/api/leakcanary-android-debug.api similarity index 99% rename from leakcanary/leakcanary-android-core/api/leakcanary-android-core.api rename to leakcanary/leakcanary-android-debug/api/leakcanary-android-debug.api index c4370065a..6dc070b96 100644 --- a/leakcanary/leakcanary-android-core/api/leakcanary-android-core.api +++ b/leakcanary/leakcanary-android-debug/api/leakcanary-android-debug.api @@ -1,4 +1,4 @@ -public final class com/squareup/leakcanary/core/BuildConfig { +public final class com/squareup/leakcanary/debug/BuildConfig { public static final field BUILD_TYPE Ljava/lang/String; public static final field DEBUG Z public static final field GIT_SHA Ljava/lang/String; diff --git a/leakcanary/leakcanary-android-core/build.gradle b/leakcanary/leakcanary-android-debug/build.gradle similarity index 92% rename from leakcanary/leakcanary-android-core/build.gradle rename to leakcanary/leakcanary-android-debug/build.gradle index 0c9c92ec9..208c07b85 100644 --- a/leakcanary/leakcanary-android-core/build.gradle +++ b/leakcanary/leakcanary-android-debug/build.gradle @@ -8,7 +8,7 @@ dependencies { api projects.shark.sharkAndroid api projects.objectWatcher.objectWatcherAndroidCore api projects.objectWatcher.objectWatcherAndroidAndroidx - api projects.leakcanary.leakcanaryCore + api projects.leakcanary.leakcanaryAndroidCore implementation libs.kotlin.stdlib // Optional dependency @@ -49,8 +49,8 @@ android { execution 'ANDROIDX_TEST_ORCHESTRATOR' } } - namespace 'com.squareup.leakcanary.core' - testNamespace 'com.squareup.leakcanary.core.test' + namespace 'com.squareup.leakcanary.debug' + testNamespace 'com.squareup.leakcanary.debug.test' lint { checkOnly 'Interoperability' disable 'GoogleAppIndexingWarning' diff --git a/leakcanary/leakcanary-android-core/consumer-proguard-rules.pro b/leakcanary/leakcanary-android-debug/consumer-proguard-rules.pro similarity index 100% rename from leakcanary/leakcanary-android-core/consumer-proguard-rules.pro rename to leakcanary/leakcanary-android-debug/consumer-proguard-rules.pro diff --git a/leakcanary/leakcanary-android-debug/gradle.properties b/leakcanary/leakcanary-android-debug/gradle.properties new file mode 100644 index 000000000..3132f8a24 --- /dev/null +++ b/leakcanary/leakcanary-android-debug/gradle.properties @@ -0,0 +1,3 @@ +POM_ARTIFACT_ID=leakcanary-android-debug +POM_NAME=LeakCanary for Android Debug - Core +POM_PACKAGING=aar diff --git a/leakcanary/leakcanary-android-core/lint.xml b/leakcanary/leakcanary-android-debug/lint.xml similarity index 100% rename from leakcanary/leakcanary-android-core/lint.xml rename to leakcanary/leakcanary-android-debug/lint.xml diff --git a/leakcanary/leakcanary-android-core/src/androidTest/AndroidManifest.xml b/leakcanary/leakcanary-android-debug/src/androidTest/AndroidManifest.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/androidTest/AndroidManifest.xml rename to leakcanary/leakcanary-android-debug/src/androidTest/AndroidManifest.xml diff --git a/leakcanary/leakcanary-android-core/src/androidTest/assets/leaks-v24.db b/leakcanary/leakcanary-android-debug/src/androidTest/assets/leaks-v24.db similarity index 100% rename from leakcanary/leakcanary-android-core/src/androidTest/assets/leaks-v24.db rename to leakcanary/leakcanary-android-debug/src/androidTest/assets/leaks-v24.db diff --git a/leakcanary/leakcanary-android-core/src/androidTest/java/leakcanary/AndroidExtensionsTest.kt b/leakcanary/leakcanary-android-debug/src/androidTest/java/leakcanary/AndroidExtensionsTest.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/androidTest/java/leakcanary/AndroidExtensionsTest.kt rename to leakcanary/leakcanary-android-debug/src/androidTest/java/leakcanary/AndroidExtensionsTest.kt diff --git a/leakcanary/leakcanary-android-core/src/androidTest/java/leakcanary/DatabaseMigrationTest.kt b/leakcanary/leakcanary-android-debug/src/androidTest/java/leakcanary/DatabaseMigrationTest.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/androidTest/java/leakcanary/DatabaseMigrationTest.kt rename to leakcanary/leakcanary-android-debug/src/androidTest/java/leakcanary/DatabaseMigrationTest.kt diff --git a/leakcanary/leakcanary-android-core/src/androidTest/java/leakcanary/DatabaseRule.kt b/leakcanary/leakcanary-android-debug/src/androidTest/java/leakcanary/DatabaseRule.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/androidTest/java/leakcanary/DatabaseRule.kt rename to leakcanary/leakcanary-android-debug/src/androidTest/java/leakcanary/DatabaseRule.kt diff --git a/leakcanary/leakcanary-android-core/src/androidTest/java/leakcanary/LeakActivityTest.kt b/leakcanary/leakcanary-android-debug/src/androidTest/java/leakcanary/LeakActivityTest.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/androidTest/java/leakcanary/LeakActivityTest.kt rename to leakcanary/leakcanary-android-debug/src/androidTest/java/leakcanary/LeakActivityTest.kt index d27919806..63fbf8c97 100644 --- a/leakcanary/leakcanary-android-core/src/androidTest/java/leakcanary/LeakActivityTest.kt +++ b/leakcanary/leakcanary-android-debug/src/androidTest/java/leakcanary/LeakActivityTest.kt @@ -9,7 +9,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.platform.app.InstrumentationRegistry import androidx.test.rule.ActivityTestRule -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import java.io.File import leakcanary.internal.activity.LeakActivity import leakcanary.internal.activity.db.HeapAnalysisTable diff --git a/leakcanary/leakcanary-android-core/src/androidTest/java/leakcanary/ManualInstallTest.kt b/leakcanary/leakcanary-android-debug/src/androidTest/java/leakcanary/ManualInstallTest.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/androidTest/java/leakcanary/ManualInstallTest.kt rename to leakcanary/leakcanary-android-debug/src/androidTest/java/leakcanary/ManualInstallTest.kt diff --git a/leakcanary/leakcanary-android-core/src/main/AndroidManifest.xml b/leakcanary/leakcanary-android-debug/src/main/AndroidManifest.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/AndroidManifest.xml rename to leakcanary/leakcanary-android-debug/src/main/AndroidManifest.xml diff --git a/leakcanary/leakcanary-android-core/src/main/ic_launcher-web.png b/leakcanary/leakcanary-android-debug/src/main/ic_launcher-web.png similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/ic_launcher-web.png rename to leakcanary/leakcanary-android-debug/src/main/ic_launcher-web.png diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/AndroidDebugHeapDumper.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/AndroidDebugHeapDumper.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/AndroidDebugHeapDumper.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/AndroidDebugHeapDumper.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/BackgroundThreadHeapAnalyzer.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/BackgroundThreadHeapAnalyzer.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/BackgroundThreadHeapAnalyzer.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/BackgroundThreadHeapAnalyzer.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/EventListener.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/EventListener.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/EventListener.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/EventListener.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/LazyForwardingEventListener.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/LazyForwardingEventListener.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/LazyForwardingEventListener.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/LazyForwardingEventListener.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/LeakCanary.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/LeakCanary.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/LeakCanary.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/LeakCanary.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/LeakCanaryAndroidInternalUtils.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/LeakCanaryAndroidInternalUtils.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/LeakCanaryAndroidInternalUtils.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/LeakCanaryAndroidInternalUtils.kt index b56804c3f..8cbc5c5a3 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/LeakCanaryAndroidInternalUtils.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/LeakCanaryAndroidInternalUtils.kt @@ -9,7 +9,7 @@ import android.content.pm.ShortcutManager import android.graphics.drawable.Icon import android.os.Build.VERSION import android.os.Build.VERSION_CODES -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import shark.SharkLog internal object LeakCanaryAndroidInternalUtils { diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/LogcatEventListener.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/LogcatEventListener.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/LogcatEventListener.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/LogcatEventListener.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/NotificationEventListener.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/NotificationEventListener.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/NotificationEventListener.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/NotificationEventListener.kt index c13213d07..91fc01ffa 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/NotificationEventListener.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/NotificationEventListener.kt @@ -5,7 +5,7 @@ import android.app.NotificationManager import android.app.PendingIntent import android.content.Context import android.os.Build -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.EventListener.Event import leakcanary.EventListener.Event.DumpingHeap import leakcanary.EventListener.Event.HeapAnalysisDone diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/RemoteWorkManagerHeapAnalyzer.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/RemoteWorkManagerHeapAnalyzer.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/RemoteWorkManagerHeapAnalyzer.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/RemoteWorkManagerHeapAnalyzer.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/ToastEventListener.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/ToastEventListener.kt similarity index 98% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/ToastEventListener.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/ToastEventListener.kt index 53b13b44e..d5e31ae39 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/ToastEventListener.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/ToastEventListener.kt @@ -6,7 +6,7 @@ import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.widget.Toast -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit.SECONDS import leakcanary.EventListener.Event diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/TvEventListener.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/TvEventListener.kt similarity index 98% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/TvEventListener.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/TvEventListener.kt index 716b3d4fd..7cd106667 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/TvEventListener.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/TvEventListener.kt @@ -1,6 +1,6 @@ package leakcanary -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.EventListener.Event import leakcanary.EventListener.Event.HeapAnalysisDone import leakcanary.internal.InternalLeakCanary diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/WorkManagerHeapAnalyzer.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/WorkManagerHeapAnalyzer.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/WorkManagerHeapAnalyzer.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/WorkManagerHeapAnalyzer.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/AndroidDebugHeapAnalyzer.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/AndroidDebugHeapAnalyzer.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/AndroidDebugHeapAnalyzer.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/AndroidDebugHeapAnalyzer.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/DebuggerControl.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/DebuggerControl.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/DebuggerControl.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/DebuggerControl.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/DisplayLeakAdapter.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/DisplayLeakAdapter.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/DisplayLeakAdapter.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/DisplayLeakAdapter.kt index 377b85676..3ac7aed30 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/DisplayLeakAdapter.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/DisplayLeakAdapter.kt @@ -23,7 +23,7 @@ import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter import android.widget.TextView -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.internal.DisplayLeakConnectorView.Type import leakcanary.internal.DisplayLeakConnectorView.Type.END import leakcanary.internal.DisplayLeakConnectorView.Type.END_FIRST_UNREACHABLE diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/DisplayLeakConnectorView.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/DisplayLeakConnectorView.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/DisplayLeakConnectorView.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/DisplayLeakConnectorView.kt index 4219bb8b5..2ba70ecb3 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/DisplayLeakConnectorView.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/DisplayLeakConnectorView.kt @@ -26,7 +26,7 @@ import android.graphics.PorterDuff.Mode.CLEAR import android.graphics.PorterDuffXfermode import android.util.AttributeSet import android.view.View -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.internal.DisplayLeakConnectorView.Type.END import leakcanary.internal.DisplayLeakConnectorView.Type.END_FIRST_UNREACHABLE import leakcanary.internal.DisplayLeakConnectorView.Type.GC_ROOT diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/HeapAnalyzerWorker.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/HeapAnalyzerWorker.kt similarity index 97% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/HeapAnalyzerWorker.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/HeapAnalyzerWorker.kt index a4b69cca9..1a3248917 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/HeapAnalyzerWorker.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/HeapAnalyzerWorker.kt @@ -7,7 +7,7 @@ import androidx.work.ForegroundInfo import androidx.work.Worker import androidx.work.WorkerParameters import com.google.common.util.concurrent.ListenableFuture -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.EventListener.Event internal class HeapAnalyzerWorker( diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/HeapDumpControl.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/HeapDumpControl.kt similarity index 98% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/HeapDumpControl.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/HeapDumpControl.kt index 2e0461d91..f5a668c5f 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/HeapDumpControl.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/HeapDumpControl.kt @@ -3,7 +3,7 @@ package leakcanary.internal import android.app.Application import android.os.Handler import android.os.HandlerThread -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.AppWatcher import leakcanary.LeakCanary import leakcanary.internal.HeapDumpControl.ICanHazHeap.Nope diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/HeapDumpTrigger.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/HeapDumpTrigger.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/HeapDumpTrigger.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/HeapDumpTrigger.kt index 0d8915bfa..4fd55059b 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/HeapDumpTrigger.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/HeapDumpTrigger.kt @@ -7,7 +7,7 @@ import android.content.Context import android.content.res.Resources.NotFoundException import android.os.Handler import android.os.SystemClock -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import java.util.UUID import kotlin.time.Duration.Companion.milliseconds import leakcanary.AppWatcher diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/InternalLeakCanary.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/InternalLeakCanary.kt similarity index 98% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/InternalLeakCanary.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/InternalLeakCanary.kt index 57f29fc6b..29f5bde82 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/InternalLeakCanary.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/InternalLeakCanary.kt @@ -14,8 +14,8 @@ import android.content.pm.PackageManager.DONT_KILL_APP import android.content.res.Configuration import android.os.Handler import android.os.HandlerThread -import com.squareup.leakcanary.core.BuildConfig -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.BuildConfig +import com.squareup.leakcanary.debug.R import leakcanary.AppWatcher import leakcanary.EventListener.Event import leakcanary.GcTrigger diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/LazyImmediateFuture.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/LazyImmediateFuture.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/LazyImmediateFuture.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/LazyImmediateFuture.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/LeakCanaryFileProvider.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/LeakCanaryFileProvider.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/LeakCanaryFileProvider.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/LeakCanaryFileProvider.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/LeakCanarySingleThreadFactory.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/LeakCanarySingleThreadFactory.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/LeakCanarySingleThreadFactory.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/LeakCanarySingleThreadFactory.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/LeakCanaryTextView.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/LeakCanaryTextView.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/LeakCanaryTextView.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/LeakCanaryTextView.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/LeakDirectoryProvider.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/LeakDirectoryProvider.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/LeakDirectoryProvider.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/LeakDirectoryProvider.kt index 057d01164..9b3db8366 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/LeakDirectoryProvider.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/LeakDirectoryProvider.kt @@ -23,7 +23,7 @@ import android.os.Build.VERSION.SDK_INT import android.os.Build.VERSION_CODES.M import android.os.Environment import android.os.Environment.DIRECTORY_DOWNLOADS -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.internal.NotificationType.LEAKCANARY_LOW import shark.SharkLog import java.io.File diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/NotificationReceiver.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/NotificationReceiver.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/NotificationReceiver.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/NotificationReceiver.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/NotificationType.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/NotificationType.kt similarity index 81% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/NotificationType.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/NotificationType.kt index 149e88229..186c4db0c 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/NotificationType.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/NotificationType.kt @@ -1,6 +1,6 @@ package leakcanary.internal -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R internal enum class NotificationType( val nameResId: Int, @@ -15,4 +15,4 @@ internal enum class NotificationType( } private const val IMPORTANCE_LOW = 2 -private const val IMPORTANCE_MAX = 5 \ No newline at end of file +private const val IMPORTANCE_MAX = 5 diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/Notifications.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/Notifications.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/Notifications.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/Notifications.kt index 5a41a4181..ad9cd2cba 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/Notifications.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/Notifications.kt @@ -24,7 +24,7 @@ import android.content.Context import android.os.Build.VERSION.SDK_INT import android.os.Build.VERSION_CODES.JELLY_BEAN import android.os.Build.VERSION_CODES.O -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.LeakCanary import leakcanary.internal.InternalLeakCanary.FormFactor.MOBILE import shark.SharkLog diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/OnRetainInstanceListener.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/OnRetainInstanceListener.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/OnRetainInstanceListener.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/OnRetainInstanceListener.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/RemoteHeapAnalyzerWorker.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/RemoteHeapAnalyzerWorker.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/RemoteHeapAnalyzerWorker.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/RemoteHeapAnalyzerWorker.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/RequestPermissionActivity.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/RequestPermissionActivity.kt similarity index 98% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/RequestPermissionActivity.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/RequestPermissionActivity.kt index 74b47eefa..d16921f04 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/RequestPermissionActivity.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/RequestPermissionActivity.kt @@ -29,7 +29,7 @@ import android.os.Bundle import android.os.Build import android.widget.Toast import android.widget.Toast.LENGTH_LONG -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R @TargetApi(Build.VERSION_CODES.M) // internal class RequestPermissionActivity : Activity() { diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/RowElementLayout.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/RowElementLayout.kt similarity index 98% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/RowElementLayout.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/RowElementLayout.kt index 78eebe588..1910170f1 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/RowElementLayout.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/RowElementLayout.kt @@ -19,7 +19,7 @@ import android.content.Context import android.util.AttributeSet import android.view.View import android.view.ViewGroup -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import kotlin.math.max internal class RowElementLayout( diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/SerializableIntent.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/SerializableIntent.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/SerializableIntent.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/SerializableIntent.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/Serializables.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/Serializables.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/Serializables.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/Serializables.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/SquigglySpan.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/SquigglySpan.kt similarity index 97% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/SquigglySpan.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/SquigglySpan.kt index 213bc306f..cd87f984e 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/SquigglySpan.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/SquigglySpan.kt @@ -20,7 +20,7 @@ import android.text.SpannableStringBuilder import android.text.TextPaint import android.text.style.CharacterStyle import android.text.style.UnderlineSpan -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.internal.navigation.getColorCompat /** diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/SquigglySpanRenderer.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/SquigglySpanRenderer.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/SquigglySpanRenderer.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/SquigglySpanRenderer.kt index 36229b28d..13e57479a 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/SquigglySpanRenderer.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/SquigglySpanRenderer.kt @@ -6,7 +6,7 @@ import android.graphics.Paint import android.graphics.Path import android.os.Build import android.text.Layout -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import kotlin.math.max import kotlin.math.min import kotlin.math.sin diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/VisibilityTracker.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/VisibilityTracker.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/VisibilityTracker.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/VisibilityTracker.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/LeakActivity.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/LeakActivity.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/LeakActivity.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/LeakActivity.kt index 34ef2afbb..fb185ae4b 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/LeakActivity.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/LeakActivity.kt @@ -7,7 +7,7 @@ import android.os.AsyncTask import android.os.Bundle import android.view.View import android.widget.Toast -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import java.io.FileInputStream import java.io.IOException import java.util.UUID diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/LeakViews.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/LeakViews.kt similarity index 97% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/LeakViews.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/LeakViews.kt index 7479ae487..3b15c8d06 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/LeakViews.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/LeakViews.kt @@ -11,8 +11,8 @@ import android.os.AsyncTask import android.os.Build import android.view.View import android.widget.Toast -import com.squareup.leakcanary.core.BuildConfig -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.BuildConfig +import com.squareup.leakcanary.debug.R import leakcanary.internal.LeakCanaryFileProvider import leakcanary.internal.navigation.activity import shark.HeapAnalysisFailure diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/Cursors.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/Cursors.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/Cursors.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/Cursors.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/Db.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/Db.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/Db.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/Db.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/HeapAnalysisTable.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/HeapAnalysisTable.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/HeapAnalysisTable.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/HeapAnalysisTable.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/Io.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/Io.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/Io.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/Io.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/LeakTable.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/LeakTable.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/LeakTable.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/LeakTable.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/LeakTraceTable.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/LeakTraceTable.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/LeakTraceTable.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/LeakTraceTable.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/LeaksDbHelper.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/LeaksDbHelper.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/LeaksDbHelper.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/LeaksDbHelper.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/ScopedLeaksDb.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/ScopedLeaksDb.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/db/ScopedLeaksDb.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/db/ScopedLeaksDb.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/AboutScreen.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/AboutScreen.kt similarity index 96% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/AboutScreen.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/AboutScreen.kt index 5d6540e45..2996d3dbf 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/AboutScreen.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/AboutScreen.kt @@ -5,8 +5,8 @@ import android.text.method.LinkMovementMethod import android.view.ViewGroup import android.widget.Switch import android.widget.TextView -import com.squareup.leakcanary.core.BuildConfig -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.BuildConfig +import com.squareup.leakcanary.debug.R import leakcanary.internal.HeapDumpControl import leakcanary.internal.HeapDumpControl.ICanHazHeap.Nope import leakcanary.internal.HeapDumpControl.ICanHazHeap.Yup diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HeapAnalysisFailureScreen.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HeapAnalysisFailureScreen.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HeapAnalysisFailureScreen.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HeapAnalysisFailureScreen.kt index abf60c7ea..cd3da2974 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HeapAnalysisFailureScreen.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HeapAnalysisFailureScreen.kt @@ -7,7 +7,7 @@ import android.text.method.LinkMovementMethod import android.view.View import android.view.ViewGroup import android.widget.TextView -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import java.util.UUID import leakcanary.EventListener.Event.HeapDump import leakcanary.internal.InternalLeakCanary diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HeapDumpRenderer.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HeapDumpRenderer.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HeapDumpRenderer.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HeapDumpRenderer.kt index 700fb7185..b2e0dfa90 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HeapDumpRenderer.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HeapDumpRenderer.kt @@ -10,7 +10,7 @@ import android.graphics.Paint import android.graphics.Paint.Style.FILL import android.graphics.Paint.Style.STROKE import android.graphics.Rect -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import java.io.File import kotlin.math.ceil import kotlin.math.max diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HeapDumpScreen.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HeapDumpScreen.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HeapDumpScreen.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HeapDumpScreen.kt index 2a55acd77..f080f30d8 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HeapDumpScreen.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HeapDumpScreen.kt @@ -14,7 +14,7 @@ import android.view.ViewGroup import android.widget.BaseAdapter import android.widget.ListView import android.widget.TextView -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.internal.activity.db.HeapAnalysisTable import leakcanary.internal.activity.db.LeakTable import leakcanary.internal.activity.db.executeOnDb diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HeapDumpsScreen.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HeapDumpsScreen.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HeapDumpsScreen.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HeapDumpsScreen.kt index aad43eae0..d0ecc6880 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HeapDumpsScreen.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HeapDumpsScreen.kt @@ -6,7 +6,7 @@ import android.view.View import android.view.ViewGroup import android.widget.ListView import android.widget.TextView -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.LeakCanary import leakcanary.internal.activity.LeakActivity import leakcanary.internal.activity.db.HeapAnalysisTable diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HprofExplorerScreen.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HprofExplorerScreen.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HprofExplorerScreen.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HprofExplorerScreen.kt index 2ec43edaa..0881d82f7 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/HprofExplorerScreen.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/HprofExplorerScreen.kt @@ -9,7 +9,7 @@ import android.widget.EditText import android.widget.ListView import android.widget.TextView import android.widget.Toast -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.internal.activity.db.Io import leakcanary.internal.activity.db.executeOnIo import leakcanary.internal.activity.ui.SimpleListAdapter diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/LeakScreen.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/LeakScreen.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/LeakScreen.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/LeakScreen.kt index d8483006e..9e4d51c24 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/LeakScreen.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/LeakScreen.kt @@ -10,7 +10,7 @@ import android.widget.AdapterView.OnItemSelectedListener import android.widget.ListView import android.widget.Spinner import android.widget.TextView -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.internal.DisplayLeakAdapter import leakcanary.internal.SquigglySpan import leakcanary.internal.activity.db.HeapAnalysisTable diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/LeakTraceWrapper.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/LeakTraceWrapper.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/LeakTraceWrapper.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/LeakTraceWrapper.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/LeaksScreen.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/LeaksScreen.kt similarity index 98% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/LeaksScreen.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/LeaksScreen.kt index 6ef368c99..645352dcb 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/LeaksScreen.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/LeaksScreen.kt @@ -6,7 +6,7 @@ import android.view.View.VISIBLE import android.view.ViewGroup import android.widget.ListView import android.widget.TextView -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.internal.activity.db.HeapAnalysisTable import leakcanary.internal.activity.db.LeakTable import leakcanary.internal.activity.db.LeakTable.AllLeaksProjection diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/RenderHeapDumpScreen.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/RenderHeapDumpScreen.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/RenderHeapDumpScreen.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/RenderHeapDumpScreen.kt index 09a62d5ee..0e80b3182 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/RenderHeapDumpScreen.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/screen/RenderHeapDumpScreen.kt @@ -11,7 +11,7 @@ import android.view.ViewGroup import android.view.ViewTreeObserver.OnGlobalLayoutListener import android.widget.ImageView import android.widget.Toast -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import java.io.File import java.io.FileOutputStream import java.io.IOException diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/ui/SimpleListAdapter.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/ui/SimpleListAdapter.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/ui/SimpleListAdapter.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/ui/SimpleListAdapter.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/ui/TimeFormatter.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/ui/TimeFormatter.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/ui/TimeFormatter.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/ui/TimeFormatter.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/ui/UiUtils.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/ui/UiUtils.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/ui/UiUtils.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/activity/ui/UiUtils.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/friendly/Friendly.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/friendly/Friendly.kt similarity index 91% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/friendly/Friendly.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/friendly/Friendly.kt index db1f83d7d..feba455d5 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/friendly/Friendly.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/friendly/Friendly.kt @@ -1,5 +1,5 @@ @file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "NOTHING_TO_INLINE") -@file:JvmName("leakcanary-android-core_Friendly") +@file:JvmName("leakcanary-android-debug_Friendly") package leakcanary.internal.friendly diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/navigation/BackstackFrame.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/navigation/BackstackFrame.kt similarity index 97% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/navigation/BackstackFrame.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/navigation/BackstackFrame.kt index fc5d1e181..092d5f161 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/navigation/BackstackFrame.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/navigation/BackstackFrame.kt @@ -4,7 +4,7 @@ import android.os.Parcel import android.os.Parcelable import android.util.SparseArray import android.view.View -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R internal class BackstackFrame : Parcelable { diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/navigation/NavigatingActivity.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/navigation/NavigatingActivity.kt similarity index 99% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/navigation/NavigatingActivity.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/navigation/NavigatingActivity.kt index 31e25c5d5..59a984000 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/navigation/NavigatingActivity.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/navigation/NavigatingActivity.kt @@ -10,7 +10,7 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.view.animation.AnimationUtils.loadAnimation -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R /** * A simple backstack navigating activity diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/navigation/Screen.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/navigation/Screen.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/navigation/Screen.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/navigation/Screen.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/navigation/Views.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/navigation/Views.kt similarity index 97% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/navigation/Views.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/navigation/Views.kt index fe2430390..032854bfb 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/navigation/Views.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/navigation/Views.kt @@ -9,7 +9,7 @@ import android.view.LayoutInflater import android.view.Menu import android.view.View import android.view.ViewGroup -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R internal fun ViewGroup.inflate(layoutResId: Int) = LayoutInflater.from(context) .inflate(layoutResId, this, false)!! diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/tv/TvOnRetainInstanceListener.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/tv/TvOnRetainInstanceListener.kt similarity index 98% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/tv/TvOnRetainInstanceListener.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/tv/TvOnRetainInstanceListener.kt index f05a197fb..8be8bff2d 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/tv/TvOnRetainInstanceListener.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/tv/TvOnRetainInstanceListener.kt @@ -1,7 +1,7 @@ package leakcanary.internal.tv import android.app.Application -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R import leakcanary.LeakCanary import leakcanary.internal.InternalLeakCanary import leakcanary.internal.OnRetainInstanceListener diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/tv/TvToast.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/tv/TvToast.kt similarity index 97% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/tv/TvToast.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/tv/TvToast.kt index 74d63e233..78c1f8a56 100644 --- a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/tv/TvToast.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/tv/TvToast.kt @@ -7,7 +7,7 @@ import android.view.Gravity import android.view.LayoutInflater import android.widget.TextView import android.widget.Toast -import com.squareup.leakcanary.core.R +import com.squareup.leakcanary.debug.R /** * Toast helper for Android TV preconfigured with LeakCanary icon. diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/utils/Size.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/utils/Size.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/utils/Size.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/utils/Size.kt diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/utils/Tuples.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/utils/Tuples.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/utils/Tuples.kt rename to leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/utils/Tuples.kt diff --git a/leakcanary/leakcanary-android-core/src/main/res/anim/leak_canary_enter_alpha.xml b/leakcanary/leakcanary-android-debug/src/main/res/anim/leak_canary_enter_alpha.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/anim/leak_canary_enter_alpha.xml rename to leakcanary/leakcanary-android-debug/src/main/res/anim/leak_canary_enter_alpha.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/anim/leak_canary_enter_backward.xml b/leakcanary/leakcanary-android-debug/src/main/res/anim/leak_canary_enter_backward.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/anim/leak_canary_enter_backward.xml rename to leakcanary/leakcanary-android-debug/src/main/res/anim/leak_canary_enter_backward.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/anim/leak_canary_enter_forward.xml b/leakcanary/leakcanary-android-debug/src/main/res/anim/leak_canary_enter_forward.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/anim/leak_canary_enter_forward.xml rename to leakcanary/leakcanary-android-debug/src/main/res/anim/leak_canary_enter_forward.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/anim/leak_canary_exit_alpha.xml b/leakcanary/leakcanary-android-debug/src/main/res/anim/leak_canary_exit_alpha.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/anim/leak_canary_exit_alpha.xml rename to leakcanary/leakcanary-android-debug/src/main/res/anim/leak_canary_exit_alpha.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/anim/leak_canary_exit_backward.xml b/leakcanary/leakcanary-android-debug/src/main/res/anim/leak_canary_exit_backward.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/anim/leak_canary_exit_backward.xml rename to leakcanary/leakcanary-android-debug/src/main/res/anim/leak_canary_exit_backward.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/anim/leak_canary_exit_forward.xml b/leakcanary/leakcanary-android-debug/src/main/res/anim/leak_canary_exit_forward.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/anim/leak_canary_exit_forward.xml rename to leakcanary/leakcanary-android-debug/src/main/res/anim/leak_canary_exit_forward.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/color/leak_canary_bottom_menu.xml b/leakcanary/leakcanary-android-debug/src/main/res/color/leak_canary_bottom_menu.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/color/leak_canary_bottom_menu.xml rename to leakcanary/leakcanary-android-debug/src/main/res/color/leak_canary_bottom_menu.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/color/leak_canary_count_text.xml b/leakcanary/leakcanary-android-debug/src/main/res/color/leak_canary_count_text.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/color/leak_canary_count_text.xml rename to leakcanary/leakcanary-android-debug/src/main/res/color/leak_canary_count_text.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable-v21/leak_canary_gray_fill.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable-v21/leak_canary_gray_fill.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable-v21/leak_canary_gray_fill.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable-v21/leak_canary_gray_fill.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable-v21/leak_canary_list_selector.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable-v21/leak_canary_list_selector.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable-v21/leak_canary_list_selector.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable-v21/leak_canary_list_selector.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable-v21/leak_canary_primary_button.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable-v21/leak_canary_primary_button.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable-v21/leak_canary_primary_button.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable-v21/leak_canary_primary_button.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable-v21/leak_canary_secondary_button.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable-v21/leak_canary_secondary_button.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable-v21/leak_canary_secondary_button.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable-v21/leak_canary_secondary_button.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable-v21/leak_canary_tab_background.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable-v21/leak_canary_tab_background.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable-v21/leak_canary_tab_background.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable-v21/leak_canary_tab_background.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable-v21/leak_canary_tab_selector_ripple.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable-v21/leak_canary_tab_selector_ripple.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable-v21/leak_canary_tab_selector_ripple.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable-v21/leak_canary_tab_selector_ripple.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_count_background.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_count_background.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_count_background.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_count_background.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_dump.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_dump.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_dump.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_dump.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_gray_fill.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_gray_fill.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_gray_fill.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_gray_fill.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_icon.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_icon.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_icon.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_icon.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_icon_foreground.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_icon_foreground.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_icon_foreground.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_icon_foreground.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_icon_monochrome.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_icon_monochrome.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_icon_monochrome.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_icon_monochrome.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_info.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_info.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_info.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_info.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_info_rectangle.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_info_rectangle.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_info_rectangle.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_info_rectangle.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_leak.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_leak.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_leak.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_leak.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_list_selector.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_list_selector.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_list_selector.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_list_selector.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_primary_button.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_primary_button.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_primary_button.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_primary_button.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_secondary_button.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_secondary_button.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_secondary_button.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_secondary_button.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_tab_background.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_tab_background.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_tab_background.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_tab_background.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_toast_background.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_toast_background.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_toast_background.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_toast_background.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_tv_icon.xml b/leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_tv_icon.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/drawable/leak_canary_tv_icon.xml rename to leakcanary/leakcanary-android-debug/src/main/res/drawable/leak_canary_tv_icon.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_about_screen.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_about_screen.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_about_screen.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_about_screen.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_heap_analysis_failure_screen.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_heap_analysis_failure_screen.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_heap_analysis_failure_screen.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_heap_analysis_failure_screen.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_heap_dump_leak_title.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_heap_dump_leak_title.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_heap_dump_leak_title.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_heap_dump_leak_title.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_heap_dump_toast.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_heap_dump_toast.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_heap_dump_toast.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_heap_dump_toast.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_heap_dumps_screen.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_heap_dumps_screen.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_heap_dumps_screen.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_heap_dumps_screen.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_heap_render.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_heap_render.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_heap_render.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_heap_render.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_hprof_explorer.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_hprof_explorer.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_hprof_explorer.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_hprof_explorer.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_leak_activity.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_leak_activity.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_leak_activity.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_leak_activity.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_leak_chips.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_leak_chips.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_leak_chips.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_leak_chips.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_leak_header.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_leak_header.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_leak_header.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_leak_header.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_leak_row.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_leak_row.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_leak_row.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_leak_row.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_leak_screen.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_leak_screen.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_leak_screen.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_leak_screen.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_list.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_list.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_list.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_list.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_ref_row.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_ref_row.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_ref_row.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_ref_row.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_simple_row.xml b/leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_simple_row.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/layout/leak_canary_simple_row.xml rename to leakcanary/leakcanary-android-debug/src/main/res/layout/leak_canary_simple_row.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/mipmap-anydpi-v26/leak_canary_icon.xml b/leakcanary/leakcanary-android-debug/src/main/res/mipmap-anydpi-v26/leak_canary_icon.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/mipmap-anydpi-v26/leak_canary_icon.xml rename to leakcanary/leakcanary-android-debug/src/main/res/mipmap-anydpi-v26/leak_canary_icon.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/mipmap-hdpi/leak_canary_icon.png b/leakcanary/leakcanary-android-debug/src/main/res/mipmap-hdpi/leak_canary_icon.png similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/mipmap-hdpi/leak_canary_icon.png rename to leakcanary/leakcanary-android-debug/src/main/res/mipmap-hdpi/leak_canary_icon.png diff --git a/leakcanary/leakcanary-android-core/src/main/res/mipmap-mdpi/leak_canary_icon.png b/leakcanary/leakcanary-android-debug/src/main/res/mipmap-mdpi/leak_canary_icon.png similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/mipmap-mdpi/leak_canary_icon.png rename to leakcanary/leakcanary-android-debug/src/main/res/mipmap-mdpi/leak_canary_icon.png diff --git a/leakcanary/leakcanary-android-core/src/main/res/mipmap-xhdpi/leak_canary_icon.png b/leakcanary/leakcanary-android-debug/src/main/res/mipmap-xhdpi/leak_canary_icon.png similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/mipmap-xhdpi/leak_canary_icon.png rename to leakcanary/leakcanary-android-debug/src/main/res/mipmap-xhdpi/leak_canary_icon.png diff --git a/leakcanary/leakcanary-android-core/src/main/res/mipmap-xxhdpi/leak_canary_icon.png b/leakcanary/leakcanary-android-debug/src/main/res/mipmap-xxhdpi/leak_canary_icon.png similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/mipmap-xxhdpi/leak_canary_icon.png rename to leakcanary/leakcanary-android-debug/src/main/res/mipmap-xxhdpi/leak_canary_icon.png diff --git a/leakcanary/leakcanary-android-core/src/main/res/mipmap-xxxhdpi/leak_canary_icon.png b/leakcanary/leakcanary-android-debug/src/main/res/mipmap-xxxhdpi/leak_canary_icon.png similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/mipmap-xxxhdpi/leak_canary_icon.png rename to leakcanary/leakcanary-android-debug/src/main/res/mipmap-xxxhdpi/leak_canary_icon.png diff --git a/leakcanary/leakcanary-android-core/src/main/res/values-v21/leak_canary_themes.xml b/leakcanary/leakcanary-android-debug/src/main/res/values-v21/leak_canary_themes.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/values-v21/leak_canary_themes.xml rename to leakcanary/leakcanary-android-debug/src/main/res/values-v21/leak_canary_themes.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_attrs.xml b/leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_attrs.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_attrs.xml rename to leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_attrs.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_bools.xml b/leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_bools.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_bools.xml rename to leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_bools.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_colors.xml b/leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_colors.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_colors.xml rename to leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_colors.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_dimens.xml b/leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_dimens.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_dimens.xml rename to leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_dimens.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_ids.xml b/leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_ids.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_ids.xml rename to leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_ids.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_public.xml b/leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_public.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_public.xml rename to leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_public.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_strings.xml b/leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_strings.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_strings.xml rename to leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_strings.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_themes.xml b/leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_themes.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/values/leak_canary_themes.xml rename to leakcanary/leakcanary-android-debug/src/main/res/values/leak_canary_themes.xml diff --git a/leakcanary/leakcanary-android-core/src/main/res/xml/leak_canary_file_paths.xml b/leakcanary/leakcanary-android-debug/src/main/res/xml/leak_canary_file_paths.xml similarity index 100% rename from leakcanary/leakcanary-android-core/src/main/res/xml/leak_canary_file_paths.xml rename to leakcanary/leakcanary-android-debug/src/main/res/xml/leak_canary_file_paths.xml diff --git a/leakcanary/leakcanary-android-core/src/test/java/leakcanary/LeakCanaryConfigTest.kt b/leakcanary/leakcanary-android-debug/src/test/java/leakcanary/LeakCanaryConfigTest.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/test/java/leakcanary/LeakCanaryConfigTest.kt rename to leakcanary/leakcanary-android-debug/src/test/java/leakcanary/LeakCanaryConfigTest.kt diff --git a/leakcanary/leakcanary-android-core/src/test/java/leakcanary/internal/activity/screen/LeakTraceWrapperTest.kt b/leakcanary/leakcanary-android-debug/src/test/java/leakcanary/internal/activity/screen/LeakTraceWrapperTest.kt similarity index 100% rename from leakcanary/leakcanary-android-core/src/test/java/leakcanary/internal/activity/screen/LeakTraceWrapperTest.kt rename to leakcanary/leakcanary-android-debug/src/test/java/leakcanary/internal/activity/screen/LeakTraceWrapperTest.kt diff --git a/leakcanary/leakcanary-android-instrumentation/build.gradle b/leakcanary/leakcanary-android-instrumentation/build.gradle index 16c7a5803..5c065605b 100644 --- a/leakcanary/leakcanary-android-instrumentation/build.gradle +++ b/leakcanary/leakcanary-android-instrumentation/build.gradle @@ -5,7 +5,7 @@ plugins { } dependencies { - api projects.leakcanary.leakcanaryAndroidCore + api projects.leakcanary.leakcanaryAndroidDebug api projects.shark.sharkAndroid implementation libs.androidX.test.runner diff --git a/leakcanary/leakcanary-android-startup/build.gradle b/leakcanary/leakcanary-android-startup/build.gradle index c39f402f2..ae4347a35 100644 --- a/leakcanary/leakcanary-android-startup/build.gradle +++ b/leakcanary/leakcanary-android-startup/build.gradle @@ -5,7 +5,7 @@ plugins { } dependencies { - api projects.leakcanary.leakcanaryAndroidCore + api projects.leakcanary.leakcanaryAndroidDebug // AppWatcher AndroidX Startup installer implementation projects.objectWatcher.objectWatcherAndroidStartup // Plumber AndroidX Startup installer diff --git a/leakcanary/leakcanary-android/build.gradle b/leakcanary/leakcanary-android/build.gradle index 87fb7b1cd..ae399e47c 100644 --- a/leakcanary/leakcanary-android/build.gradle +++ b/leakcanary/leakcanary-android/build.gradle @@ -5,7 +5,7 @@ plugins { } dependencies { - api projects.leakcanary.leakcanaryAndroidCore + api projects.leakcanary.leakcanaryAndroidDebug // AppWatcher auto installer api projects.objectWatcher.objectWatcherAndroid // Plumber auto installer diff --git a/leakcanary/leakcanary-app-service/build.gradle b/leakcanary/leakcanary-app-service/build.gradle index ccf54c1db..9600e8157 100644 --- a/leakcanary/leakcanary-app-service/build.gradle +++ b/leakcanary/leakcanary-app-service/build.gradle @@ -24,7 +24,7 @@ android { dependencies { implementation projects.leakcanary.leakcanaryAppAidl - implementation projects.leakcanary.leakcanaryAndroidCore + implementation projects.leakcanary.leakcanaryAndroidDebug implementation projects.shark.shark implementation projects.shark.sharkAndroid } diff --git a/settings.gradle b/settings.gradle index e8303b8dd..250e9f4f8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,5 @@ include ':leakcanary:leakcanary-android' -include ':leakcanary:leakcanary-android-core' +include ':leakcanary:leakcanary-android-debug' include ':leakcanary:leakcanary-android-instrumentation' include ':leakcanary:leakcanary-android-process' include ':leakcanary:leakcanary-android-release' diff --git a/shark/shark-android/api/shark-android.api b/shark/shark-android/api/shark-android.api index cb96af17a..c0f6952db 100644 --- a/shark/shark-android/api/shark-android.api +++ b/shark/shark-android/api/shark-android.api @@ -18,6 +18,7 @@ public final class shark/AndroidExtensionsKt { public abstract class shark/AndroidHeapGrowthReferenceMatchers : java/lang/Enum, shark/ReferenceMatcher$ListBuilder { public static final field ANDROID_LEAK_DETECTION_IGNORED_MATCHERS Lshark/AndroidHeapGrowthReferenceMatchers; + public static final field BINDER_PROXY Lshark/AndroidHeapGrowthReferenceMatchers; public static final field COMPOSE_TEST_CONTEXT_STATES Lshark/AndroidHeapGrowthReferenceMatchers; public static final field Companion Lshark/AndroidHeapGrowthReferenceMatchers$Companion; public static final field HEAP_TRAVERSAL Lshark/AndroidHeapGrowthReferenceMatchers; From 3b7cc20f3f9cf8cf844f1d035cda62ddb6fd7770 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Ricau Date: Wed, 1 May 2024 15:25:43 -0700 Subject: [PATCH 3/4] Create empty android-core module --- .../api/leakcanary-android-core.api | 0 .../leakcanary-android-core/build.gradle | 19 +++++++++++++++++++ .../leakcanary-android-core/gradle.properties | 3 +++ .../src/main/AndroidManifest.xml | 18 ++++++++++++++++++ settings.gradle | 1 + 5 files changed, 41 insertions(+) create mode 100644 leakcanary/leakcanary-android-core/api/leakcanary-android-core.api create mode 100644 leakcanary/leakcanary-android-core/build.gradle create mode 100644 leakcanary/leakcanary-android-core/gradle.properties create mode 100644 leakcanary/leakcanary-android-core/src/main/AndroidManifest.xml diff --git a/leakcanary/leakcanary-android-core/api/leakcanary-android-core.api b/leakcanary/leakcanary-android-core/api/leakcanary-android-core.api new file mode 100644 index 000000000..e69de29bb diff --git a/leakcanary/leakcanary-android-core/build.gradle b/leakcanary/leakcanary-android-core/build.gradle new file mode 100644 index 000000000..3093ac3fd --- /dev/null +++ b/leakcanary/leakcanary-android-core/build.gradle @@ -0,0 +1,19 @@ +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") + id("com.vanniktech.maven.publish") +} + +dependencies { + api projects.leakcanary.leakcanaryCore +} + +android { + compileSdk versions.compileSdk + defaultConfig { + targetSdk versions.compileSdk + minSdk versions.minSdk + } + buildFeatures.buildConfig = false + namespace 'com.squareup.leakcanary.core' +} diff --git a/leakcanary/leakcanary-android-core/gradle.properties b/leakcanary/leakcanary-android-core/gradle.properties new file mode 100644 index 000000000..53303f664 --- /dev/null +++ b/leakcanary/leakcanary-android-core/gradle.properties @@ -0,0 +1,3 @@ +POM_ARTIFACT_ID=leakcanary-android-core +POM_NAME=LeakCanary Android - Core +POM_PACKAGING=aar diff --git a/leakcanary/leakcanary-android-core/src/main/AndroidManifest.xml b/leakcanary/leakcanary-android-core/src/main/AndroidManifest.xml new file mode 100644 index 000000000..338e43a0e --- /dev/null +++ b/leakcanary/leakcanary-android-core/src/main/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + + diff --git a/settings.gradle b/settings.gradle index 250e9f4f8..e5319dd42 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,5 @@ include ':leakcanary:leakcanary-android' +include ':leakcanary:leakcanary-android-core' include ':leakcanary:leakcanary-android-debug' include ':leakcanary:leakcanary-android-instrumentation' include ':leakcanary:leakcanary-android-process' From 3a904b30582977246cf5859736911f223278538d Mon Sep 17 00:00:00 2001 From: Pierre-Yves Ricau Date: Thu, 2 May 2024 10:02:52 -0700 Subject: [PATCH 4/4] Iterating on APIs some more --- .../api/leakcanary-android-core.api | 14 ++++ .../leakcanary-android-core/build.gradle | 1 + .../java/leakcanary/AndroidDebugHeapDumper.kt | 2 +- .../RepeatingAndroidInProcessScenario.kt | 32 +++++++++ .../api/leakcanary-android-debug.api | 9 --- .../leakcanary/internal/InternalLeakCanary.kt | 3 +- .../leakcanary/AndroidDetectLeaksAssert.kt | 2 +- .../AndroidDetectLeaksInterceptor.kt | 5 +- .../leakcanary-core/api/leakcanary-core.api | 15 ++-- leakcanary/leakcanary-core/build.gradle | 1 + .../DateFormatHeapDumpFileProvider.kt | 2 +- .../DumpingAndDeletingHeapGraphProvider.kt | 2 +- .../src/main/java/leakcanary/HeapDumper.kt | 8 +++ .../leakcanary/TempHeapDumpFileProvider.kt | 2 +- .../leakcanary-gc/api/leakcanary-gc.api | 18 +++++ leakcanary/leakcanary-gc/build.gradle | 11 +++ leakcanary/leakcanary-gc/gradle.properties | 3 + .../src/main/AndroidManifest.xml | 18 +++++ .../FinalizingInProcessGcTrigger.kt | 46 +++++++++++++ .../src/main/java/leakcanary/GcTrigger.kt | 33 +++++++++ .../api/leakcanary-jvm-test.api | 7 +- .../main/java/leakcanary/HotSpotHeapDumper.kt | 2 +- .../RepeatingJvmInProcessScenario.kt | 32 +++++++++ .../JvmHeapGrowthDetectorConfigTest.kt | 11 +-- .../object-watcher/api/object-watcher.api | 9 --- object-watcher/object-watcher/build.gradle | 1 + .../src/main/java/leakcanary/GcTrigger.kt | 56 --------------- ...ReferenceQueueRetainedObjectTrackerTest.kt | 5 +- .../com/example/leakcanary/ExampleSetup.kt | 3 +- settings.gradle | 1 + shark/shark-android/api/shark-android.api | 40 +++++------ .../java/shark/AndroidObjectGrowthDetector.kt | 4 +- ...> AndroidObjectGrowthReferenceMatchers.kt} | 4 +- .../src/main/java/shark/HeapGrowthCommand.kt | 6 +- shark/shark/api/shark.api | 51 ++++++++------ .../shark/HeapDumpingObjectGrowthDetector.kt | 44 ------------ .../java/shark/JvmObjectGrowthDetector.kt | 2 +- ...RepeatingHeapGraphObjectGrowthDetector.kt} | 18 ++++- .../RepeatingScenarioObjectGrowthDetector.kt | 69 +++++++++++++++++++ .../shark/LiveObjectGrowthDetectorTest.kt | 4 +- .../java/shark/ObjectGrowthDetectorTest.kt | 2 +- 41 files changed, 396 insertions(+), 202 deletions(-) rename leakcanary/{leakcanary-android-debug => leakcanary-android-core}/src/main/java/leakcanary/AndroidDebugHeapDumper.kt (85%) create mode 100644 leakcanary/leakcanary-android-core/src/main/java/leakcanary/RepeatingAndroidInProcessScenario.kt create mode 100644 leakcanary/leakcanary-gc/api/leakcanary-gc.api create mode 100644 leakcanary/leakcanary-gc/build.gradle create mode 100644 leakcanary/leakcanary-gc/gradle.properties create mode 100644 leakcanary/leakcanary-gc/src/main/AndroidManifest.xml create mode 100644 leakcanary/leakcanary-gc/src/main/java/leakcanary/FinalizingInProcessGcTrigger.kt create mode 100644 leakcanary/leakcanary-gc/src/main/java/leakcanary/GcTrigger.kt create mode 100644 leakcanary/leakcanary-jvm-test/src/main/java/leakcanary/RepeatingJvmInProcessScenario.kt delete mode 100644 object-watcher/object-watcher/src/main/java/leakcanary/GcTrigger.kt rename shark/shark-android/src/main/java/shark/{AndroidHeapGrowthReferenceMatchers.kt => AndroidObjectGrowthReferenceMatchers.kt} (95%) delete mode 100644 shark/shark/src/main/java/shark/HeapDumpingObjectGrowthDetector.kt rename shark/shark/src/main/java/shark/{HeapGraphSequenceObjectGrowthDetector.kt => RepeatingHeapGraphObjectGrowthDetector.kt} (56%) create mode 100644 shark/shark/src/main/java/shark/RepeatingScenarioObjectGrowthDetector.kt diff --git a/leakcanary/leakcanary-android-core/api/leakcanary-android-core.api b/leakcanary/leakcanary-android-core/api/leakcanary-android-core.api index e69de29bb..8ed6ecfd6 100644 --- a/leakcanary/leakcanary-android-core/api/leakcanary-android-core.api +++ b/leakcanary/leakcanary-android-core/api/leakcanary-android-core.api @@ -0,0 +1,14 @@ +public final class leakcanary/AndroidDebugHeapDumper : leakcanary/HeapDumper { + public static final field INSTANCE Lleakcanary/AndroidDebugHeapDumper; + public fun dumpHeap (Ljava/io/File;)V +} + +public final class leakcanary/AndroidDebugHeapDumperKt { + public static final fun forAndroidInProcess (Lleakcanary/HeapDumper$Companion;)Lleakcanary/AndroidDebugHeapDumper; +} + +public final class leakcanary/RepeatingAndroidInProcessScenarioKt { + public static final fun repeatingAndroidInProcessScenario (Lshark/ObjectGrowthDetector;II)Lshark/RepeatingScenarioObjectGrowthDetector; + public static synthetic fun repeatingAndroidInProcessScenario$default (Lshark/ObjectGrowthDetector;IIILjava/lang/Object;)Lshark/RepeatingScenarioObjectGrowthDetector; +} + diff --git a/leakcanary/leakcanary-android-core/build.gradle b/leakcanary/leakcanary-android-core/build.gradle index 3093ac3fd..34e0be4ad 100644 --- a/leakcanary/leakcanary-android-core/build.gradle +++ b/leakcanary/leakcanary-android-core/build.gradle @@ -6,6 +6,7 @@ plugins { dependencies { api projects.leakcanary.leakcanaryCore + api projects.shark.sharkAndroid } android { diff --git a/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/AndroidDebugHeapDumper.kt b/leakcanary/leakcanary-android-core/src/main/java/leakcanary/AndroidDebugHeapDumper.kt similarity index 85% rename from leakcanary/leakcanary-android-debug/src/main/java/leakcanary/AndroidDebugHeapDumper.kt rename to leakcanary/leakcanary-android-core/src/main/java/leakcanary/AndroidDebugHeapDumper.kt index 5f37ccb3d..404b62804 100644 --- a/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/AndroidDebugHeapDumper.kt +++ b/leakcanary/leakcanary-android-core/src/main/java/leakcanary/AndroidDebugHeapDumper.kt @@ -15,4 +15,4 @@ object AndroidDebugHeapDumper : HeapDumper { } } -fun HeapDumper.Companion.androidDumper() = AndroidDebugHeapDumper +fun HeapDumper.Companion.forAndroidInProcess() = AndroidDebugHeapDumper diff --git a/leakcanary/leakcanary-android-core/src/main/java/leakcanary/RepeatingAndroidInProcessScenario.kt b/leakcanary/leakcanary-android-core/src/main/java/leakcanary/RepeatingAndroidInProcessScenario.kt new file mode 100644 index 000000000..1b3f5b813 --- /dev/null +++ b/leakcanary/leakcanary-android-core/src/main/java/leakcanary/RepeatingAndroidInProcessScenario.kt @@ -0,0 +1,32 @@ +package leakcanary + +import shark.RepeatingScenarioObjectGrowthDetector +import shark.HeapGraphProvider +import shark.ObjectGrowthDetector +import shark.repeatingScenario + +/** + * Creates a [RepeatingScenarioObjectGrowthDetector] suitable for Android in process tests, such + * as Espresso tests. Typically called on a [ObjectGrowthDetector] created via + * [shark.forAndroidHeap]. + * + * Dumps the heap by leveraging Android APIs, running an in process GC right before dumping. + * Deletes the heap dump file as soon as we're done traversing it. + * + * @see [RepeatingScenarioObjectGrowthDetector.findRepeatedlyGrowingObjects] + */ +fun ObjectGrowthDetector.repeatingAndroidInProcessScenario( + maxHeapDumps: Int = RepeatingScenarioObjectGrowthDetector.DEFAULT_MAX_HEAP_DUMPS, + // In process => More than one to account for the impact of running the analysis. + scenarioLoopsPerDump: Int = 2, +): RepeatingScenarioObjectGrowthDetector { + return repeatingScenario( + heapGraphProvider = HeapGraphProvider.dumpingAndDeleting( + heapDumper = HeapDumper.forAndroidInProcess() + .withGc(gcTrigger = GcTrigger.inProcess()), + heapDumpFileProvider = HeapDumpFileProvider.tempFile() + ), + maxHeapDumps = maxHeapDumps, + scenarioLoopsPerDump = scenarioLoopsPerDump, + ) +} diff --git a/leakcanary/leakcanary-android-debug/api/leakcanary-android-debug.api b/leakcanary/leakcanary-android-debug/api/leakcanary-android-debug.api index 6dc070b96..48fcca3ec 100644 --- a/leakcanary/leakcanary-android-debug/api/leakcanary-android-debug.api +++ b/leakcanary/leakcanary-android-debug/api/leakcanary-android-debug.api @@ -7,15 +7,6 @@ public final class com/squareup/leakcanary/debug/BuildConfig { public fun ()V } -public final class leakcanary/AndroidDebugHeapDumper : leakcanary/HeapDumper { - public static final field INSTANCE Lleakcanary/AndroidDebugHeapDumper; - public fun dumpHeap (Ljava/io/File;)V -} - -public final class leakcanary/AndroidDebugHeapDumperKt { - public static final fun androidDumper (Lleakcanary/HeapDumper$Companion;)Lleakcanary/AndroidDebugHeapDumper; -} - public final class leakcanary/BackgroundThreadHeapAnalyzer : leakcanary/EventListener { public static final field INSTANCE Lleakcanary/BackgroundThreadHeapAnalyzer; public fun onEvent (Lleakcanary/EventListener$Event;)V diff --git a/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/InternalLeakCanary.kt b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/InternalLeakCanary.kt index 29f5bde82..66e5bb09b 100644 --- a/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/InternalLeakCanary.kt +++ b/leakcanary/leakcanary-android-debug/src/main/java/leakcanary/internal/InternalLeakCanary.kt @@ -22,6 +22,7 @@ import leakcanary.GcTrigger import leakcanary.LeakCanary import leakcanary.LeakCanaryAndroidInternalUtils import leakcanary.OnObjectRetainedListener +import leakcanary.inProcess import leakcanary.internal.HeapDumpControl.ICanHazHeap.Nope import leakcanary.internal.HeapDumpControl.ICanHazHeap.Yup import leakcanary.internal.InternalLeakCanary.FormFactor.MOBILE @@ -122,7 +123,7 @@ internal object InternalLeakCanary : (Application) -> Unit, OnObjectRetainedList AppWatcher.objectWatcher.addOnObjectRetainedListener(this) - val gcTrigger = GcTrigger.Default + val gcTrigger = GcTrigger.inProcess() val configProvider = { LeakCanary.config } diff --git a/leakcanary/leakcanary-android-instrumentation/src/main/java/leakcanary/AndroidDetectLeaksAssert.kt b/leakcanary/leakcanary-android-instrumentation/src/main/java/leakcanary/AndroidDetectLeaksAssert.kt index be1157034..8903e631f 100644 --- a/leakcanary/leakcanary-android-instrumentation/src/main/java/leakcanary/AndroidDetectLeaksAssert.kt +++ b/leakcanary/leakcanary-android-instrumentation/src/main/java/leakcanary/AndroidDetectLeaksAssert.kt @@ -61,7 +61,7 @@ class AndroidDetectLeaksAssert( } } - val heapDumpFileProvider = HeapDumpFileProvider.datetimeFormattedFileProvider( + val heapDumpFileProvider = HeapDumpFileProvider.datetimeFormatted( directory = File( InstrumentationRegistry.getInstrumentation().targetContext.filesDir, "instrumentation_tests" diff --git a/leakcanary/leakcanary-android-instrumentation/src/main/java/leakcanary/AndroidDetectLeaksInterceptor.kt b/leakcanary/leakcanary-android-instrumentation/src/main/java/leakcanary/AndroidDetectLeaksInterceptor.kt index 920eb6081..d286cc1d0 100644 --- a/leakcanary/leakcanary-android-instrumentation/src/main/java/leakcanary/AndroidDetectLeaksInterceptor.kt +++ b/leakcanary/leakcanary-android-instrumentation/src/main/java/leakcanary/AndroidDetectLeaksInterceptor.kt @@ -3,7 +3,6 @@ package leakcanary import android.app.Instrumentation import android.os.SystemClock import androidx.test.platform.app.InstrumentationRegistry -import leakcanary.GcTrigger.Default import leakcanary.HeapAnalysisDecision.AnalyzeHeap import leakcanary.HeapAnalysisDecision.NoHeapAnalysis @@ -26,7 +25,7 @@ class AndroidDetectLeaksInterceptor( return NoHeapAnalysis("No watched objects after waiting for idle sync.") } - Default.runGc() + GcTrigger.inProcess().runGc() if (!retainedObjectTracker.hasTrackedObjects) { return NoHeapAnalysis("No watched objects after triggering an explicit GC.") } @@ -49,7 +48,7 @@ class AndroidDetectLeaksInterceptor( SystemClock.sleep(endOfWatchDelay) } - Default.runGc() + GcTrigger.inProcess().runGc() if (!retainedObjectTracker.hasRetainedObjects) { return NoHeapAnalysis("No retained objects after waiting for retained delay.") diff --git a/leakcanary/leakcanary-core/api/leakcanary-core.api b/leakcanary/leakcanary-core/api/leakcanary-core.api index e02654bbe..cc446ed91 100644 --- a/leakcanary/leakcanary-core/api/leakcanary-core.api +++ b/leakcanary/leakcanary-core/api/leakcanary-core.api @@ -10,8 +10,8 @@ public final class leakcanary/DateFormatHeapDumpFileProvider$Companion { } public final class leakcanary/DateFormatHeapDumpFileProviderKt { - public static final fun datetimeFormattedFileProvider (Lleakcanary/HeapDumpFileProvider$Companion;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Lleakcanary/HeapDumpFileProvider; - public static synthetic fun datetimeFormattedFileProvider$default (Lleakcanary/HeapDumpFileProvider$Companion;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)Lleakcanary/HeapDumpFileProvider; + public static final fun datetimeFormatted (Lleakcanary/HeapDumpFileProvider$Companion;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Lleakcanary/HeapDumpFileProvider; + public static synthetic fun datetimeFormatted$default (Lleakcanary/HeapDumpFileProvider$Companion;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)Lleakcanary/HeapDumpFileProvider; } public final class leakcanary/DumpingAndDeletingHeapGraphProvider : shark/HeapGraphProvider { @@ -20,8 +20,8 @@ public final class leakcanary/DumpingAndDeletingHeapGraphProvider : shark/HeapGr } public final class leakcanary/DumpingAndDeletingHeapGraphProviderKt { - public static final fun dumpingAndDeletingGraphProvider (Lshark/HeapGraphProvider$Companion;Lleakcanary/HeapDumper;Lleakcanary/HeapDumpFileProvider;)Lleakcanary/DumpingAndDeletingHeapGraphProvider; - public static synthetic fun dumpingAndDeletingGraphProvider$default (Lshark/HeapGraphProvider$Companion;Lleakcanary/HeapDumper;Lleakcanary/HeapDumpFileProvider;ILjava/lang/Object;)Lleakcanary/DumpingAndDeletingHeapGraphProvider; + public static final fun dumpingAndDeleting (Lshark/HeapGraphProvider$Companion;Lleakcanary/HeapDumper;Lleakcanary/HeapDumpFileProvider;)Lleakcanary/DumpingAndDeletingHeapGraphProvider; + public static synthetic fun dumpingAndDeleting$default (Lshark/HeapGraphProvider$Companion;Lleakcanary/HeapDumper;Lleakcanary/HeapDumpFileProvider;ILjava/lang/Object;)Lleakcanary/DumpingAndDeletingHeapGraphProvider; } public abstract interface class leakcanary/HeapDumpFileProvider { @@ -40,12 +40,17 @@ public abstract interface class leakcanary/HeapDumper { public final class leakcanary/HeapDumper$Companion { } +public final class leakcanary/HeapDumperKt { + public static final fun withGc (Lleakcanary/HeapDumper;Lleakcanary/GcTrigger;)Lleakcanary/HeapDumper; + public static synthetic fun withGc$default (Lleakcanary/HeapDumper;Lleakcanary/GcTrigger;ILjava/lang/Object;)Lleakcanary/HeapDumper; +} + public final class leakcanary/TempHeapDumpFileProvider : leakcanary/HeapDumpFileProvider { public static final field INSTANCE Lleakcanary/TempHeapDumpFileProvider; public fun newHeapDumpFile ()Ljava/io/File; } public final class leakcanary/TempHeapDumpFileProviderKt { - public static final fun tempFileProvider (Lleakcanary/HeapDumpFileProvider$Companion;)Lleakcanary/HeapDumpFileProvider; + public static final fun tempFile (Lleakcanary/HeapDumpFileProvider$Companion;)Lleakcanary/HeapDumpFileProvider; } diff --git a/leakcanary/leakcanary-core/build.gradle b/leakcanary/leakcanary-core/build.gradle index 11b676430..41ae014fd 100644 --- a/leakcanary/leakcanary-core/build.gradle +++ b/leakcanary/leakcanary-core/build.gradle @@ -7,5 +7,6 @@ sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 dependencies { + api projects.leakcanary.leakcanaryGc api projects.shark.shark } diff --git a/leakcanary/leakcanary-core/src/main/java/leakcanary/DateFormatHeapDumpFileProvider.kt b/leakcanary/leakcanary-core/src/main/java/leakcanary/DateFormatHeapDumpFileProvider.kt index ee961abea..6c3215e7f 100644 --- a/leakcanary/leakcanary-core/src/main/java/leakcanary/DateFormatHeapDumpFileProvider.kt +++ b/leakcanary/leakcanary-core/src/main/java/leakcanary/DateFormatHeapDumpFileProvider.kt @@ -38,7 +38,7 @@ class DateFormatHeapDumpFileProvider( } } -fun HeapDumpFileProvider.Companion.datetimeFormattedFileProvider( +fun HeapDumpFileProvider.Companion.datetimeFormatted( directory: File, prefix: String = "", suffix: String = "", diff --git a/leakcanary/leakcanary-core/src/main/java/leakcanary/DumpingAndDeletingHeapGraphProvider.kt b/leakcanary/leakcanary-core/src/main/java/leakcanary/DumpingAndDeletingHeapGraphProvider.kt index 91249aab1..ac5899c99 100644 --- a/leakcanary/leakcanary-core/src/main/java/leakcanary/DumpingAndDeletingHeapGraphProvider.kt +++ b/leakcanary/leakcanary-core/src/main/java/leakcanary/DumpingAndDeletingHeapGraphProvider.kt @@ -24,7 +24,7 @@ class DumpingAndDeletingHeapGraphProvider( } } -fun HeapGraphProvider.Companion.dumpingAndDeletingGraphProvider( +fun HeapGraphProvider.Companion.dumpingAndDeleting( heapDumper: HeapDumper, heapDumpFileProvider: HeapDumpFileProvider = TempHeapDumpFileProvider, ) = DumpingAndDeletingHeapGraphProvider(heapDumpFileProvider, heapDumper) diff --git a/leakcanary/leakcanary-core/src/main/java/leakcanary/HeapDumper.kt b/leakcanary/leakcanary-core/src/main/java/leakcanary/HeapDumper.kt index 09bbc03be..8ea025a7e 100644 --- a/leakcanary/leakcanary-core/src/main/java/leakcanary/HeapDumper.kt +++ b/leakcanary/leakcanary-core/src/main/java/leakcanary/HeapDumper.kt @@ -18,3 +18,11 @@ fun interface HeapDumper { */ companion object } + +fun HeapDumper.withGc(gcTrigger: GcTrigger = GcTrigger.inProcess()): HeapDumper { + val delegate = this + return HeapDumper { file -> + gcTrigger.runGc() + delegate.dumpHeap(file) + } +} diff --git a/leakcanary/leakcanary-core/src/main/java/leakcanary/TempHeapDumpFileProvider.kt b/leakcanary/leakcanary-core/src/main/java/leakcanary/TempHeapDumpFileProvider.kt index 47e696569..3d5281d9b 100644 --- a/leakcanary/leakcanary-core/src/main/java/leakcanary/TempHeapDumpFileProvider.kt +++ b/leakcanary/leakcanary-core/src/main/java/leakcanary/TempHeapDumpFileProvider.kt @@ -12,5 +12,5 @@ object TempHeapDumpFileProvider : HeapDumpFileProvider { } } -fun HeapDumpFileProvider.Companion.tempFileProvider(): HeapDumpFileProvider = +fun HeapDumpFileProvider.Companion.tempFile(): HeapDumpFileProvider = TempHeapDumpFileProvider diff --git a/leakcanary/leakcanary-gc/api/leakcanary-gc.api b/leakcanary/leakcanary-gc/api/leakcanary-gc.api new file mode 100644 index 000000000..f73912b3e --- /dev/null +++ b/leakcanary/leakcanary-gc/api/leakcanary-gc.api @@ -0,0 +1,18 @@ +public final class leakcanary/FinalizingInProcessGcTrigger : leakcanary/GcTrigger { + public static final field INSTANCE Lleakcanary/FinalizingInProcessGcTrigger; + public fun runGc ()V +} + +public final class leakcanary/FinalizingInProcessGcTriggerKt { + public static final fun inProcess (Lleakcanary/GcTrigger$Companion;)Lleakcanary/FinalizingInProcessGcTrigger; +} + +public abstract interface class leakcanary/GcTrigger { + public static final field Companion Lleakcanary/GcTrigger$Companion; + public abstract fun runGc ()V +} + +public final class leakcanary/GcTrigger$Companion { + public final fun getDefault ()Lleakcanary/FinalizingInProcessGcTrigger; +} + diff --git a/leakcanary/leakcanary-gc/build.gradle b/leakcanary/leakcanary-gc/build.gradle new file mode 100644 index 000000000..3ff834089 --- /dev/null +++ b/leakcanary/leakcanary-gc/build.gradle @@ -0,0 +1,11 @@ +plugins { + id("org.jetbrains.kotlin.jvm") + id("com.vanniktech.maven.publish") +} + +sourceCompatibility = JavaVersion.VERSION_1_8 +targetCompatibility = JavaVersion.VERSION_1_8 + +dependencies { + implementation libs.kotlin.stdlib +} diff --git a/leakcanary/leakcanary-gc/gradle.properties b/leakcanary/leakcanary-gc/gradle.properties new file mode 100644 index 000000000..61b1f91ad --- /dev/null +++ b/leakcanary/leakcanary-gc/gradle.properties @@ -0,0 +1,3 @@ +POM_ARTIFACT_ID=leakcanary-gc +POM_NAME=LeakCanary - GC Utilities +POM_PACKAGING=jar diff --git a/leakcanary/leakcanary-gc/src/main/AndroidManifest.xml b/leakcanary/leakcanary-gc/src/main/AndroidManifest.xml new file mode 100644 index 000000000..338e43a0e --- /dev/null +++ b/leakcanary/leakcanary-gc/src/main/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + + diff --git a/leakcanary/leakcanary-gc/src/main/java/leakcanary/FinalizingInProcessGcTrigger.kt b/leakcanary/leakcanary-gc/src/main/java/leakcanary/FinalizingInProcessGcTrigger.kt new file mode 100644 index 000000000..c511dde71 --- /dev/null +++ b/leakcanary/leakcanary-gc/src/main/java/leakcanary/FinalizingInProcessGcTrigger.kt @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package leakcanary + +/** + * A [GcTrigger] that attempts to perform a GC by invoking the corresponding JDK API then waiting + * and then running finalization. Based on FinalizationTest in AOSP. + */ +object FinalizingInProcessGcTrigger : GcTrigger { + override fun runGc() { + // Code taken from AOSP FinalizationTest: + // https://android.googlesource.com/platform/libcore/+/master/support/src/test/java/libcore/ + // java/lang/ref/FinalizationTester.java + // System.gc() does not garbage collect every time. Runtime.gc() is + // more likely to perform a gc. + Runtime.getRuntime() + .gc() + enqueueReferences() + System.runFinalization() + } + + private fun enqueueReferences() { + // Hack. We don't have a programmatic way to wait for the reference queue daemon to move + // references to the appropriate queues. + try { + Thread.sleep(100) + } catch (e: InterruptedException) { + throw AssertionError() + } + } +} + +fun GcTrigger.Companion.inProcess() = FinalizingInProcessGcTrigger diff --git a/leakcanary/leakcanary-gc/src/main/java/leakcanary/GcTrigger.kt b/leakcanary/leakcanary-gc/src/main/java/leakcanary/GcTrigger.kt new file mode 100644 index 000000000..ae77c9cb4 --- /dev/null +++ b/leakcanary/leakcanary-gc/src/main/java/leakcanary/GcTrigger.kt @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package leakcanary + +fun interface GcTrigger { + + /** + * Attempts to run garbage collection. + */ + fun runGc() + + /** + * This allows external modules to add factory methods for implementations of this interface as + * extension functions of this companion object. + */ + companion object { + @Deprecated("Use GcTrigger.inProcess() instead", ReplaceWith("GcTrigger.inProcess()")) + val Default = FinalizingInProcessGcTrigger + } +} diff --git a/leakcanary/leakcanary-jvm-test/api/leakcanary-jvm-test.api b/leakcanary/leakcanary-jvm-test/api/leakcanary-jvm-test.api index 356dc4716..e1225f916 100644 --- a/leakcanary/leakcanary-jvm-test/api/leakcanary-jvm-test.api +++ b/leakcanary/leakcanary-jvm-test/api/leakcanary-jvm-test.api @@ -4,6 +4,11 @@ public final class leakcanary/HotSpotHeapDumper : leakcanary/HeapDumper { } public final class leakcanary/HotSpotHeapDumperKt { - public static final fun jvmDumper (Lleakcanary/HeapDumper$Companion;)Lleakcanary/HotSpotHeapDumper; + public static final fun forJvmInProcess (Lleakcanary/HeapDumper$Companion;)Lleakcanary/HotSpotHeapDumper; +} + +public final class leakcanary/RepeatingJvmInProcessScenarioKt { + public static final fun repeatingJvmInProcessScenario (Lshark/ObjectGrowthDetector;II)Lshark/RepeatingScenarioObjectGrowthDetector; + public static synthetic fun repeatingJvmInProcessScenario$default (Lshark/ObjectGrowthDetector;IIILjava/lang/Object;)Lshark/RepeatingScenarioObjectGrowthDetector; } diff --git a/leakcanary/leakcanary-jvm-test/src/main/java/leakcanary/HotSpotHeapDumper.kt b/leakcanary/leakcanary-jvm-test/src/main/java/leakcanary/HotSpotHeapDumper.kt index 3b01f19a3..f68acb391 100644 --- a/leakcanary/leakcanary-jvm-test/src/main/java/leakcanary/HotSpotHeapDumper.kt +++ b/leakcanary/leakcanary-jvm-test/src/main/java/leakcanary/HotSpotHeapDumper.kt @@ -20,5 +20,5 @@ object HotSpotHeapDumper : HeapDumper { } } -fun HeapDumper.Companion.jvmDumper() = HotSpotHeapDumper +fun HeapDumper.Companion.forJvmInProcess() = HotSpotHeapDumper diff --git a/leakcanary/leakcanary-jvm-test/src/main/java/leakcanary/RepeatingJvmInProcessScenario.kt b/leakcanary/leakcanary-jvm-test/src/main/java/leakcanary/RepeatingJvmInProcessScenario.kt new file mode 100644 index 000000000..45fb82862 --- /dev/null +++ b/leakcanary/leakcanary-jvm-test/src/main/java/leakcanary/RepeatingJvmInProcessScenario.kt @@ -0,0 +1,32 @@ +package leakcanary + +import shark.HeapGraphProvider +import shark.ObjectGrowthDetector +import shark.RepeatingScenarioObjectGrowthDetector +import shark.repeatingScenario + +/** + * Creates a [RepeatingScenarioObjectGrowthDetector] suitable for JVM in process tests. + * Typically called on a [ObjectGrowthDetector] created via + * [shark.forJvmHeap]. + * + * Dumps the heap by leveraging Hotspot APIs, running an in process GC right before dumping. + * Deletes the heap dump file as soon as we're done traversing it. + * + * @see [RepeatingScenarioObjectGrowthDetector.findRepeatedlyGrowingObjects] + */ +fun ObjectGrowthDetector.repeatingJvmInProcessScenario( + maxHeapDumps: Int = RepeatingScenarioObjectGrowthDetector.DEFAULT_MAX_HEAP_DUMPS, + // In process => More than one to account for the impact of running the analysis. + scenarioLoopsPerDump: Int = 2, +): RepeatingScenarioObjectGrowthDetector { + return repeatingScenario( + heapGraphProvider = HeapGraphProvider.dumpingAndDeleting( + heapDumper = HeapDumper.forJvmInProcess() + .withGc(gcTrigger = GcTrigger.inProcess()), + heapDumpFileProvider = HeapDumpFileProvider.tempFile() + ), + maxHeapDumps = maxHeapDumps, + scenarioLoopsPerDump = scenarioLoopsPerDump, + ) +} diff --git a/leakcanary/leakcanary-jvm-test/src/test/java/leakcanary/JvmHeapGrowthDetectorConfigTest.kt b/leakcanary/leakcanary-jvm-test/src/test/java/leakcanary/JvmHeapGrowthDetectorConfigTest.kt index 35a3c04a4..e6b614ce9 100644 --- a/leakcanary/leakcanary-jvm-test/src/test/java/leakcanary/JvmHeapGrowthDetectorConfigTest.kt +++ b/leakcanary/leakcanary-jvm-test/src/test/java/leakcanary/JvmHeapGrowthDetectorConfigTest.kt @@ -4,8 +4,8 @@ import org.assertj.core.api.Assertions.assertThat import org.junit.Test import shark.HeapGraphProvider import shark.ObjectGrowthDetector -import shark.fromHeapDumpingRepeatedScenario -import shark.jvmDetector +import shark.repeatingScenario +import shark.forJvmHeap class JvmHeapGrowthDetectorConfigTest { @@ -15,12 +15,7 @@ class JvmHeapGrowthDetectorConfigTest { @Test fun `leaky increase leads to heap growth`() { - val detector = ObjectGrowthDetector.jvmDetector() - .fromHeapDumpingRepeatedScenario( - heapGraphProvider = HeapGraphProvider.dumpingAndDeletingGraphProvider( - heapDumper = HeapDumper.jvmDumper() - ) - ) + val detector = ObjectGrowthDetector.forJvmHeap().repeatingJvmInProcessScenario() val growingNodes = detector.findRepeatedlyGrowingObjects { leakies += Leaky() diff --git a/object-watcher/object-watcher/api/object-watcher.api b/object-watcher/object-watcher/api/object-watcher.api index 3e6bd09a9..eeba54a3e 100644 --- a/object-watcher/object-watcher/api/object-watcher.api +++ b/object-watcher/object-watcher/api/object-watcher.api @@ -20,15 +20,6 @@ public abstract interface class leakcanary/DeletableObjectReporter { public abstract fun expectDeletionFor (Ljava/lang/Object;Ljava/lang/String;)Lleakcanary/TrackedObjectReachability; } -public abstract interface class leakcanary/GcTrigger { - public abstract fun runGc ()V -} - -public final class leakcanary/GcTrigger$Default : leakcanary/GcTrigger { - public static final field INSTANCE Lleakcanary/GcTrigger$Default; - public fun runGc ()V -} - public final class leakcanary/KeyedWeakReference : java/lang/ref/WeakReference { public static final field Companion Lleakcanary/KeyedWeakReference$Companion; public fun (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;JLjava/lang/ref/ReferenceQueue;)V diff --git a/object-watcher/object-watcher/build.gradle b/object-watcher/object-watcher/build.gradle index 04fb428ae..938660413 100644 --- a/object-watcher/object-watcher/build.gradle +++ b/object-watcher/object-watcher/build.gradle @@ -9,6 +9,7 @@ targetCompatibility = JavaVersion.VERSION_1_8 dependencies { implementation libs.kotlin.stdlib api projects.shark.sharkLog + api projects.leakcanary.leakcanaryGc testImplementation libs.assertjCore testImplementation libs.junit diff --git a/object-watcher/object-watcher/src/main/java/leakcanary/GcTrigger.kt b/object-watcher/object-watcher/src/main/java/leakcanary/GcTrigger.kt deleted file mode 100644 index 309216a74..000000000 --- a/object-watcher/object-watcher/src/main/java/leakcanary/GcTrigger.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package leakcanary - -/** - * [GcTrigger] is used to try triggering garbage collection and enqueuing [KeyedWeakReference] into - * the associated [java.lang.ref.ReferenceQueue]. The default implementation [Default] comes from - * AOSP. - */ -fun interface GcTrigger { - - /** - * Attempts to run garbage collection. - */ - fun runGc() - - /** - * Default implementation of [GcTrigger]. - */ - object Default : GcTrigger { - override fun runGc() { - // Code taken from AOSP FinalizationTest: - // https://android.googlesource.com/platform/libcore/+/master/support/src/test/java/libcore/ - // java/lang/ref/FinalizationTester.java - // System.gc() does not garbage collect every time. Runtime.gc() is - // more likely to perform a gc. - Runtime.getRuntime() - .gc() - enqueueReferences() - System.runFinalization() - } - - private fun enqueueReferences() { - // Hack. We don't have a programmatic way to wait for the reference queue daemon to move - // references to the appropriate queues. - try { - Thread.sleep(100) - } catch (e: InterruptedException) { - throw AssertionError() - } - } - } -} diff --git a/object-watcher/object-watcher/src/test/java/leakcanary/ReferenceQueueRetainedObjectTrackerTest.kt b/object-watcher/object-watcher/src/test/java/leakcanary/ReferenceQueueRetainedObjectTrackerTest.kt index 89d5cd408..1e4b7882f 100644 --- a/object-watcher/object-watcher/src/test/java/leakcanary/ReferenceQueueRetainedObjectTrackerTest.kt +++ b/object-watcher/object-watcher/src/test/java/leakcanary/ReferenceQueueRetainedObjectTrackerTest.kt @@ -1,7 +1,6 @@ package leakcanary import kotlin.time.Duration.Companion.milliseconds -import leakcanary.GcTrigger.Default.runGc import org.assertj.core.api.Assertions.assertThat import org.junit.Test @@ -25,7 +24,7 @@ class ReferenceQueueRetainedObjectTrackerTest { ref!!, "unreachable object not retained" ) ref = null - runGc() + GcTrigger.inProcess().runGc() retainTrigger.markRetainedIfStronglyReachable() assertThat(referenceQueueReachabilityWatcher.hasRetainedObjects).isFalse() assertThat(objectRetainedListenerInvoked).isFalse() @@ -36,7 +35,7 @@ class ReferenceQueueRetainedObjectTrackerTest { referenceQueueReachabilityWatcher.expectDeletionOnTriggerFor( ref!!, "reachable object retained" ) - runGc() + GcTrigger.inProcess().runGc() retainTrigger.markRetainedIfStronglyReachable() assertThat(referenceQueueReachabilityWatcher.hasRetainedObjects).isTrue() assertThat(objectRetainedListenerInvoked).isTrue() diff --git a/samples/leakcanary-android-sample/src/debug/java/com/example/leakcanary/ExampleSetup.kt b/samples/leakcanary-android-sample/src/debug/java/com/example/leakcanary/ExampleSetup.kt index e1a55596a..34bc0eef9 100644 --- a/samples/leakcanary-android-sample/src/debug/java/com/example/leakcanary/ExampleSetup.kt +++ b/samples/leakcanary-android-sample/src/debug/java/com/example/leakcanary/ExampleSetup.kt @@ -19,6 +19,7 @@ import leakcanary.ReferenceQueueRetainedObjectTracker import leakcanary.RetainedObjectTracker import leakcanary.RootViewWatcher import leakcanary.ServiceWatcher +import leakcanary.inProcess class ExampleSetup { @@ -39,7 +40,7 @@ class ExampleSetup { application.checkRunningInDebuggableBuild() - val gcTrigger = GcTrigger.Default + val gcTrigger = GcTrigger.inProcess() val handlerThread = HandlerThread(LEAK_CANARY_THREAD_NAME) handlerThread.start() diff --git a/settings.gradle b/settings.gradle index e5319dd42..ba36b1d62 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,6 +11,7 @@ include ':leakcanary:leakcanary-app-aidl' include ':leakcanary:leakcanary-app-service' include ':leakcanary:leakcanary-core' include ':leakcanary:leakcanary-deobfuscation-gradle-plugin' +include ':leakcanary:leakcanary-gc' include ':leakcanary:leakcanary-jvm-test' include ':object-watcher:object-watcher' include ':object-watcher:object-watcher-android' diff --git a/shark/shark-android/api/shark-android.api b/shark/shark-android/api/shark-android.api index c0f6952db..c27bc93a1 100644 --- a/shark/shark-android/api/shark-android.api +++ b/shark/shark-android/api/shark-android.api @@ -16,32 +16,32 @@ public final class shark/AndroidExtensionsKt { public static final fun getIdentityHashCode (Lshark/HeapObject$HeapInstance;)Ljava/lang/Integer; } -public abstract class shark/AndroidHeapGrowthReferenceMatchers : java/lang/Enum, shark/ReferenceMatcher$ListBuilder { - public static final field ANDROID_LEAK_DETECTION_IGNORED_MATCHERS Lshark/AndroidHeapGrowthReferenceMatchers; - public static final field BINDER_PROXY Lshark/AndroidHeapGrowthReferenceMatchers; - public static final field COMPOSE_TEST_CONTEXT_STATES Lshark/AndroidHeapGrowthReferenceMatchers; - public static final field Companion Lshark/AndroidHeapGrowthReferenceMatchers$Companion; - public static final field HEAP_TRAVERSAL Lshark/AndroidHeapGrowthReferenceMatchers; - public static final field RESOURCES_THEME_REFS Lshark/AndroidHeapGrowthReferenceMatchers; - public static final field STRICT_MODE_VIOLATION_TIME Lshark/AndroidHeapGrowthReferenceMatchers; - public static final field VIEW_ROOT_IMPL_W_VIEW_ANCESTOR Lshark/AndroidHeapGrowthReferenceMatchers; - public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public static fun valueOf (Ljava/lang/String;)Lshark/AndroidHeapGrowthReferenceMatchers; - public static fun values ()[Lshark/AndroidHeapGrowthReferenceMatchers; -} - -public final class shark/AndroidHeapGrowthReferenceMatchers$Companion { - public final fun getDefaults ()Ljava/util/List; -} - public final class shark/AndroidMetadataExtractor : shark/MetadataExtractor { public static final field INSTANCE Lshark/AndroidMetadataExtractor; public fun extractMetadata (Lshark/HeapGraph;)Ljava/util/Map; } public final class shark/AndroidObjectGrowthDetectorKt { - public static final fun androidDetector (Lshark/ObjectGrowthDetector$Companion;Ljava/util/List;)Lshark/ObjectGrowthDetector; - public static synthetic fun androidDetector$default (Lshark/ObjectGrowthDetector$Companion;Ljava/util/List;ILjava/lang/Object;)Lshark/ObjectGrowthDetector; + public static final fun forAndroidHeap (Lshark/ObjectGrowthDetector$Companion;Ljava/util/List;)Lshark/ObjectGrowthDetector; + public static synthetic fun forAndroidHeap$default (Lshark/ObjectGrowthDetector$Companion;Ljava/util/List;ILjava/lang/Object;)Lshark/ObjectGrowthDetector; +} + +public abstract class shark/AndroidObjectGrowthReferenceMatchers : java/lang/Enum, shark/ReferenceMatcher$ListBuilder { + public static final field ANDROID_LEAK_DETECTION_IGNORED_MATCHERS Lshark/AndroidObjectGrowthReferenceMatchers; + public static final field BINDER_PROXY Lshark/AndroidObjectGrowthReferenceMatchers; + public static final field COMPOSE_TEST_CONTEXT_STATES Lshark/AndroidObjectGrowthReferenceMatchers; + public static final field Companion Lshark/AndroidObjectGrowthReferenceMatchers$Companion; + public static final field HEAP_TRAVERSAL Lshark/AndroidObjectGrowthReferenceMatchers; + public static final field RESOURCES_THEME_REFS Lshark/AndroidObjectGrowthReferenceMatchers; + public static final field STRICT_MODE_VIOLATION_TIME Lshark/AndroidObjectGrowthReferenceMatchers; + public static final field VIEW_ROOT_IMPL_W_VIEW_ANCESTOR Lshark/AndroidObjectGrowthReferenceMatchers; + public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public static fun valueOf (Ljava/lang/String;)Lshark/AndroidObjectGrowthReferenceMatchers; + public static fun values ()[Lshark/AndroidObjectGrowthReferenceMatchers; +} + +public final class shark/AndroidObjectGrowthReferenceMatchers$Companion { + public final fun getDefaults ()Ljava/util/List; } public abstract class shark/AndroidObjectInspectors : java/lang/Enum, shark/ObjectInspector { diff --git a/shark/shark-android/src/main/java/shark/AndroidObjectGrowthDetector.kt b/shark/shark-android/src/main/java/shark/AndroidObjectGrowthDetector.kt index a55945ef6..107cc39c7 100644 --- a/shark/shark-android/src/main/java/shark/AndroidObjectGrowthDetector.kt +++ b/shark/shark-android/src/main/java/shark/AndroidObjectGrowthDetector.kt @@ -1,7 +1,7 @@ package shark -fun ObjectGrowthDetector.Companion.androidDetector( - referenceMatchers: List = AndroidHeapGrowthReferenceMatchers.defaults +fun ObjectGrowthDetector.Companion.forAndroidHeap( + referenceMatchers: List = AndroidObjectGrowthReferenceMatchers.defaults ): ObjectGrowthDetector { return ObjectGrowthDetector( gcRootProvider = MatchingGcRootProvider(referenceMatchers), diff --git a/shark/shark-android/src/main/java/shark/AndroidHeapGrowthReferenceMatchers.kt b/shark/shark-android/src/main/java/shark/AndroidObjectGrowthReferenceMatchers.kt similarity index 95% rename from shark/shark-android/src/main/java/shark/AndroidHeapGrowthReferenceMatchers.kt rename to shark/shark-android/src/main/java/shark/AndroidObjectGrowthReferenceMatchers.kt index 874826cbe..44cd96556 100644 --- a/shark/shark-android/src/main/java/shark/AndroidHeapGrowthReferenceMatchers.kt +++ b/shark/shark-android/src/main/java/shark/AndroidObjectGrowthReferenceMatchers.kt @@ -4,7 +4,7 @@ import java.util.EnumSet import shark.ReferencePattern.Companion.instanceField import shark.ReferencePattern.Companion.staticField -enum class AndroidHeapGrowthReferenceMatchers : ReferenceMatcher.ListBuilder { +enum class AndroidObjectGrowthReferenceMatchers : ReferenceMatcher.ListBuilder { ANDROID_LEAK_DETECTION_IGNORED_MATCHERS { override fun add(references: MutableList) { @@ -72,7 +72,7 @@ enum class AndroidHeapGrowthReferenceMatchers : ReferenceMatcher.ListBuilder { companion object { val defaults: List get() = ReferenceMatcher.fromListBuilders( - EnumSet.allOf(AndroidHeapGrowthReferenceMatchers::class.java) + EnumSet.allOf(AndroidObjectGrowthReferenceMatchers::class.java) ) } } diff --git a/shark/shark-cli/src/main/java/shark/HeapGrowthCommand.kt b/shark/shark-cli/src/main/java/shark/HeapGrowthCommand.kt index e5d6a938e..daa512cd7 100644 --- a/shark/shark-cli/src/main/java/shark/HeapGrowthCommand.kt +++ b/shark/shark-cli/src/main/java/shark/HeapGrowthCommand.kt @@ -53,12 +53,12 @@ class HeapGrowthCommand : CliktCommand( } } ?: emptyList() - val referenceMatchers = AndroidHeapGrowthReferenceMatchers.defaults + + val referenceMatchers = AndroidObjectGrowthReferenceMatchers.defaults + ignoredInstanceFieldReferences + ignoredStaticFieldReferences val androidDetector = ObjectGrowthDetector - .androidDetector(referenceMatchers) + .forAndroidHeap(referenceMatchers) data class Metrics( val randomAccessByteReads: Long, @@ -103,7 +103,7 @@ class HeapGrowthCommand : CliktCommand( sourceProvider.openHeapGraph() } val detector = androidDetector - .fromHeapGraphSequence() + .repeatingHeapGraph() val results = detector.findRepeatedlyGrowingObjects( heapGraphSequence = heapGraphs, initialState = InitialState(scenarioLoopsPerDump, hprofFiles.size), diff --git a/shark/shark/api/shark.api b/shark/shark/api/shark.api index f03b3ac0a..c75f40ec2 100644 --- a/shark/shark/api/shark.api +++ b/shark/shark/api/shark.api @@ -279,26 +279,6 @@ public final class shark/HeapAnalyzer { public static synthetic fun analyze$default (Lshark/HeapAnalyzer;Ljava/io/File;Lshark/LeakingObjectFinder;Ljava/util/List;ZLjava/util/List;Lshark/MetadataExtractor;Lshark/ProguardMapping;ILjava/lang/Object;)Lshark/HeapAnalysis; } -public final class shark/HeapDumpingObjectGrowthDetector { - public fun (Lshark/HeapGraphProvider;Lshark/HeapGraphSequenceObjectGrowthDetector;II)V - public final fun findRepeatedlyGrowingObjects (Lkotlin/jvm/functions/Function0;)Lshark/HeapGrowthTraversal; -} - -public final class shark/HeapDumpingObjectGrowthDetectorKt { - public static final fun fromHeapDumpingRepeatedScenario (Lshark/ObjectGrowthDetector;Lshark/HeapGraphProvider;II)Lshark/HeapDumpingObjectGrowthDetector; - public static synthetic fun fromHeapDumpingRepeatedScenario$default (Lshark/ObjectGrowthDetector;Lshark/HeapGraphProvider;IIILjava/lang/Object;)Lshark/HeapDumpingObjectGrowthDetector; -} - -public final class shark/HeapGraphSequenceObjectGrowthDetector { - public fun (Lshark/ObjectGrowthDetector;)V - public final fun findRepeatedlyGrowingObjects (Lshark/InitialState;Lkotlin/sequences/Sequence;)Lshark/HeapGrowthTraversal; - public static synthetic fun findRepeatedlyGrowingObjects$default (Lshark/HeapGraphSequenceObjectGrowthDetector;Lshark/InitialState;Lkotlin/sequences/Sequence;ILjava/lang/Object;)Lshark/HeapGrowthTraversal; -} - -public final class shark/HeapGraphSequenceObjectGrowthDetectorKt { - public static final fun fromHeapGraphSequence (Lshark/ObjectGrowthDetector;)Lshark/HeapGraphSequenceObjectGrowthDetector; -} - public final class shark/HeapGrowthTraversal : shark/HeapTraversalOutput { public fun (ILshark/ShortestPathObjectNode;Ljava/util/List;Lshark/HeapTraversalInput;)V public final fun getGrowingObjects ()Ljava/util/List; @@ -373,8 +353,8 @@ public final class shark/JdkReferenceMatchers$Companion { } public final class shark/JvmObjectGrowthDetectorKt { - public static final fun jvmDetector (Lshark/ObjectGrowthDetector$Companion;Ljava/util/List;)Lshark/ObjectGrowthDetector; - public static synthetic fun jvmDetector$default (Lshark/ObjectGrowthDetector$Companion;Ljava/util/List;ILjava/lang/Object;)Lshark/ObjectGrowthDetector; + public static final fun forJvmHeap (Lshark/ObjectGrowthDetector$Companion;Ljava/util/List;)Lshark/ObjectGrowthDetector; + public static synthetic fun forJvmHeap$default (Lshark/ObjectGrowthDetector$Companion;Ljava/util/List;ILjava/lang/Object;)Lshark/ObjectGrowthDetector; } public final class shark/KeyedWeakReferenceFinder : shark/LeakingObjectFinder { @@ -930,6 +910,33 @@ public abstract interface class shark/ReferenceReader$Factory { public abstract fun createFor (Lshark/HeapGraph;)Lshark/ReferenceReader; } +public final class shark/RepeatingHeapGraphObjectGrowthDetector { + public fun (Lshark/ObjectGrowthDetector;)V + public final fun findRepeatedlyGrowingObjects (Lshark/InitialState;Lkotlin/sequences/Sequence;)Lshark/HeapGrowthTraversal; + public static synthetic fun findRepeatedlyGrowingObjects$default (Lshark/RepeatingHeapGraphObjectGrowthDetector;Lshark/InitialState;Lkotlin/sequences/Sequence;ILjava/lang/Object;)Lshark/HeapGrowthTraversal; +} + +public final class shark/RepeatingHeapGraphObjectGrowthDetectorKt { + public static final fun repeatingHeapGraph (Lshark/ObjectGrowthDetector;)Lshark/RepeatingHeapGraphObjectGrowthDetector; +} + +public final class shark/RepeatingScenarioObjectGrowthDetector { + public static final field Companion Lshark/RepeatingScenarioObjectGrowthDetector$Companion; + public static final field DEFAULT_MAX_HEAP_DUMPS I + public static final field DEFAULT_SCENARIO_LOOPS_PER_DUMP I + public fun (Lshark/HeapGraphProvider;Lshark/ObjectGrowthDetector;II)V + public synthetic fun (Lshark/HeapGraphProvider;Lshark/ObjectGrowthDetector;IIILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun findRepeatedlyGrowingObjects (Lkotlin/jvm/functions/Function0;)Lshark/HeapGrowthTraversal; +} + +public final class shark/RepeatingScenarioObjectGrowthDetector$Companion { +} + +public final class shark/RepeatingScenarioObjectGrowthDetectorKt { + public static final fun repeatingScenario (Lshark/ObjectGrowthDetector;Lshark/HeapGraphProvider;II)Lshark/RepeatingScenarioObjectGrowthDetector; + public static synthetic fun repeatingScenario$default (Lshark/ObjectGrowthDetector;Lshark/HeapGraphProvider;IIILjava/lang/Object;)Lshark/RepeatingScenarioObjectGrowthDetector; +} + public abstract interface class shark/ShortestPathFinder { public abstract fun findShortestPathsFromGcRoots (Ljava/util/Set;)Lshark/PathFindingResults; } diff --git a/shark/shark/src/main/java/shark/HeapDumpingObjectGrowthDetector.kt b/shark/shark/src/main/java/shark/HeapDumpingObjectGrowthDetector.kt deleted file mode 100644 index d0c2f40f9..000000000 --- a/shark/shark/src/main/java/shark/HeapDumpingObjectGrowthDetector.kt +++ /dev/null @@ -1,44 +0,0 @@ -package shark - -class HeapDumpingObjectGrowthDetector( - private val heapGraphProvider: HeapGraphProvider, - private val detector: HeapGraphSequenceObjectGrowthDetector, - maxHeapDumps: Int, - scenarioLoopsPerDump: Int, -) { - - private val initialState = InitialState( - scenarioLoopsPerGraph = scenarioLoopsPerDump, - heapGraphCount = maxHeapDumps - ) - - fun findRepeatedlyGrowingObjects(roundTripScenario: () -> Unit): HeapGrowthTraversal { - val heapGraphSequence = dumpHeapOnNext(roundTripScenario) - return detector.findRepeatedlyGrowingObjects( - initialState = initialState, - heapGraphSequence = heapGraphSequence, - ) - } - - private fun dumpHeapOnNext( - repeatedScenario: () -> Unit, - ): Sequence { - val heapDumps = (1..initialState.heapGraphCount!!).asSequence().map { - repeat(initialState.scenarioLoopsPerGraph) { - repeatedScenario() - } - heapGraphProvider.openHeapGraph() - } - return heapDumps - } -} - -fun ObjectGrowthDetector.fromHeapDumpingRepeatedScenario( - heapGraphProvider: HeapGraphProvider, - maxHeapDumps: Int = 5, - scenarioLoopsPerDump: Int = 1, -): HeapDumpingObjectGrowthDetector { - return HeapDumpingObjectGrowthDetector( - heapGraphProvider, fromHeapGraphSequence(), maxHeapDumps, scenarioLoopsPerDump - ) -} diff --git a/shark/shark/src/main/java/shark/JvmObjectGrowthDetector.kt b/shark/shark/src/main/java/shark/JvmObjectGrowthDetector.kt index 645ed9628..5365d3f50 100644 --- a/shark/shark/src/main/java/shark/JvmObjectGrowthDetector.kt +++ b/shark/shark/src/main/java/shark/JvmObjectGrowthDetector.kt @@ -1,6 +1,6 @@ package shark -fun ObjectGrowthDetector.Companion.jvmDetector( +fun ObjectGrowthDetector.Companion.forJvmHeap( referenceMatchers: List = JdkReferenceMatchers.defaults + HeapTraversalOutput.ignoredReferences ): ObjectGrowthDetector { diff --git a/shark/shark/src/main/java/shark/HeapGraphSequenceObjectGrowthDetector.kt b/shark/shark/src/main/java/shark/RepeatingHeapGraphObjectGrowthDetector.kt similarity index 56% rename from shark/shark/src/main/java/shark/HeapGraphSequenceObjectGrowthDetector.kt rename to shark/shark/src/main/java/shark/RepeatingHeapGraphObjectGrowthDetector.kt index 62946e6fa..ed6d3f2c8 100644 --- a/shark/shark/src/main/java/shark/HeapGraphSequenceObjectGrowthDetector.kt +++ b/shark/shark/src/main/java/shark/RepeatingHeapGraphObjectGrowthDetector.kt @@ -1,9 +1,18 @@ package shark -class HeapGraphSequenceObjectGrowthDetector( +/** + * @see findRepeatedlyGrowingObjects + */ +class RepeatingHeapGraphObjectGrowthDetector( private val objectGrowthDetector: ObjectGrowthDetector ) { + /** + * Detects object growth by iterating through [heapGraphSequence] repeatedly until no object + * growth is detected or the sequence ends. Returns the [HeapGrowthTraversal] for the last + * iteration. You can check [HeapGrowthTraversal.isGrowing] and + * [HeapGrowthTraversal.growingObjects] to report object growth. + */ fun findRepeatedlyGrowingObjects( initialState: InitialState = InitialState(), heapGraphSequence: Sequence, @@ -27,6 +36,9 @@ class HeapGraphSequenceObjectGrowthDetector( } } -fun ObjectGrowthDetector.fromHeapGraphSequence(): HeapGraphSequenceObjectGrowthDetector { - return HeapGraphSequenceObjectGrowthDetector(this) +/** + * @see RepeatingHeapGraphObjectGrowthDetector.findRepeatedlyGrowingObjects + */ +fun ObjectGrowthDetector.repeatingHeapGraph(): RepeatingHeapGraphObjectGrowthDetector { + return RepeatingHeapGraphObjectGrowthDetector(this) } diff --git a/shark/shark/src/main/java/shark/RepeatingScenarioObjectGrowthDetector.kt b/shark/shark/src/main/java/shark/RepeatingScenarioObjectGrowthDetector.kt new file mode 100644 index 000000000..7ebcdbc43 --- /dev/null +++ b/shark/shark/src/main/java/shark/RepeatingScenarioObjectGrowthDetector.kt @@ -0,0 +1,69 @@ +package shark + +/** + * @see [findRepeatedlyGrowingObjects] + */ +class RepeatingScenarioObjectGrowthDetector( + /** + * Dumps the heap and opens the heap dump file as a [shark.CloseableHeapGraph] + */ + private val heapGraphProvider: HeapGraphProvider, + objectGrowthDetector: ObjectGrowthDetector, + maxHeapDumps: Int = DEFAULT_MAX_HEAP_DUMPS, + scenarioLoopsPerDump: Int = DEFAULT_SCENARIO_LOOPS_PER_DUMP, +) { + + private val repeatingHeapGraphDetector = objectGrowthDetector.repeatingHeapGraph() + + private val initialState = InitialState( + scenarioLoopsPerGraph = scenarioLoopsPerDump, + heapGraphCount = maxHeapDumps + ) + + /** + * Detects object growth by iterating through [roundTripScenario] repeatedly and dumping the heap + * every `scenarioLoopsPerDump` until no object growth is detected or we reach `maxHeapDumps`. + * Returns the [HeapGrowthTraversal] for the last iteration. You can check + * [HeapGrowthTraversal.isGrowing] and [HeapGrowthTraversal.growingObjects] to report object growth. + */ + fun findRepeatedlyGrowingObjects(roundTripScenario: () -> Unit): HeapGrowthTraversal { + val heapGraphSequence = dumpHeapOnNext(roundTripScenario) + return repeatingHeapGraphDetector.findRepeatedlyGrowingObjects( + initialState = initialState, + heapGraphSequence = heapGraphSequence, + ) + } + + private fun dumpHeapOnNext( + repeatedScenario: () -> Unit, + ): Sequence { + val heapDumps = (1..initialState.heapGraphCount!!).asSequence().map { + repeat(initialState.scenarioLoopsPerGraph) { + repeatedScenario() + } + heapGraphProvider.openHeapGraph() + } + return heapDumps + } + + companion object { + const val DEFAULT_MAX_HEAP_DUMPS = 5 + const val DEFAULT_SCENARIO_LOOPS_PER_DUMP = 1 + } +} + +/** + * @see [RepeatingScenarioObjectGrowthDetector.findRepeatedlyGrowingObjects]. + */ +fun ObjectGrowthDetector.repeatingScenario( + heapGraphProvider: HeapGraphProvider, + maxHeapDumps: Int = RepeatingScenarioObjectGrowthDetector.DEFAULT_MAX_HEAP_DUMPS, + scenarioLoopsPerDump: Int = RepeatingScenarioObjectGrowthDetector.DEFAULT_SCENARIO_LOOPS_PER_DUMP, +): RepeatingScenarioObjectGrowthDetector { + return RepeatingScenarioObjectGrowthDetector( + heapGraphProvider = heapGraphProvider, + objectGrowthDetector = this, + maxHeapDumps = maxHeapDumps, + scenarioLoopsPerDump = scenarioLoopsPerDump + ) +} diff --git a/shark/shark/src/test/java/shark/LiveObjectGrowthDetectorTest.kt b/shark/shark/src/test/java/shark/LiveObjectGrowthDetectorTest.kt index d4f8a6160..cfae958e9 100644 --- a/shark/shark/src/test/java/shark/LiveObjectGrowthDetectorTest.kt +++ b/shark/shark/src/test/java/shark/LiveObjectGrowthDetectorTest.kt @@ -168,8 +168,8 @@ class LiveObjectGrowthDetectorTest { private fun ObjectGrowthDetector.fromScenario( scenarioLoopsPerDump: Int = 1, maxHeapDumps: Int = 5 - ): HeapDumpingObjectGrowthDetector { - return fromHeapDumpingRepeatedScenario( + ): RepeatingScenarioObjectGrowthDetector { + return repeatingScenario( heapGraphProvider = ::dumpHeapGraph, maxHeapDumps = maxHeapDumps, scenarioLoopsPerDump = scenarioLoopsPerDump diff --git a/shark/shark/src/test/java/shark/ObjectGrowthDetectorTest.kt b/shark/shark/src/test/java/shark/ObjectGrowthDetectorTest.kt index 3a077dbed..6623b87c2 100644 --- a/shark/shark/src/test/java/shark/ObjectGrowthDetectorTest.kt +++ b/shark/shark/src/test/java/shark/ObjectGrowthDetectorTest.kt @@ -133,7 +133,7 @@ class ObjectGrowthDetectorTest { heapDumps: List, scenarioLoopsPerGraph: Int = 1 ): GrowingObjectNodes { - return fromHeapGraphSequence().findRepeatedlyGrowingObjects( + return repeatingHeapGraph().findRepeatedlyGrowingObjects( initialState = InitialState( scenarioLoopsPerGraph = scenarioLoopsPerGraph, heapGraphCount = heapDumps.size