From 337b597c914f625d5989cad98615f761a22fede3 Mon Sep 17 00:00:00 2001 From: rahullohra Date: Tue, 1 Jul 2025 13:57:02 +0530 Subject: [PATCH 1/2] fix: Add a safe check before before we start writing logs to file --- .../io/getstream/log/file/FileStreamLogger.kt | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/stream-log-android-file/src/main/kotlin/io/getstream/log/file/FileStreamLogger.kt b/stream-log-android-file/src/main/kotlin/io/getstream/log/file/FileStreamLogger.kt index 5bdca2b..d3a45c3 100644 --- a/stream-log-android-file/src/main/kotlin/io/getstream/log/file/FileStreamLogger.kt +++ b/stream-log-android-file/src/main/kotlin/io/getstream/log/file/FileStreamLogger.kt @@ -15,6 +15,7 @@ */ package io.getstream.log.file +import android.util.Log import io.getstream.log.Priority import io.getstream.log.StreamLogger import io.getstream.log.helper.stringify @@ -23,6 +24,7 @@ import java.io.BufferedWriter import java.io.Closeable import java.io.File import java.io.FileOutputStream +import java.io.IOException import java.io.OutputStreamWriter import java.io.PrintWriter import java.io.Writer @@ -90,8 +92,14 @@ public class FileStreamLogger( } public fun clear(): Unit = executor.execute { - internalFile0.writeText("") - internalFile1.writeText("") + + if (internalFile0.exists()) { + internalFile0.writeText("") + } + + if (internalFile1.exists()) { + internalFile1.writeText("") + } } private fun initIfNeeded() { @@ -101,8 +109,28 @@ public class FileStreamLogger( internalFile0.lastModified() > internalFile1.lastModified() -> internalFile0 else -> internalFile1 } - currentFile = internalFile - currentWriter = internalFile.fileWriter() + /** + * On some Android 11+ devices (especially Chinese OEMs), we observed that creating files + * using File(...) and createNewFile() can fail unexpectedly (background/doze modes/RAM cleaning/device cleanup utilities) with FileNotFoundException or EINVAL, + * even when writing to internal storage. + * This helper ensures safe creation of files by handling edge cases and logging issues to improve + * stability across all devices. + */ + if (!internalFile.exists()) { + try { + internalFile.createNewFile() + } catch (e: IOException) { + Log.e("FileInit", "Failed to create file: ${internalFile.absolutePath}", e) + return + } + } + + if (internalFile.canWrite()) { + currentFile = internalFile + currentWriter = internalFile.fileWriter() + } else { + Log.e("FileInit", "File is not writable: ${internalFile.absolutePath}") + } } } From ee5815c7a7bc01a46cd98cb26f9914df75ce0f0b Mon Sep 17 00:00:00 2001 From: rahullohra Date: Tue, 1 Jul 2025 17:31:35 +0530 Subject: [PATCH 2/2] fix: Add a safe check before before initialising current writer --- .../io/getstream/log/file/FileStreamLogger.kt | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/stream-log-android-file/src/main/kotlin/io/getstream/log/file/FileStreamLogger.kt b/stream-log-android-file/src/main/kotlin/io/getstream/log/file/FileStreamLogger.kt index d3a45c3..e430a3b 100644 --- a/stream-log-android-file/src/main/kotlin/io/getstream/log/file/FileStreamLogger.kt +++ b/stream-log-android-file/src/main/kotlin/io/getstream/log/file/FileStreamLogger.kt @@ -24,7 +24,6 @@ import java.io.BufferedWriter import java.io.Closeable import java.io.File import java.io.FileOutputStream -import java.io.IOException import java.io.OutputStreamWriter import java.io.PrintWriter import java.io.Writer @@ -119,18 +118,16 @@ public class FileStreamLogger( if (!internalFile.exists()) { try { internalFile.createNewFile() - } catch (e: IOException) { - Log.e("FileInit", "Failed to create file: ${internalFile.absolutePath}", e) + + if (internalFile.canWrite()) { + currentFile = internalFile + currentWriter = internalFile.fileWriter() + } + } catch (e: Exception) { + Log.e("FileInit", "Failed to create or write to file: ${internalFile.absolutePath}", e) return } } - - if (internalFile.canWrite()) { - currentFile = internalFile - currentWriter = internalFile.fileWriter() - } else { - Log.e("FileInit", "File is not writable: ${internalFile.absolutePath}") - } } }