From 4b912b9036ecf39bba006f0afc7e98865501429a Mon Sep 17 00:00:00 2001 From: frank Date: Wed, 23 Apr 2025 10:27:14 +0800 Subject: [PATCH 1/7] feat: implement low memory mode handling in MainApplication and StatusPackage * Add methods to handle low memory events in MainApplication * Emit device events for low memory and trim memory notifications * Introduce switchToLowMemoryMode in StatusPackage to manage backend requests --- .../im/status/ethereum/MainApplication.kt | 73 ++++++++++++++----- .../status/ethereum/module/StatusPackage.kt | 11 +++ 2 files changed, 64 insertions(+), 20 deletions(-) diff --git a/android/app/src/main/java/im/status/ethereum/MainApplication.kt b/android/app/src/main/java/im/status/ethereum/MainApplication.kt index 8963c19a510..708d68bbd53 100644 --- a/android/app/src/main/java/im/status/ethereum/MainApplication.kt +++ b/android/app/src/main/java/im/status/ethereum/MainApplication.kt @@ -6,39 +6,41 @@ import com.facebook.react.PackageList import com.facebook.react.ReactApplication import com.facebook.react.ReactNativeHost import com.facebook.react.ReactPackage -import com.facebook.react.bridge.JSIModulePackage -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint +import com.facebook.react.bridge.Arguments +import com.facebook.react.bridge.ReactContext +import com.facebook.react.bridge.WritableMap +import com.facebook.react.modules.core.DeviceEventManagerModule import com.facebook.react.modules.network.OkHttpClientProvider import com.reactnativenavigation.NavigationApplication import com.reactnativenavigation.react.NavigationReactNativeHost +import com.facebook.react.bridge.JSIModulePackage +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint import cl.json.RNSharePackage import com.reactnativecommunity.blurview.BlurViewPackage import im.status.ethereum.keycard.RNStatusKeycardPackage +import im.status.ethereum.module.StatusBackendClient import im.status.ethereum.module.StatusPackage import im.status.ethereum.pushnotifications.PushNotificationPackage import im.status.ethereum.StatusOkHttpClientFactory +import org.json.JSONObject +import android.content.ComponentCallbacks2 class MainApplication : NavigationApplication() { private val mReactNativeHost = object : NavigationReactNativeHost(this) { - override fun getUseDeveloperSupport(): Boolean { - return BuildConfig.DEBUG - } + override fun getUseDeveloperSupport() = BuildConfig.DEBUG override fun getPackages(): List = PackageList(this).packages.apply { - // Packages that cannot be autolinked yet can be added manually here - add(StatusPackage(RootUtil.isDeviceRooted())) - add(RNStatusKeycardPackage()) - add(PushNotificationPackage()) - add(BlurViewPackage()) - } - - override fun getJSMainModuleName(): String = "index" - - override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + add(StatusPackage(RootUtil.isDeviceRooted())) + add(RNStatusKeycardPackage()) + add(PushNotificationPackage()) + add(BlurViewPackage()) + } - override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED + override fun getJSMainModuleName() = "index" + override val isNewArchEnabled = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + override val isHermesEnabled = BuildConfig.IS_HERMES_ENABLED } override val reactNativeHost: ReactNativeHost @@ -46,14 +48,45 @@ class MainApplication : NavigationApplication() { override fun onCreate() { super.onCreate() - OkHttpClientProvider.setOkHttpClientFactory(StatusOkHttpClientFactory()) - WebView.setWebContentsDebuggingEnabled(BuildConfig.DEBUG_WEBVIEW == "1") - if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { - // If you opted-in for the New Architecture, we load the native entry point for this app. DefaultNewArchitectureEntryPoint.load() } } + + override fun onLowMemory() { + super.onLowMemory() + StatusPackage.switchToLowMemoryMode() + emitEvent(ComponentCallbacks2.TRIM_MEMORY_COMPLETE) + } + + override fun onTrimMemory(level: Int) { + super.onTrimMemory(level) + if (level !in arrayOf( + ComponentCallbacks2.TRIM_MEMORY_BACKGROUND, + ComponentCallbacks2.TRIM_MEMORY_MODERATE, + ComponentCallbacks2.TRIM_MEMORY_COMPLETE + )) { + return + } + StatusPackage.switchToLowMemoryMode() + emitEvent(level) + } + + private fun emitEvent(level: Int) { + val data = Arguments.createMap().apply { putInt("level", level) } + // we can handle this event in src/status_im/common/signals/events.cljs with function process if we want to + val jsonEvent = JSONObject().apply { + put("type", "system.low-memory") + put("data", data) + } + val params = Arguments.createMap().apply { putString("jsonEvent", jsonEvent.toString()) } + getCurrentReactContext() + ?.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) + ?.emit("gethEvent", params) + } + + private fun getCurrentReactContext(): ReactContext? = + reactNativeHost.reactInstanceManager.currentReactContext } diff --git a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusPackage.kt b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusPackage.kt index fb8220c0b66..9d46fe20879 100644 --- a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusPackage.kt +++ b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusPackage.kt @@ -15,6 +15,17 @@ class StatusPackage(private val rootedDevice: Boolean) : ReactPackage { requestBody = "", statusgoFunction = { Statusgo.imageServerTLSCert() } ) + + fun switchToLowMemoryMode() { + // use pool to execute the request to avoid android.os.NetworkOnMainThreadException + StatusThreadPoolExecutor.getInstance().execute { + StatusBackendClient.executeStatusGoRequest( + endpoint = "SwitchToLowMemoryMode", + requestBody = "", + statusgoFunction = { Statusgo.switchToLowMemoryMode() } + ) + } + } } override fun createNativeModules(reactContext: ReactApplicationContext): List { From 1178a65fc7ca654c42387c857eb91b94e4128061 Mon Sep 17 00:00:00 2001 From: frank Date: Wed, 23 Apr 2025 15:23:15 +0800 Subject: [PATCH 2/7] chore: update status-go version https://github.com/status-im/status-go/compare/40936e1b...1f778506 --- status-go-version.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/status-go-version.json b/status-go-version.json index fc8d3c4bbfa..98f0c9fb981 100644 --- a/status-go-version.json +++ b/status-go-version.json @@ -3,7 +3,7 @@ "_comment": "Instead use: scripts/update-status-go.sh ", "owner": "status-im", "repo": "status-go", - "version": "v10.27.0", - "commit-sha1": "f5fe88d8b31a287e66a48fe90ef613c7617279b6", - "src-sha256": "01cn2f9f3sq5dmygh4gqpip5zp9f61383xix7rfwxr2nazbqrka3" + "version": "frank/chore/low-memory", + "commit-sha1": "1f7785067fff96c8d71e1eb1e6c572fc53ff0d4e", + "src-sha256": "1vi8bds8vb96vwc3wdv999q8jaq1vsn5bsmlmlk05f5v7qfjbr3s" } From 928ebb7052af17c4cfa225d7812753ce9e27ced9 Mon Sep 17 00:00:00 2001 From: frank Date: Thu, 24 Apr 2025 10:26:26 +0800 Subject: [PATCH 3/7] feat: add logging for low memory events in MainApplication --- .../app/src/main/java/im/status/ethereum/MainApplication.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/android/app/src/main/java/im/status/ethereum/MainApplication.kt b/android/app/src/main/java/im/status/ethereum/MainApplication.kt index 708d68bbd53..186f159d406 100644 --- a/android/app/src/main/java/im/status/ethereum/MainApplication.kt +++ b/android/app/src/main/java/im/status/ethereum/MainApplication.kt @@ -24,6 +24,7 @@ import im.status.ethereum.pushnotifications.PushNotificationPackage import im.status.ethereum.StatusOkHttpClientFactory import org.json.JSONObject import android.content.ComponentCallbacks2 +import android.util.Log class MainApplication : NavigationApplication() { @@ -57,12 +58,14 @@ class MainApplication : NavigationApplication() { override fun onLowMemory() { super.onLowMemory() + Log.i("MainApplication", "onLowMemory called") StatusPackage.switchToLowMemoryMode() emitEvent(ComponentCallbacks2.TRIM_MEMORY_COMPLETE) } override fun onTrimMemory(level: Int) { super.onTrimMemory(level) + Log.i("MainApplication", "onTrimMemory called with level: $level") if (level !in arrayOf( ComponentCallbacks2.TRIM_MEMORY_BACKGROUND, ComponentCallbacks2.TRIM_MEMORY_MODERATE, From 0828e6c4aa9c123dab332d9d86aa40fd30f47e5d Mon Sep 17 00:00:00 2001 From: frank Date: Fri, 9 May 2025 20:16:39 +0800 Subject: [PATCH 4/7] feat_: log historical process exit reasons in MainApplication * Implement logging of the last five historical process exit reasons on devices running Android R and above. * Handle cases where no exit reasons are found and log relevant details for each exit reason, including process name, reason, timestamp, and memory usage. --- .../im/status/ethereum/MainApplication.kt | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/android/app/src/main/java/im/status/ethereum/MainApplication.kt b/android/app/src/main/java/im/status/ethereum/MainApplication.kt index 186f159d406..b5dc8098e68 100644 --- a/android/app/src/main/java/im/status/ethereum/MainApplication.kt +++ b/android/app/src/main/java/im/status/ethereum/MainApplication.kt @@ -25,6 +25,10 @@ import im.status.ethereum.StatusOkHttpClientFactory import org.json.JSONObject import android.content.ComponentCallbacks2 import android.util.Log +import android.app.ActivityManager +import android.content.Context +import android.os.Build +import android.os.Process class MainApplication : NavigationApplication() { @@ -54,6 +58,8 @@ class MainApplication : NavigationApplication() { if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { DefaultNewArchitectureEntryPoint.load() } + + logHistoricalProcessExitReasons() } override fun onLowMemory() { @@ -92,4 +98,40 @@ class MainApplication : NavigationApplication() { private fun getCurrentReactContext(): ReactContext? = reactNativeHost.reactInstanceManager.currentReactContext + + private fun logHistoricalProcessExitReasons() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + try { + val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager + val exitReasons = activityManager.getHistoricalProcessExitReasons(packageName, 0, 5) + + if (exitReasons.isEmpty()) { + Log.i("MainApplication", "No historical process exit reasons found") + return + } + + Log.e("MainApplication", "Historical process exit reasons (last 5):") + exitReasons.forEachIndexed { index, reason -> + Log.e("MainApplication", "Exit reason #${index + 1}:") + Log.e("MainApplication", " Process: ${reason.processName}") + Log.e("MainApplication", " Reason: ${reason.reason}") + Log.e("MainApplication", " Timestamp: ${reason.timestamp}") + Log.e("MainApplication", " Description: ${reason.description}") + if (reason.importance > 0) { + Log.e("MainApplication", " Importance: ${reason.importance}") + } + if (reason.pss > 0) { + Log.e("MainApplication", " PSS: ${reason.pss} KB") + } + if (reason.rss > 0) { + Log.e("MainApplication", " RSS: ${reason.rss} KB") + } + } + } catch (e: Exception) { + Log.e("MainApplication", "Error getting historical process exit reasons", e) + } + } else { + Log.i("MainApplication", "Historical process exit reasons not available on this Android version") + } + } } From 793fd0b75d9517aada46323b7d839cd2143c98f9 Mon Sep 17 00:00:00 2001 From: frank Date: Mon, 19 May 2025 17:07:41 +0800 Subject: [PATCH 5/7] chore: update commit and source SHA256 in status-go version --- status-go-version.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/status-go-version.json b/status-go-version.json index 98f0c9fb981..9b293ed9608 100644 --- a/status-go-version.json +++ b/status-go-version.json @@ -4,6 +4,6 @@ "owner": "status-im", "repo": "status-go", "version": "frank/chore/low-memory", - "commit-sha1": "1f7785067fff96c8d71e1eb1e6c572fc53ff0d4e", - "src-sha256": "1vi8bds8vb96vwc3wdv999q8jaq1vsn5bsmlmlk05f5v7qfjbr3s" + "commit-sha1": "6f8401f5dd165a0fb0dbb544afd614d4313b0530", + "src-sha256": "1nq5345az2mkszz2agix8bmxgmh6ih0nb71amml6jmismxrkrpqd" } From 3fe1b2e0842a40a0a4a4818f7914429e7787b4d1 Mon Sep 17 00:00:00 2001 From: frank Date: Mon, 19 May 2025 20:15:37 +0800 Subject: [PATCH 6/7] chore_: rename to releaseOSMemory --- .../app/src/main/java/im/status/ethereum/MainApplication.kt | 4 ++-- .../main/java/im/status/ethereum/module/StatusPackage.kt | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/android/app/src/main/java/im/status/ethereum/MainApplication.kt b/android/app/src/main/java/im/status/ethereum/MainApplication.kt index b5dc8098e68..f8cde1c7ef4 100644 --- a/android/app/src/main/java/im/status/ethereum/MainApplication.kt +++ b/android/app/src/main/java/im/status/ethereum/MainApplication.kt @@ -65,7 +65,7 @@ class MainApplication : NavigationApplication() { override fun onLowMemory() { super.onLowMemory() Log.i("MainApplication", "onLowMemory called") - StatusPackage.switchToLowMemoryMode() + StatusPackage.releaseOSMemory() emitEvent(ComponentCallbacks2.TRIM_MEMORY_COMPLETE) } @@ -79,7 +79,7 @@ class MainApplication : NavigationApplication() { )) { return } - StatusPackage.switchToLowMemoryMode() + StatusPackage.releaseOSMemory() emitEvent(level) } diff --git a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusPackage.kt b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusPackage.kt index 9d46fe20879..da66950189f 100644 --- a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusPackage.kt +++ b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusPackage.kt @@ -16,13 +16,13 @@ class StatusPackage(private val rootedDevice: Boolean) : ReactPackage { statusgoFunction = { Statusgo.imageServerTLSCert() } ) - fun switchToLowMemoryMode() { + fun releaseOSMemory() { // use pool to execute the request to avoid android.os.NetworkOnMainThreadException StatusThreadPoolExecutor.getInstance().execute { StatusBackendClient.executeStatusGoRequest( - endpoint = "SwitchToLowMemoryMode", + endpoint = "ReleaseOSMemory", requestBody = "", - statusgoFunction = { Statusgo.switchToLowMemoryMode() } + statusgoFunction = { Statusgo.releaseOSMemory() } ) } } From b9ab48b4f7453c4170010c02c5b449d41cf0982c Mon Sep 17 00:00:00 2001 From: frank Date: Tue, 20 May 2025 18:41:31 +0800 Subject: [PATCH 7/7] chore_: rebase --- status-go-version.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/status-go-version.json b/status-go-version.json index 9b293ed9608..408b53cd179 100644 --- a/status-go-version.json +++ b/status-go-version.json @@ -4,6 +4,6 @@ "owner": "status-im", "repo": "status-go", "version": "frank/chore/low-memory", - "commit-sha1": "6f8401f5dd165a0fb0dbb544afd614d4313b0530", - "src-sha256": "1nq5345az2mkszz2agix8bmxgmh6ih0nb71amml6jmismxrkrpqd" + "commit-sha1": "e174de44cdda9edc5aa665321bfae0a2d0cd1b47", + "src-sha256": "1vdffn4pvk1mmf1kq1qlcxq03hw6n8367a02izskkpbhbiacv8rn" }