From db717d35ff4aaf475d81c0472202f083e8c7c1bb Mon Sep 17 00:00:00 2001 From: Abhishek Pandey <64667840+1abhishekpandey@users.noreply.github.com> Date: Mon, 14 Oct 2024 21:59:23 +0530 Subject: [PATCH 1/9] fix: handle db crash issue on Amazon devices (#480) * fix: handle SQLiteCantOpenDatabaseException * chore: improve error message --- .../sdk/core/persistence/DefaultPersistence.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/persistence/DefaultPersistence.java b/core/src/main/java/com/rudderstack/android/sdk/core/persistence/DefaultPersistence.java index 177cb761f..93e397759 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/persistence/DefaultPersistence.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/persistence/DefaultPersistence.java @@ -4,6 +4,7 @@ import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; +import android.database.sqlite.SQLiteCantOpenDatabaseException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.os.Build; @@ -258,7 +259,12 @@ public void addDbCloseListener(DbCloseListener listener) { @Override public boolean isAccessible() { - return getWritableDatabase().isOpen(); + try { + return getWritableDatabase().isOpen(); + } catch (SQLiteCantOpenDatabaseException ex) { + RudderLogger.logError("DefaultPersistence: isAccessible: Exception while checking the accessibility of the database due to " + ex); + return false; + } } static class DbParams { final String dbName; @@ -271,4 +277,4 @@ public DbParams(String dbName, int dbVersion) { } } -//END-NO-SONAR-SCAN \ No newline at end of file +//END-NO-SONAR-SCAN From 179c26276d9c875d9ebeec6d8ed8d3c105bc805a Mon Sep 17 00:00:00 2001 From: Abhishek Pandey <64667840+1abhishekpandey@users.noreply.github.com> Date: Fri, 6 Dec 2024 16:17:57 +0530 Subject: [PATCH 2/9] feat: add alias api with previousId support (#485) --- .../android/sdk/core/RudderClient.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/RudderClient.java b/core/src/main/java/com/rudderstack/android/sdk/core/RudderClient.java index 72376ebaa..056ee063d 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/RudderClient.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/RudderClient.java @@ -467,7 +467,11 @@ void alias(@NonNull RudderMessage message) { * @param newId New userId for the user */ public void alias(String newId) { - alias(newId, null); + alias(newId, null, null); + } + + public void alias(@NonNull String newId, @Nullable RudderOption option) { + alias(newId, option, null); } /** @@ -478,7 +482,7 @@ public void alias(String newId) { * @param newId New userId for the user * @param option RudderOptions for this event */ - public void alias(@NonNull String newId, @Nullable RudderOption option) { + public void alias(@NonNull String newId, @Nullable RudderOption option, @Nullable String previousId) { RudderContext context = getRudderContext(); Map traits = null; if (context != null) { @@ -488,12 +492,16 @@ public void alias(@NonNull String newId, @Nullable RudderOption option) { return; String prevUserId = null; - if (traits.containsKey("userId")) { - prevUserId = (String) traits.get("userId"); - } else if (traits.containsKey("id")) { - prevUserId = (String) traits.get("id"); + if (previousId != null) { + prevUserId = previousId; } else { - prevUserId = RudderContext.getAnonymousId(); + if (traits.containsKey("userId")) { + prevUserId = (String) traits.get("userId"); + } else if (traits.containsKey("id")) { + prevUserId = (String) traits.get("id"); + } else { + prevUserId = RudderContext.getAnonymousId(); + } } traits.put("userId", newId); From 4579fc2e936957ece459e6541c290a2bc2a9c6ac Mon Sep 17 00:00:00 2001 From: Abhishek Pandey <64667840+1abhishekpandey@users.noreply.github.com> Date: Fri, 6 Dec 2024 16:48:54 +0530 Subject: [PATCH 3/9] fix: handle invalid json issue (#486) * fix: handle invalid message json * refactor: use cleanUpEvents() * chore: add doc * fix: handle scenario with multiple invalid and valid events in a single batch Previously, Invalid events were not being marked as device mode processing done. --- .../android/sdk/core/FlushUtils.java | 32 ++++++++++++------- .../sdk/core/RudderCloudModeManager.java | 10 ++++-- .../sdk/core/RudderDeviceModeManager.java | 2 ++ 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/FlushUtils.java b/core/src/main/java/com/rudderstack/android/sdk/core/FlushUtils.java index 3fd23aa43..07c8c7418 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/FlushUtils.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/FlushUtils.java @@ -13,6 +13,7 @@ import static com.rudderstack.android.sdk.core.RudderNetworkManager.Result; import static com.rudderstack.android.sdk.core.util.Utils.getBatch; import static com.rudderstack.android.sdk.core.util.Utils.getNumberOfBatches; +import androidx.annotation.Nullable; import android.text.TextUtils; @@ -88,6 +89,7 @@ static boolean flushToServer(int flushQueueSize, String dataPlaneUrl, DBPersiste } else { lastErrorMessage = ReportManager.LABEL_TYPE_PAYLOAD_NULL; + dbManager.markCloudModeDone(batchMessageIds); } RudderLogger.logWarn(String.format(Locale.US, "EventRepository: flush: Failed to send batch %d/%d retrying again, %d retries left", i, numberOfBatches, retries)); } @@ -132,6 +134,7 @@ private static void reportBatchesAndMessages(int numberOfBatches, int messagesSi * of deserialization and forming the payload object and creating the json string * again from the object * */ + @Nullable static String getPayloadFromMessages(List messageIds, List messages) { if (messageIds.isEmpty() || messages.isEmpty()) { RudderLogger.logWarn("FlushUtils: getPayloadFromMessages: Payload Construction failed: no messages to send"); @@ -159,22 +162,27 @@ static String getPayloadFromMessages(List messageIds, List mess String message = messages.get(index); // strip last ending object character message = message.substring(0, message.length() - 1); - // add sentAt time stamp - message = String.format("%s,\"sentAt\":\"%s\"},", message, sentAtTimestamp); - // add message size to batch size - messageSize = Utils.getUTF8Length(message); - totalBatchSize += messageSize; - // check batch size - if (totalBatchSize >= Utils.MAX_BATCH_SIZE) { - RudderLogger.logDebug(String.format(Locale.US, "FlushUtils: getPayloadFromMessages: MAX_BATCH_SIZE reached at index: %d | Total: %d", index, totalBatchSize)); - incrementDiscardedCounter(1, Collections.singletonMap(LABEL_TYPE, ReportManager.LABEL_TYPE_BATCH_SIZE_INVALID)); - break; + // Handle Invalid Message whose length is 0 + if (!message.isEmpty()) { + // add sentAt time stamp + message = String.format("%s,\"sentAt\":\"%s\"},", message, sentAtTimestamp); + // add message size to batch size + messageSize = Utils.getUTF8Length(message); + totalBatchSize += messageSize; + // check batch size + if (totalBatchSize >= Utils.MAX_BATCH_SIZE) { + RudderLogger.logDebug(String.format(Locale.US, "FlushUtils: getPayloadFromMessages: MAX_BATCH_SIZE reached at index: %d | Total: %d", index, totalBatchSize)); + incrementDiscardedCounter(1, Collections.singletonMap(LABEL_TYPE, ReportManager.LABEL_TYPE_BATCH_SIZE_INVALID)); + break; + } + // finally add message string to builder + batchMessagesBuilder.append(message); } - // finally add message string to builder - batchMessagesBuilder.append(message); // add message to batch ArrayLists batchMessageIds.add(messageIds.get(index)); } + // If the batchMessagesBuilder is empty, return null + if (batchMessagesBuilder.length() == 0) return null; if (batchMessagesBuilder.charAt(batchMessagesBuilder.length() - 1) == ',') { // remove trailing ',' batchMessagesBuilder.deleteCharAt(batchMessagesBuilder.length() - 1); diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/RudderCloudModeManager.java b/core/src/main/java/com/rudderstack/android/sdk/core/RudderCloudModeManager.java index b0845970c..025037355 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/RudderCloudModeManager.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/RudderCloudModeManager.java @@ -63,14 +63,15 @@ public void run() { RudderLogger.logInfo(String.format(Locale.US, "CloudModeManager: cloudModeProcessor: ServerResponse: %d", result.statusCode)); if (result.status == NetworkResponses.SUCCESS) { ReportManager.incrementCloudModeUploadSuccessCounter(messageIds.size()); - dbManager.markCloudModeDone(messageIds); - dbManager.runGcForEvents(); + cleanUpEvents(messageIds); exponentialBackOff.resetBackOff(); upTimeInMillis = Utils.getUpTimeInMillis(); sleepCount = Utils.getSleepDurationInSecond(upTimeInMillis, Utils.getUpTimeInMillis()); } else { incrementCloudModeUploadRetryCounter(1); } + } else { + cleanUpEvents(messageIds); } } } @@ -112,6 +113,11 @@ public void run() { }.start(); } + private void cleanUpEvents(List messageIds) { + dbManager.markCloudModeDone(messageIds); + dbManager.runGcForEvents(); + } + private void deleteEventsWithoutAnonymousId(ArrayList messages, ArrayList messageIds) { List eventsToDelete = new ArrayList<>(); for (int i = 0; i < messages.size(); i++) { diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/RudderDeviceModeManager.java b/core/src/main/java/com/rudderstack/android/sdk/core/RudderDeviceModeManager.java index 668623323..dcf20c15c 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/RudderDeviceModeManager.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/RudderDeviceModeManager.java @@ -246,6 +246,8 @@ private void replayMessageQueue() { RudderMessage message = RudderGson.deserialize(messages.get(i), RudderMessage.class); if (message != null) { processMessage(message, messageIds.get(i), true); + } else { + markDeviceModeTransformationDone(messageIds.get(i)); } } catch (Exception e) { ReportManager.reportError(e); From ca9682edd8679cc6f66c0a13281394ec777ac2eb Mon Sep 17 00:00:00 2001 From: Vishal Gupta Date: Fri, 6 Dec 2024 13:13:26 +0530 Subject: [PATCH 4/9] refactor: catch OutOfMemoryError in RudderCloudModeManager --- .../sdk/core/RudderCloudModeManager.java | 62 ++++++++++--------- .../android/sdk/core/util/Utils.java | 9 +++ 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/RudderCloudModeManager.java b/core/src/main/java/com/rudderstack/android/sdk/core/RudderCloudModeManager.java index 025037355..97cd73b19 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/RudderCloudModeManager.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/RudderCloudModeManager.java @@ -44,39 +44,39 @@ public void run() { final ArrayList messages = new ArrayList<>(); final ExponentialBackOff exponentialBackOff = new ExponentialBackOff(5 * 60); // 5 minutes while (true) { - // clear lists for reuse - messageIds.clear(); - messages.clear(); - result = null; - maintainDBThreshold(); - long sleepCount = Utils.getSleepDurationInSecond(upTimeInMillis, Utils.getUpTimeInMillis()); - RudderLogger.logDebug("CloudModeManager: cloudModeProcessor: Fetching events to flush to server"); - synchronized (MessageUploadLock.UPLOAD_LOCK) { - dbManager.fetchCloudModeEventsFromDB(messageIds, messages, config.getFlushQueueSize()); - if (messages.size() >= config.getFlushQueueSize() || (!messages.isEmpty() && sleepCount >= config.getSleepTimeOut())) { - // form payload JSON form the list of messages - String payload = FlushUtils.getPayloadFromMessages(messageIds, messages); - RudderLogger.logDebug(String.format(Locale.US, "CloudModeManager: cloudModeProcessor: payload: %s", payload)); - RudderLogger.logInfo(String.format(Locale.US, "CloudModeManager: cloudModeProcessor: %d", messageIds.size())); - if (payload != null) { - result = networkManager.sendNetworkRequest(payload, addEndPoint(dataResidencyManager.getDataPlaneUrl(), BATCH_ENDPOINT), RequestMethod.POST, true); - RudderLogger.logInfo(String.format(Locale.US, "CloudModeManager: cloudModeProcessor: ServerResponse: %d", result.statusCode)); - if (result.status == NetworkResponses.SUCCESS) { - ReportManager.incrementCloudModeUploadSuccessCounter(messageIds.size()); - cleanUpEvents(messageIds); - exponentialBackOff.resetBackOff(); - upTimeInMillis = Utils.getUpTimeInMillis(); - sleepCount = Utils.getSleepDurationInSecond(upTimeInMillis, Utils.getUpTimeInMillis()); + try { + // clear lists for reuse + messageIds.clear(); + messages.clear(); + result = null; + maintainDBThreshold(); + long sleepCount = Utils.getSleepDurationInSecond(upTimeInMillis, Utils.getUpTimeInMillis()); + RudderLogger.logDebug("CloudModeManager: cloudModeProcessor: Fetching events to flush to server"); + synchronized (MessageUploadLock.UPLOAD_LOCK) { + dbManager.fetchCloudModeEventsFromDB(messageIds, messages, config.getFlushQueueSize()); + if (messages.size() >= config.getFlushQueueSize() || (!messages.isEmpty() && sleepCount >= config.getSleepTimeOut())) { + // form payload JSON form the list of messages + String payload = FlushUtils.getPayloadFromMessages(messageIds, messages); + RudderLogger.logDebug(String.format(Locale.US, "CloudModeManager: cloudModeProcessor: payload: %s", payload)); + RudderLogger.logInfo(String.format(Locale.US, "CloudModeManager: cloudModeProcessor: %d", messageIds.size())); + if (payload != null) { + result = networkManager.sendNetworkRequest(payload, addEndPoint(dataResidencyManager.getDataPlaneUrl(), BATCH_ENDPOINT), RequestMethod.POST, true); + RudderLogger.logInfo(String.format(Locale.US, "CloudModeManager: cloudModeProcessor: ServerResponse: %d", result.statusCode)); + if (result.status == NetworkResponses.SUCCESS) { + ReportManager.incrementCloudModeUploadSuccessCounter(messageIds.size()); + cleanUpEvents(messageIds); + exponentialBackOff.resetBackOff(); + upTimeInMillis = Utils.getUpTimeInMillis(); + sleepCount = Utils.getSleepDurationInSecond(upTimeInMillis, Utils.getUpTimeInMillis()); + } else { + incrementCloudModeUploadRetryCounter(1); + } } else { - incrementCloudModeUploadRetryCounter(1); + cleanUpEvents(messageIds); } - } else { - cleanUpEvents(messageIds); } } - } - RudderLogger.logDebug(String.format(Locale.US, "CloudModeManager: cloudModeProcessor: SleepCount: %d", sleepCount)); - try { + RudderLogger.logDebug(String.format(Locale.US, "CloudModeManager: cloudModeProcessor: SleepCount: %d", sleepCount)); if (result == null) { RudderLogger.logDebug("CloudModeManager: cloudModeProcessor: Sleeping for next: " + config.getEventDispatchSleepInterval() + "ms"); Thread.sleep(config.getEventDispatchSleepInterval()); @@ -107,6 +107,10 @@ public void run() { ReportManager.reportError(ex); RudderLogger.logError(String.format("CloudModeManager: cloudModeProcessor: Exception while trying to send events to Data plane URL %s due to %s", config.getDataPlaneUrl(), ex.getLocalizedMessage())); Thread.currentThread().interrupt(); + } catch (OutOfMemoryError e) { + RudderLogger.logError("CloudModeManager: cloudModeProcessor: Out of memory error occurred while trying to send events to Data plane URL " + config.getDataPlaneUrl()); + // sleeping the thread for 1s to avoid continuous loop after OOM. + Utils.sleep(1000); } } } diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/util/Utils.java b/core/src/main/java/com/rudderstack/android/sdk/core/util/Utils.java index 124be4016..a4e9a1653 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/util/Utils.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/util/Utils.java @@ -347,4 +347,13 @@ public static String getTimeInReadableFormat(long timeInMillis) { return timeInReadableFormat.toString(); } + + public static void sleep(long timeInMillis) { + try { + Thread.sleep(timeInMillis); + } catch (InterruptedException ex) { + ReportManager.reportError(ex); + Thread.currentThread().interrupt(); + } + } } From b8f9b1bf7c46bad5939c0ba41d10ce794b801863 Mon Sep 17 00:00:00 2001 From: Vishal Gupta Date: Fri, 6 Dec 2024 15:59:31 +0530 Subject: [PATCH 5/9] refactor: change log message for out of memory error --- .../rudderstack/android/sdk/core/RudderCloudModeManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/RudderCloudModeManager.java b/core/src/main/java/com/rudderstack/android/sdk/core/RudderCloudModeManager.java index 97cd73b19..3378d6069 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/RudderCloudModeManager.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/RudderCloudModeManager.java @@ -108,7 +108,7 @@ public void run() { RudderLogger.logError(String.format("CloudModeManager: cloudModeProcessor: Exception while trying to send events to Data plane URL %s due to %s", config.getDataPlaneUrl(), ex.getLocalizedMessage())); Thread.currentThread().interrupt(); } catch (OutOfMemoryError e) { - RudderLogger.logError("CloudModeManager: cloudModeProcessor: Out of memory error occurred while trying to send events to Data plane URL " + config.getDataPlaneUrl()); + RudderLogger.logError(String.format("CloudModeManager: cloudModeProcessor: Out of memory error: %s occurred while trying to send events to Data plane URL: %s", e.getLocalizedMessage(), config.getDataPlaneUrl())); // sleeping the thread for 1s to avoid continuous loop after OOM. Utils.sleep(1000); } From 110b3c72125e16f62a0b3b032c62defc1280c6f2 Mon Sep 17 00:00:00 2001 From: Abhishek Pandey <64667840+1abhishekpandey@users.noreply.github.com> Date: Mon, 9 Dec 2024 16:27:27 +0530 Subject: [PATCH 6/9] chore: correct `alias` api by adding previousId argument in the middle (#489) * chore: correct `alias` api * chore: update doc for the alias api --- .../com/rudderstack/android/sdk/core/RudderClient.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/RudderClient.java b/core/src/main/java/com/rudderstack/android/sdk/core/RudderClient.java index 056ee063d..cb5256658 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/RudderClient.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/RudderClient.java @@ -471,18 +471,17 @@ public void alias(String newId) { } public void alias(@NonNull String newId, @Nullable RudderOption option) { - alias(newId, option, null); + alias(newId, null, option); } /** * Alias call * - * Segment compatible API - * * @param newId New userId for the user + * @param previousId Previous userId for the user * @param option RudderOptions for this event */ - public void alias(@NonNull String newId, @Nullable RudderOption option, @Nullable String previousId) { + public void alias(@NonNull String newId, @Nullable String previousId, @Nullable RudderOption option) { RudderContext context = getRudderContext(); Map traits = null; if (context != null) { From 57a07cdc750de5a7439ab3ddac3eacd5ce3dfccf Mon Sep 17 00:00:00 2001 From: GitHub actions Date: Mon, 9 Dec 2024 10:59:53 +0000 Subject: [PATCH 7/9] chore(release): 1.26.0 --- CHANGELOG.md | 13 +++++++++++++ gradle.properties | 4 ++-- package.json | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44425c2d8..5e211dac2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [1.26.0](https://github.com/rudderlabs/rudder-sdk-android/compare/v1.25.0...v1.26.0) (2024-12-09) + + +### Features + +* add alias api with previousId support ([#485](https://github.com/rudderlabs/rudder-sdk-android/issues/485)) ([179c262](https://github.com/rudderlabs/rudder-sdk-android/commit/179c26276d9c875d9ebeec6d8ed8d3c105bc805a)) + + +### Bug Fixes + +* handle db crash issue on Amazon devices ([#480](https://github.com/rudderlabs/rudder-sdk-android/issues/480)) ([db717d3](https://github.com/rudderlabs/rudder-sdk-android/commit/db717d35ff4aaf475d81c0472202f083e8c7c1bb)) +* handle invalid json issue ([#486](https://github.com/rudderlabs/rudder-sdk-android/issues/486)) ([4579fc2](https://github.com/rudderlabs/rudder-sdk-android/commit/4579fc2e936957ece459e6541c290a2bc2a9c6ac)) + ### [1.25.1](https://github.com/rudderlabs/rudder-sdk-android/compare/v1.25.0...v1.25.1) (2024-10-14) diff --git a/gradle.properties b/gradle.properties index 1cf78dc55..0ac17d795 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,8 +5,8 @@ android.enableJetifier=true android.enableR8.fullMode=true kotlin.code.style=official GROUP=com.rudderstack.android.sdk -VERSION_CODE=33 -VERSION_NAME=1.25.1 +VERSION_CODE=34 +VERSION_NAME=1.26.0 POM_NAME=Rudderstack SDK for android POM_DESCRIPTION=Rudderstack SDK for android POM_ARTIFACT_ID=core diff --git a/package.json b/package.json index 248e5a8be..a63dac7b9 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "1.25.1", + "version": "1.26.0", "dependencies": { "properties-reader": "^2.2.0" } From 8a144eff0cc844a9bc4619daa727088a1ad18b3d Mon Sep 17 00:00:00 2001 From: Abhishek Pandey <64667840+1abhishekpandey@users.noreply.github.com> Date: Mon, 9 Dec 2024 11:54:55 +0530 Subject: [PATCH 8/9] chore: remove previous release changelog --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e211dac2..13071133c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,6 @@ All notable changes to this project will be documented in this file. See [standa ### Bug Fixes -* handle db crash issue on Amazon devices ([#480](https://github.com/rudderlabs/rudder-sdk-android/issues/480)) ([db717d3](https://github.com/rudderlabs/rudder-sdk-android/commit/db717d35ff4aaf475d81c0472202f083e8c7c1bb)) * handle invalid json issue ([#486](https://github.com/rudderlabs/rudder-sdk-android/issues/486)) ([4579fc2](https://github.com/rudderlabs/rudder-sdk-android/commit/4579fc2e936957ece459e6541c290a2bc2a9c6ac)) ### [1.25.1](https://github.com/rudderlabs/rudder-sdk-android/compare/v1.25.0...v1.25.1) (2024-10-14) From 657523344b0b48f991c6315fd166c394850af358 Mon Sep 17 00:00:00 2001 From: Abhishek Pandey <64667840+1abhishekpandey@users.noreply.github.com> Date: Mon, 9 Dec 2024 12:00:03 +0530 Subject: [PATCH 9/9] chore: add missing doc for OutOfMemoryError --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13071133c..6b12d9dc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. See [standa ### Bug Fixes +* catch OutOfMemoryError in RudderCloudModeManager ([#487](https://github.com/rudderlabs/rudder-sdk-android/issues/487)) ([0b3759e](https://github.com/rudderlabs/rudder-sdk-android/commit/0b3759e66ab93894932d0b20f14d848d50030d81)) * handle invalid json issue ([#486](https://github.com/rudderlabs/rudder-sdk-android/issues/486)) ([4579fc2](https://github.com/rudderlabs/rudder-sdk-android/commit/4579fc2e936957ece459e6541c290a2bc2a9c6ac)) ### [1.25.1](https://github.com/rudderlabs/rudder-sdk-android/compare/v1.25.0...v1.25.1) (2024-10-14)