debug: heap size

This commit is contained in:
Thibault Deckers 2024-03-09 20:03:28 +01:00
parent 6192dea599
commit 01802f8aaa
4 changed files with 21 additions and 1 deletions

View file

@ -14,6 +14,7 @@ import androidx.work.ForegroundInfo
import androidx.work.WorkManager import androidx.work.WorkManager
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import app.loup.streams_channel.StreamsChannel 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.DeviceHandler
import deckers.thibault.aves.channel.calls.GeocodingHandler import deckers.thibault.aves.channel.calls.GeocodingHandler
import deckers.thibault.aves.channel.calls.MediaStoreHandler import deckers.thibault.aves.channel.calls.MediaStoreHandler
@ -86,6 +87,7 @@ class AnalysisWorker(context: Context, parameters: WorkerParameters) : Coroutine
// dart -> platform -> dart // dart -> platform -> dart
// - need Context // - need Context
MethodChannel(messenger, DebugHandler.CHANNEL).setMethodCallHandler(DebugHandler(context))
MethodChannel(messenger, DeviceHandler.CHANNEL).setMethodCallHandler(DeviceHandler(context)) MethodChannel(messenger, DeviceHandler.CHANNEL).setMethodCallHandler(DeviceHandler(context))
MethodChannel(messenger, GeocodingHandler.CHANNEL).setMethodCallHandler(GeocodingHandler(context)) MethodChannel(messenger, GeocodingHandler.CHANNEL).setMethodCallHandler(GeocodingHandler(context))
MethodChannel(messenger, MediaStoreHandler.CHANNEL).setMethodCallHandler(MediaStoreHandler(context)) MethodChannel(messenger, MediaStoreHandler.CHANNEL).setMethodCallHandler(MediaStoreHandler(context))

View file

@ -20,6 +20,7 @@ import deckers.thibault.aves.metadata.Mp4ParserHelper.dumpBoxes
import deckers.thibault.aves.metadata.metadataextractor.Helper import deckers.thibault.aves.metadata.metadataextractor.Helper
import deckers.thibault.aves.model.FieldMap import deckers.thibault.aves.model.FieldMap
import deckers.thibault.aves.utils.LogUtils import deckers.thibault.aves.utils.LogUtils
import deckers.thibault.aves.utils.MemoryUtils
import deckers.thibault.aves.utils.MimeTypes import deckers.thibault.aves.utils.MimeTypes
import deckers.thibault.aves.utils.MimeTypes.canReadWithExifInterface import deckers.thibault.aves.utils.MimeTypes.canReadWithExifInterface
import deckers.thibault.aves.utils.MimeTypes.canReadWithMetadataExtractor import deckers.thibault.aves.utils.MimeTypes.canReadWithMetadataExtractor
@ -52,6 +53,7 @@ class DebugHandler(private val context: Context) : MethodCallHandler {
"exceptionInCoroutine" -> ioScope.launch { throw TestException() } "exceptionInCoroutine" -> ioScope.launch { throw TestException() }
"safeExceptionInCoroutine" -> ioScope.launch { safe(call, result) { _, _ -> throw TestException() } } "safeExceptionInCoroutine" -> ioScope.launch { safe(call, result) { _, _ -> throw TestException() } }
"getAvailableHeapSize" -> safe(call, result, ::getAvailableHeapSize)
"getContextDirs" -> ioScope.launch { safe(call, result, ::getContextDirs) } "getContextDirs" -> ioScope.launch { safe(call, result, ::getContextDirs) }
"getCodecs" -> safe(call, result, ::getCodecs) "getCodecs" -> safe(call, result, ::getCodecs)
"getEnv" -> safe(call, result, ::getEnv) "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) { private fun getContextDirs(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) {
val dirs = hashMapOf( val dirs = hashMapOf(
"cacheDir" to context.cacheDir, "cacheDir" to context.cacheDir,

View file

@ -7,11 +7,13 @@ object MemoryUtils {
fun canAllocate(byteSize: Number?): Boolean { fun canAllocate(byteSize: Number?): Boolean {
byteSize ?: return true byteSize ?: return true
val availableHeapSize = Runtime.getRuntime().let { it.maxMemory() - (it.totalMemory() - it.freeMemory()) } val availableHeapSize = getAvailableHeapSize()
val danger = byteSize.toLong() > availableHeapSize val danger = byteSize.toLong() > availableHeapSize
if (danger) { if (danger) {
Log.e(LOG_TAG, "trying to handle $byteSize bytes, with only $availableHeapSize free bytes") Log.e(LOG_TAG, "trying to handle $byteSize bytes, with only $availableHeapSize free bytes")
} }
return !danger return !danger
} }
fun getAvailableHeapSize() = Runtime.getRuntime().let { it.maxMemory() - (it.totalMemory() - it.freeMemory()) }
} }

View file

@ -46,6 +46,16 @@ class AndroidDebugService {
} }
} }
static Future<int> 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<Map> getContextDirs() async { static Future<Map> getContextDirs() async {
try { try {
final result = await _platform.invokeMethod('getContextDirs'); final result = await _platform.invokeMethod('getContextDirs');