From 01802f8aaaa193583d961990bb5f375b9671e73d Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sat, 9 Mar 2024 20:03:28 +0100 Subject: [PATCH] debug: heap size --- .../kotlin/deckers/thibault/aves/AnalysisWorker.kt | 2 ++ .../thibault/aves/channel/calls/DebugHandler.kt | 6 ++++++ .../kotlin/deckers/thibault/aves/utils/MemoryUtils.kt | 4 +++- lib/services/android_debug_service.dart | 10 ++++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt b/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt index 7de3a0c49..b0880ca04 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt @@ -14,6 +14,7 @@ import androidx.work.ForegroundInfo import androidx.work.WorkManager import androidx.work.WorkerParameters import app.loup.streams_channel.StreamsChannel +import deckers.thibault.aves.channel.calls.DebugHandler import deckers.thibault.aves.channel.calls.DeviceHandler import deckers.thibault.aves.channel.calls.GeocodingHandler import deckers.thibault.aves.channel.calls.MediaStoreHandler @@ -86,6 +87,7 @@ class AnalysisWorker(context: Context, parameters: WorkerParameters) : Coroutine // dart -> platform -> dart // - need Context + MethodChannel(messenger, DebugHandler.CHANNEL).setMethodCallHandler(DebugHandler(context)) MethodChannel(messenger, DeviceHandler.CHANNEL).setMethodCallHandler(DeviceHandler(context)) MethodChannel(messenger, GeocodingHandler.CHANNEL).setMethodCallHandler(GeocodingHandler(context)) MethodChannel(messenger, MediaStoreHandler.CHANNEL).setMethodCallHandler(MediaStoreHandler(context)) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt index 812b86e91..75b3544f8 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt @@ -20,6 +20,7 @@ import deckers.thibault.aves.metadata.Mp4ParserHelper.dumpBoxes import deckers.thibault.aves.metadata.metadataextractor.Helper import deckers.thibault.aves.model.FieldMap import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MemoryUtils import deckers.thibault.aves.utils.MimeTypes import deckers.thibault.aves.utils.MimeTypes.canReadWithExifInterface import deckers.thibault.aves.utils.MimeTypes.canReadWithMetadataExtractor @@ -52,6 +53,7 @@ class DebugHandler(private val context: Context) : MethodCallHandler { "exceptionInCoroutine" -> ioScope.launch { throw TestException() } "safeExceptionInCoroutine" -> ioScope.launch { safe(call, result) { _, _ -> throw TestException() } } + "getAvailableHeapSize" -> safe(call, result, ::getAvailableHeapSize) "getContextDirs" -> ioScope.launch { safe(call, result, ::getContextDirs) } "getCodecs" -> safe(call, result, ::getCodecs) "getEnv" -> safe(call, result, ::getEnv) @@ -68,6 +70,10 @@ class DebugHandler(private val context: Context) : MethodCallHandler { } } + private fun getAvailableHeapSize(@Suppress("unused_parameter") methodCall: MethodCall, result: MethodChannel.Result) { + result.success(MemoryUtils.getAvailableHeapSize()) + } + private fun getContextDirs(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { val dirs = hashMapOf( "cacheDir" to context.cacheDir, diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MemoryUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MemoryUtils.kt index dc2a74859..fc91e2dea 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MemoryUtils.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MemoryUtils.kt @@ -7,11 +7,13 @@ object MemoryUtils { fun canAllocate(byteSize: Number?): Boolean { byteSize ?: return true - val availableHeapSize = Runtime.getRuntime().let { it.maxMemory() - (it.totalMemory() - it.freeMemory()) } + val availableHeapSize = getAvailableHeapSize() val danger = byteSize.toLong() > availableHeapSize if (danger) { Log.e(LOG_TAG, "trying to handle $byteSize bytes, with only $availableHeapSize free bytes") } return !danger } + + fun getAvailableHeapSize() = Runtime.getRuntime().let { it.maxMemory() - (it.totalMemory() - it.freeMemory()) } } \ No newline at end of file diff --git a/lib/services/android_debug_service.dart b/lib/services/android_debug_service.dart index 9acb772da..33b352fe0 100644 --- a/lib/services/android_debug_service.dart +++ b/lib/services/android_debug_service.dart @@ -46,6 +46,16 @@ class AndroidDebugService { } } + static Future getAvailableHeapSize() async { + try { + final result = await _platform.invokeMethod('getAvailableHeapSize'); + if (result != null) return result as int; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return 0; + } + static Future getContextDirs() async { try { final result = await _platform.invokeMethod('getContextDirs');